问题
I've converted a Facebook app from FBML to iFrame (with PHP SDK) and now have vertical scrollbars displayed for the same amount of content I had before (a logo, a flash game and a line with 3 links below). But earlier I didn't have any scrollbars.
If I set the app setting Auto-Resize, then the lower part of content isn't displayed at all - which is bad, the flash game is unplayable then.
I've searched around and all suggested solutions involve Javascript, but I'm actually using PHP SDK. Isn't there a solution for PHP/CSS only?
Below my current code:
<?php
require_once('facebook.php');
define('FB_API_ID', 'XXX');
define('FB_AUTH_SECRET', 'XXX');
$facebook = new Facebook(array(
'appId' => FB_API_ID,
'secret' => FB_AUTH_SECRET,
'cookie' => true,
));
if (! $facebook->getSession()) {
printf('<script type="text/javascript">top.location.href="%s";</script>',
$facebook->getLoginUrl(
array('canvas' => 1,
'fbconnect' => 0,
#'req_perms' => 'user_location',
)));
exit();
} else {
try {
$me = $facebook->api('/me');
$first_name = $me['first_name'];
$city = $me['location']['name'];
$female = ($me['gender'] == 'male' ? 0 : 1);
$avatar = 'http://graph.facebook.com/' . $me['id'] . '/picture?type=large';
} catch (FacebookApiException $e) {
exit('Facebook error: ' . $e);
}
}
# print the logo, the flash game and 3 links
?>
Also I'm not sure if my PHP-script is supposed to print
<html>
<body>
.....
</body>
</html>
? Currently I only print what's inside the body.
And I wonder if it is a good idea to replace top.location.href=.... in my code by PHP's header('Location: ....');?
回答1:
If you are going to use the Asynchronous method, it's recommended that you put as much of FB code within it. Something like the below should work:
<html>
<head>
</head>
<body>
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({appId: 'your app id', status: true, cookie: true,
xfbml: true});
FB.Canvas.setSize();
};
function sizeChangeCallback() {
FB.Canvas.setSize();
}
(function() {
var e = document.createElement('script'); e.async = true;
e.src = document.location.protocol +
'//connect.facebook.net/en_US/all.js';
document.getElementById('fb-root').appendChild(e);
}());
</script>
</body>
</html>
Now you will call the sizeChangeCallback()
function whenever you make a change to the layout (clicking new tab, loading Ajax content...etc).
回答2:
Ok, I've found the solution:
<html>
<head>
<script type="text/javascript">
window.fbAsyncInit = function() {
FB.Canvas.setSize();
}
function sizeChangeCallback() {
FB.Canvas.setSize();
}
</script>
</head>
<body>
......
<div id="fb-root"></div>
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
FB.init({
appId : '<?php print(FB_API_ID); ?>',
status : true,
cookie : true,
xfbml : true
});
</script>
</body>
</html>
and set IFrame Size to Auto-resize in the settings tab.
And header('Location: ' . $url); won't work for whatever reason.
回答3:
I just put together a quite extensive tutorial on my blog, also using the PHP-SDK. Besides getting rid of those scrollbars I also show how to create a Fan-Gate and a simple Share-Button. I hope I can help some of you guys with that:
http://net-bites.de/facebook/tutorial-how-to-create-facebook-iframe-pages-for-timeline-width-810px-with-fan-gate-and-share-button/
回答4:
My Sollution works every time! Make your body overflow hidden then before add this.
<div id="fb-root" class="fb_reset"><script async="" src="https://connect.facebook.net/en_US/all.js"></script></div>
<script type="text/javascript">
window.fbAsyncInit = function() {
FB.init({appId: '293887700673244', status: true, cookie: true, xfbml: true, oauth: true});
window.setTimeout(function() {
FB.Canvas.setAutoGrow(); }, 250);
};
(function() { var e = document.createElement('script');
e.async = true;
e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
document.getElementById('fb-root').appendChild(e); }());
</script>
来源:https://stackoverflow.com/questions/5928724/facebook-iframe-app-getting-rid-of-vertical-scrollbars