The DoYouHaoBaby PHP Framework中文开发文档手册
Copyright(c) DoYouHaoBaby.NET All Rights Reserved.
[ 用户登录 ]

这里,我们将会为大家讲解一下,如何登录系统。首先,给大家介绍的是,我们这里使用简单的COOKIE验证当前是

否处于登录状态。我这里使用的user_login这个COOKIE值来验证,这个cookie值存在,表示已经登录,否则表示还

未登录。

我们要登录,第一步是判断是否处于登录状态,处于登录状态我们就不需要重复登录了。我们在公用控制器

InitController.class.php中将当前的登录信息获取出来。

代码如下:

  1. public function init__(){   
  2.   
  3.     parent::init__();   
  4.   
  5.     $arrUserData = $this->getCookieData( 'user_login' );   
  6.     if( empty( $arrUserData['user_id'] ) )   
  7.     $GLOBALS['___login___'] = false;   
  8.     else  
  9.     $GLOBALS['___login___'] = $arrUserData;   
  10.     unset( $arrUserData );   
  11.            
  12.     // 公用赋值   
  13.     $this->assign_();   
  14. }  


说明:init__是框架控制器的一个初始化方法,只要这个方法存在,那么这个方法就会被执行。这样可以用于初始

化一些公用数据的需要,比如说这里的登录信息等等。

代码的意思也很清楚,就是将登录信息保存全局变量中,这样我们后面就可以调用到。全局变量的好处就是,在网

站的任何地方都可以方便取出登录数据。


登录界面

在UserController中写下如下的代码:
  1. /**  
  2.  * 登录  
  3.  */  
  4.  public function login(){   
  5.            
  6.     // 判断是否已经登录   
  7.     if(  $GLOBALS['___login___']!==false  )   
  8.     $this->E( G::L( '你已经登录过了。' ) );   
  9.             
  10.     $this->display();   
  11. }  


说明:首先判断是否已经登录过了,登录过了就不需要重复登录,如果没有登录就会加载登录界面。
这里,根据框架惯性,这里会加载 user_login.html模板文件。

然后,我们在模板文件中加入user_login.html,记得要删除一遍TplFileIndex.inc.php(模板文件缓存)。
  1. <include file="public_header">       
  2.       
  3.     <div id="content_wrapper">       
  4.       <div id="content">       
  5.          <form name="form_user" id="form_user" action="{:G::U('user/check_login')}" method="post">       
  6.         
  7.   <fieldset>       
  8.     <p>       
  9.       <label for="user_name">用户名</label>       
  10.       <input type="text" name="user_name" id="user_name" />       
  11.     </p>       
  12.         
  13.     <p>       
  14.       <label for="user_password">密码</label>       
  15.       <input type="password" name="user_password" id="user_password" />       
  16.     </p>       
  17.         
  18.     <p>       
  19.       <input type="submit" name="Submit" value="登录" />       
  20.     </p>       
  21.         
  22.   </fieldset>       
  23.         
  24. </form>     
  25. <p>你可以返回首页,<a href="{:G::U( 'index/index' )}">返回首页</a> </p>   
  26.       </div>       
  27.       <include file="public_sidebar">       
  28.       
  29. <include file="public_footer">  


然后访问 http://localhost/wedoit/index.php/user/login,你会看到如下的界面:


