絕對使用SDK。它的好處是它是一個在野外測試和使用的庫。永遠不會重建輪時,你不必(你會發現,你完成更多工作;))。
我最終什麼事在CI做的是Facebook的PHP SDK添加到我的圖書館目錄並更改Facebook
類__construct
功能是:
public function __construct()
{
$ci =& get_instance();
$this->setAppId($ci->config->item('fb_appId'));
$this->setApiSecret($ci->config->item('fb_secret'));
$this->setCookieSupport($ci->config->item('fb_cookie'));
$this->setBaseDomain($ci->config->item('fb_domain'));
$this->setFileUploadSupport($ci->config->item('fb_upload'));
}
然後,
- 我將以上所有鍵/值對添加到config/config.php
- 將facebook庫添加到自動載入列表
這項工作完成,我可以從任何地方通過$this->facebook
訪問FB API在我的應用程序。
說了這麼多,這是所有預先2.0,所以我不能完全肯定,如果需要(我使用Yii現在,這主要是爲什麼我不知道,如果變化是變化會是什麼需要:))。
希望有所幫助。
編輯:
按照要求,我最終加入UserModel
類(擴展Model
)。我支持多個登錄提供者,所以我不會發布整個事情。但是,這是它的要點:
class UserModel extends Model
{
private $m_user;
public function UserModel()
{
parent::Model();
$this->m_user = null;
$session = $this->facebook->getSession();
if($session)
{
if($this->facebook->api('/me') != null)
{
$this->m_user = $this->facebook->api('/me');
}
}
}
public function getUser()
{
return $this->m_user;
}
public function isLoggedIn()
{
return $this->getUser() != null;
}
// returns either the login or logout url for the given provider, relative to the
// state that the current user object is in
public function getActionUrl()
{
if($this->isLoggedIn())
{
return $this->facebook->getLogouturl();
}
else
{
return $this->facebook->getLoginUrl(array('next'=>currentUrl(), 'cancel'=>currentUrl(), 'req_perms'=>null, 'display'=>'popup'));
}
}
}
然後,我添加了一個登錄窗口小部件,它只是包含此:
<div id="header-login">
<!-- todo: this won't work with konqueror atm (fb script bugs) - check 'em out later -->
<?php if(!$user->isLoggedIn()): ?>
<fb:login-button perms="email"><?php echo lang('fb_login'); ?></fb:login-button>
<?php else: ?>
<a onclick="FB.logout();" class="fb_button fb_button_medium"><span class="fb_button_text">Logout</span></a>
<?php endif; ?>
</div>
第二個編輯:
對不起,它是一個而自從我寫這篇文章以來,所以我不得不回頭弄清楚它是如何實現的:P經過快速的grep,我發現我實際上並沒有在任何地方使用getActionUrl
。我添加了一些客戶端腳本來收聽FB登錄/註銷事件:
google.setOnLoadCallback(on_load);
google.load("jquery", "1.4.4");
window.fbAsyncInit = function() {
FB.init({appId: '[id]', status: true, cookie: true, xfbml: true});
FB.Event.subscribe('auth.login', on_fb_login);
FB.Event.subscribe('auth.logout', on_fb_logout);
};
function on_load()
{
// force all anchors with the rel tag "ext" to open in an external window
// (replaces target= functionality)
$('a[rel="ext"]').click(function(){
window.open(this.href);
return false;
});
}
function on_fb_login()
{
location.reload();
}
function on_fb_logout()
{
location.reload();
}
爲什麼不使用Facebook PHP SDK? https://github.com/facebook/php-sdk/ – 2011-03-26 02:05:43
@Russel我使用笨,不知道這將是多麼容易整合。通過這種方法使用SDK有什麼特別的優勢嗎? – 2011-03-26 02:07:29
不知道CI,但是,在Kohana中,您可以通過將其放置在供應商文件夾中來輕鬆添加*供應商*代碼。也許CI有類似的東西。至於優點,這是一個開源,經過嘗試和測試的系統,被許多人所使用。因此它將比定製的實現更強大和更安全。 – 2011-03-26 04:16:34