解決發佈的代碼在底部Yii的檢查,如果登錄到Facebook的每一頁
我終於得到這個工作,但說實話我想我這樣做完全以錯誤的。
我想要什麼:
我想,如果一個用戶登錄到通過Facebook網站得到我的網站上的檢查。這必須每頁完成一次,導致網站的某些部分只有在您登錄時纔可訪問。另外,我想將Facebook的數據放入我的數據庫。
我得到了什麼:
在我能夠檢查每一頁上如果用戶通過Facebook登錄到我的網站的時刻。我確實通過改變SiteController.php
中的init()
函數來實現這個工作。
此函數現在看起來是這樣的:
public function init() {
global $facebookID; // Create global Facebook ID
global $loginURL; // Create global URL for login
$currentURL = 'http://dev03.***.nl/app/facebook-popup.php'; // facebook popup url
//Get Facebook ID if FacebookID isn't there the result is 0
$facebookID = Yii::app()->facebook->getUser();
if(!$facebookID){
//If there isn't an Facebook ID
$loginURL = Yii::app()->facebook->getLoginUrl(array(
'scope' => 'read_insights, publish_actions, manage_pages',
'display' => 'popup',
'next' => $currentURL . '?loginsucc=1',
'cancel_url' => $currentURL . '?cancel=1'
));
}
}
問題:
最大的問題是,我的網站加載時間擴大,但我不知道如何得到這個工作其他方式。我猜測我可以把這個測試變成一個更加負載的時間友好的方式。
我的問題:
我將如何能夠減少加載時間和程序的正確方法。我是否可以將它作爲一個函數,以便如果我切換到某些頁面,則會檢查用戶是否通過Facebook登錄並顯示結果中的某些頁面。
我的第二個問題:
在我在我的意見/佈局檢查力矩/ main.php如果全球facebookID爲空或不顯示Facebook的個人資料圖片或登錄按鈕方式如下:
<?php if ($GLOBALS['facebookID']) { ?>
<img src="https://graph.facebook.com/<?php echo $GLOBALS['facebookID'] ?>/picture"/>
<?php } else{ ?>
<a href="#" onclick="login();return false;">
<div id="login_facebook">
<img src="<?php echo Yii::app()->theme->baseUrl?>/images/buttons/facebook.png" alt="Facebook logo">
<p>login met Facebook</p>
</div><!-- #login_facebook -->
</a>
<?php } ?>
如果我得到它檢查這對我來說我猜加載時間也將減少,或者這是把if語句中佈局的唯一途徑的功能?
我知道這是一個很大的問題,但我對Yii有點新,我希望你們中的一些人會花時間幫助我。
SOLUTION
有了非常感謝@DarkMukke我能解決這個問題。我改變了一些東西,也許做了一些不完美的方式。但現在對我來說工作正常。
首先,我改變了我對用戶身份驗證的整體思考,並刪除了全局變量。在這一刻,唯一的首先檢查web應用程序是如果我們有一個facebookID和一個用戶。這是爲了防止用戶在Facebook中刪除權限但仍然登錄到應用程序並獲得用戶狀態時的訪問。這是通過下面的代碼完成:
保護/組件/ Controller.php這樣
public function init() {
$facebookID = Yii::app()->facebook->getUser();
if(!$facebookID && Yii::app()->user->getState('role') == 'user'){
Yii::app()->user->setState('role', 'guest');
}
}
所以$facebookID
我們存儲用戶的facebookID,如果用戶已撤銷存取權限,然後$facebookID
是空的。因此,我們檢查用戶是否獲得了角色'user'
以及Facebook ID是否爲空。如果是這樣,用戶需要獲得'guest'
的角色。
然後登錄問題,而不是使用主控制器爲此,我決定做一個新的控制器。我把這個受保護/控制器/ FacebookController.php,它看起來像這樣:
class FacebookController extends Controller {
public function actionLogin() {
$facebookID = Yii::app()->facebook->getUser();
$accessToken = Yii::app()->facebook->getAccessToken();
$loginUrl = Yii::app()->facebook->getLoginUrl(array('scope' => 'read_insights, publish_actions, manage_pages, email', 'display' => 'popup', 'redirect_uri' => 'http://dev03.****.nl/app/facebook-popup.php'));
if($facebookID == 0) {
echo '<script>
window.location="'.$loginUrl.'"
</script>';
} else {
$record = Users::model()->findByAttributes(array('FB_id'=>$facebookID));
if($record===null) {
$userInfo = Yii::app()->facebook->api('/me');
$user = new Users;
$user->firstname = $userInfo['first_name'];
$user->surname = $userInfo['last_name'];
$user->city = $userInfo['location']['name'];
$user->email = $userInfo['email'];
$user->FB_id = $userInfo['id'];
$user->save();
}
Yii::app()->user->setState('role', 'user');
Yii::app()->user->setState('FBid', $facebookID);
echo "<script>
window.close();
window.opener.location.reload();
</script>";
}
}
}
請注意,我通過Javascript調用這個函數在彈出
那麼這樣做是:
首先,獲取Facebook ID,獲取訪問令牌和登錄網址。
然後我們檢查我們是否有Facebook的身份證,如果沒有更改彈出窗口的位置到Facebook的登錄網址。這將打開對話框以獲取訪問權限以及在getLoginUrl()
函數中'scope'
中描述的權限。
如果我們有權限,它會檢查我們是否有數據庫中的用戶。如果不是$record
是null
。然後我們得到用戶的信息api('/me')
並將其發佈到數據庫中。如果這樣做,我們繼續。
然後,我們將用戶的角色設置爲用戶,並在Facebook中添加一個名爲FBid的狀態,以便稍後在應用程序中使用。
當這一切完成後,我們關閉窗口。用戶已登錄。
你幫了很多,我發佈了最後的代碼在我的主要職位。 – Augus