接着,我们添加登录的逻辑处理代码,位于UserController.class.php中check_login方法:
  1. /**  
  2.   * 登录验证  
  3.   */  
  4.   public function check_login(){   
  5.              
  6.           // 取得登录用户信息   
  7.           $sUserName = Safe::getGpc( 'user_name','P' );   
  8.           $sPassword = Safe::getGpc( 'user_password','P' );   
  9.   
  10.           // 账号不能为空   
  11.           if( empty( $sUserName ) ) {   
  12.   
  13.               $this->E( G::L( '帐号或者E-mail不能为空!' ) );   
  14.           }   
  15.   
  16.           elseif ( empty( $sPassword ) ){   
  17.   
  18.               $this->E( G::L( '密码不能为空!' ) );   
  19.           }   
  20.   
  21.           // 检测是E-mail登录验证,还是帐号   
  22.           // 启动日常验证检测程序   
  23.           Check::RUN();   
  24.           if( Check::C( $sUserName,'email' ) ){   
  25.   
  26.               $bEmail = true;   
  27.               unset( $_POST['user_name'] );   
  28.           }   
  29.     
  30.           else{   
  31.   
  32.              $bEmail = false;   
  33.          }   
  34.   
  35.          // 登录验证   
  36.          // 这里还有一个参数为是否自动更新登录信息,默认开启   
  37.          // Rbac行为插件中的checkLogin( $sUsername, $sPassword,$bEmail=false, $bUpdateLogin = true )   
  38.          $oUser = UserModel::M()->checkLogin( $sUserName,$sPassword,$bEmail );   
  39.   
  40.          // 尝试获取行为插件验证错误消息,没有错误,表示验证通过   
  41.          if( UserModel::M()->isBehaviorError() ){   
  42.   
  43.              $this->E ( UserModel::M()->getBehaviorErrorMessage() );   
  44.          }   
  45.   
  46.          else{   
  47.     
  48.             // 开始模型中的错误,如果没有那么路过   
  49.             if( $oUser->isError( ) ){   
  50.   
  51.                 $this->E( $oUser->getErrorMessage() );   
  52.             }   
  53.   
  54.             $this->setCookieData( 'user_login',$oUser->toArray(),86400  );   
  55.   
  56.             $this->assign( '__JumpUrl__',G::U( 'index/index' ) );   
  57. $this->assign( '__WaitSecond__',3 );   
  58.   
  59.             // 刚开始我们无法获取数据,因为刚开始验证完毕后,程序尚未从数据库获取用户登录   
  60.   
  61. 信息   
  62.             // 这里可以使用$arrUserData = $oUser->userData() 获取数据   
  63.             // 同样也可以使用$arrUserData = UserModel->userData()   
  64.             // 还可以直接使用全局变量, $arrUserData = $GLOBALS[ $this->getCookieData[ G::C(    
  65.   
  66. 'RBAC_DATA_PREFIX' ).'authkey' ] ];   
  67.             $this->S( G::L( 'Hello %s,你成功登录!','app',null,$sUserName ) );   
  68.       }   
  69.   
  70.    }  



这里,我们使用了框架的RBAC行为扩展插件,这里我们直接使用框架提供的登录验证方法来验证数据。
  1. UserModel::M()->checkLogin( $sUserName,$sPassword,$bEmail );  


我们使用如下代码来捕获模式扩展中可能遇到的错误:
  1. UserModel::M()->getBehaviorErrorMessage();  


如果,登录成功后,我们就发送cookie,表示登录成功了。
  1. $this->setCookieData( 'user_login',$oUser->toArray(),86400  );  


好了,逻辑代码就结束了。

首先,我们注册一个xiaoniuge,密码为123456来测试一下登录效果。

输入用户名和密码,然后点击“登录”,你会看到如下的效果。
如图2:


我们在首页,填上如下的代码:
  1. <div class="content_section divider">   
  2.           <h2>欢迎你来到我们的演示庭</h2>   
  3.           <p>我们我们将会带领大家开发一个简单的wedoit 在线任务管理器程序。 </p>   
  4.           {if $GLOBALS['___login___']===false}<p>你可以在这里注册一个用户,<a href="{:G::U(   
  5.  
  6. 'user/register' )}">注册</a> | <a href="{:G::U( 'user/login' )}">登录</a></p>   
  7.           {d*else}登录用户 | <a href="{:G::U( 'index/change_password?id='.$GLOBALS  
  8.  
  9. ['___login___']['user_id'] )}">{$GLOBALS['___login___']['user_name']}</a> <a href="{:G::U(   
  10.  
  11. 'user/logout' )}">注销</a> | <a href="{:G::U( 'index/add' )}">添加任务</a> {/if}   
  12.         </div>  


然后,你就会看到如下的效果:
如图3:


好了,登录验证我们已经制作完毕,continue to end !