上面我們說過yii與discuz實現的通信,這里我們去研究下如何實現同步登陸,注冊,退出
說明:yii于discuz同步的前提有以下幾點:
當前主網站也discuz必須是新網站.
原因:根據ucenter提供的同步登陸方法uc_user_synlogin這里僅支持用戶的id,我們查看 表:前綴_members時,發現該表中只有用戶id即uid為主鍵的,ucenter不提供用戶名同步登陸方法,所以主網站和discuz必須是新的,如果不是新的,比如:主網站已經有部分用戶了,而論壇是后期上的,就會出現一系列問題,比如主網站登陸的時候需要先檢測論壇是否存在這個用戶,如果不存在這個用戶還需要先添加到論壇中,但是添加的時候,是需要uid,這里為了保證一致性,我設定的主網站id即為表前綴_members表中的uid,否則檢測不到數據,如果是先有論壇后有網站等也會出現一系列問題,這里就不做說明.
下面的代碼實例均是網站是新網站,discuz 論壇也是新的即,數據庫都是清空狀態.
登陸(yii系統自帶登陸方法):
1、找到,目錄:protected/controller/SiteController.php
找到actionLogin這個方法,具體代碼如下,覆蓋即可:
- public function actionLogin()
- {
- $model = new LoginForm;
- if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
- {
- echo CActiveForm::validate($model);
- Yii::app()->end();
- }
- if(isset($_POST['LoginForm']))
- {
- $model->attributes=$_POST['LoginForm'];
- if($model->validate() && $model->login()){
- Yii::import('application.vendor.ucenter.*');//引入文件夾
- include_once 'ucenter.php'; //引入文件
- $script = uc_user_synlogin(Yii::app()->user->id); //調用ucenter的通信代碼,大家可以去追蹤下代碼,最后追蹤到的代碼uc_server/control/user.php這里么,在這個函數中onsynlogin。我們可以看到最終返回的是引入的js文件,但是這里如果你打印或者輸出來$script是不顯示的,因為瀏覽器已經給轉義了,你可以查看源碼,即可看到js引入。
- echo "$script";//這里的echo是執行$script,如果你不寫執行則不會觸發這個$script;有好多地方這里寫的是$this->redirect("要跳轉的路徑");。但是我這樣寫的時候出現了問題,因為,上面的echo $script畢竟是js代碼,執行沒有$this->redirect的速度快,所以優先執行了這個,導致不能同步登陸。所以這里改成下面這種寫法,畢竟都是js,所以優先執行了上面的js引入。
- echo '《script type="text/javascript">window.location.href="'.Yii::app()->user->returnUrl.'";《/script>';
- Yii::app()->end();//終止程序,類似于exit 或者dir();
- } //Vevb.com
- }
- $this->render('login',array('model'=>$model));
- }
登陸(自定義登陸方法且是ajax情況,這個情況比較復雜),其他代碼都一樣,這里僅貼出主要代碼.
- //這里省略了ajax傳入這個頁面判定用戶信息是否是我們需要的用戶信息,且當前主網站有這個用戶
- Yii::import('application.vendor.*');
- include_once 'ucenter.php';
- $script = uc_user_synlogin($oneUser->id); //這里已經拿到js代碼了,但是沒法執行里面的代碼,不能像上面呢樣直接輸出,直接輸出我這里不能執行。
- $matches = '';
- $pattern ='';
- preg_match($pattern,$script,$matches);
- $url = $matches[1];//這里將src中的地址拿出來
- header("location:$url");//用header跳轉執行,我使用curl的時候也不能執行,暫時不知道是啥原因
- echo 1;//這里好像還必須輸出任意東西,不然還會出現一系列問題。但是理論上,上面的header已經跳走了,下面的echo 1應該是不執行的。確實是不執行的但是還必須有,這里就先不糾結了。
退出:
1、退出沒有實際的什么難點,主要還是和上面以上php比js優先執行的問題,注意這點就可以了,下面是實際代碼:
- public function actionLogout()
- {
- Yii::app()->user->logout();
- Yii::import('application.vendor.*');
- include_once 'ucenter.php';
- $script = uc_user_synlogout();
- echo $script;
- Yii::app()->end();
- }
新聞熱點
疑難解答