2013-01-09 11 views
0

解決發佈的代碼在底部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'中描述的權限。

如果我們有權限,它會檢查我們是否有數據庫中的用戶。如果不是$recordnull。然後我們得到用戶的信息api('/me')並將其發佈到數據庫中。如果這樣做,我們繼續。

然後,我們將用戶的角色設置爲用戶,並在Facebook中添加一個名爲FBid的狀態,以便稍後在應用程序中使用。

當這一切完成後,我們關閉窗口。用戶已登錄。

回答

1

很明顯,您對自己在做什麼有一些想法。所以讓我指出一些提示。

首先,如果您重寫SiteController中的init,則必須在每個新控制器中執行此操作,因此您最好覆蓋Controller中的init(),/ protected/components中的類,即每個控制器從默認情況下延伸,這樣它真的會在每一頁上。

第二個說明,全局變量是一個壞主意。它們可能看起來很有用,但它們很難調試。在我看來,全局變量應該從PHP的下一個版本中刪除。 所以這裏的正確方法是使用CWebuser->setState(),這樣你就可以檢查用戶是否登錄。這給你另一個有用的優勢。在第一次FB登錄時,用戶在自己的用戶表中創建一個用戶數據,對於UserIdentity,您只需使用FB檢查,然後使用該FBid集加載FBid ==記錄的記錄。

總之

所以,

  • 當人授權,在用戶表中創建一個記錄他們
  • 使用本機的用戶檢查,檢查是否與本地的cookie登錄
  • 如果不是登錄比較FacebookId對自己的記錄
  • 如果沒有記錄,嘗試使用Facebook授權他們彈出
  • 到處都有Facebook數據,使用CWebuser->setState(),在你的U serIdentity,不使用全局變量
+0

你幫了很多,我發佈了最後的代碼在我的主要職位。 – Augus