我们建立的应用框架已经自带了一个登陆页面。本节中,我们把这个页面转为一个名字为UserLogin的登陆模块。当用户未登录时将会在侧边栏出现。用户登陆后消失,同时先前开发的用户菜单项显示出来。

建立UserLogin类

像用户菜单模块一样。我们在blog/protected/components/UserLogin.php建立的UserLogin类,里面包含了用户登陆的逻辑处理,代码如下:

 
  1. <?php
  2. class UserLogin extends Portlet
  3. {
  4.     public $title='Login';
  5.  
  6.     protected function renderContent()
  7.     {
  8.         $form=new LoginForm;
  9.         if(isset($_POST['LoginForm']))
  10.         {
  11.             $form->attributes=$_POST['LoginForm'];
  12.             if($form->validate())
  13.                 $this->controller->refresh();
  14.         }
  15.         $this->render('userLogin',array('form'=>$form));
  16.     }
  17. }


renderContent()方法中的代码是从最初用Yiic工具建立的SiteController的actionLogin()方法处复制来的。我们主要修改显示userLogin视图时调用的render()方法。注意我们在这个方法里建立一个LoginForm类的对象。这个类展示了我们从用户表单收集来的用户输入。保存在/wwwroot/blog/protected/models/LoginForm.php文件中.当我们用Yiic生成应用框架时自动生成的

建立登陆视图

userLogin视图的内容几乎都是从SiteController的登陆action的视图复制来。保存在blog/protected/components/views/userLogin.php中,内容如下:

 
  1. <?php echo CHtml::beginForm(); ?>
  2. <div class="row">
  3. <?php echo CHtml::activeLabel($form,'username'); ?>
  4. <br/>
  5. <?php echo CHtml::activeTextField($form,'username') ?>
  6. <?php echo CHtml::error($form,'username'); ?>
  7. </div>
  8. <div class="row">
  9. <?php echo CHtml::activeLabel($form,'password'); ?>
  10. <br/>
  11. <?php echo CHtml::activePasswordField($form,'password') ?>
  12. <?php echo CHtml::error($form,'password'); ?>
  13. </div>
  14. <div class="row">
  15. <?php echo CHtml::activeCheckBox($form,'rememberMe'); ?>
  16. <?php echo CHtml::label('Remember me next time',CHtml::getActiveId($form,'rememberMe')); ?>
  17. </div>
  18. <div class="row">
  19. <?php echo CHtml::submitButton('Login'); ?>
  20. <p class="hint">You may login with <b>demo/demo</b></p>
  21. </div>
  22. <?php echo CHtml::endForm(); ?>

 

在登陆表单中,我们用显示了用户名和密码字段的输入框。用复选框指出用户的登录状态在用户的浏览器关闭后是否被记住。视图的变量$form,是从UserLogin::renderContent()的render()方法传递过来的

因为登陆表单模块(model)包含对输入变量的验证(像在文章模块中那样),当一个用户提交表单,模块要先检查变量的合法性。如果有错误,表单会用CHtml::error()把错误显示在对应的输入框附近。

使用登陆模块

像使用用户菜单模块一样,我们通过如下修改布局文件blog/protected/views/layouts/main.php来使用登陆模块

 
  1. ......
  2. <div id="sidebar">
  3.  
  4. <?php $this->widget('UserLogin',array('visible'=>Yii::app()->user->isGuest)); ?>
  5.  
  6. <?php $this->widget('UserMenu',array('visible'=>!Yii::app()->user->isGuest)); ?>
  7.  
  8. </div>
  9. ......

 

注意登陆模块和用户菜单模块相反,仅当用户未登录时可见。

测试登陆模块

可按照如下步骤测试登陆模块

  1. 打开地址 http://www.example.com/blog/index.php 如果用户没用登陆,则应该可以看到登录模块
  2. 不输入任何登陆信息,点击登陆按钮,我们应该能看到对应的错误提示
  3. 用正确的用户名密码登陆,当前页面会被刷新,登陆模块消失,显示出了用户菜单模块。
  4. 点击用户菜单里的注销按钮,我们将会看到用户菜单模块消失,用户登陆模块又显示出来了

总结

登录模块是遵循MVC设计模式的典型例子,它使用一个LoginForm模块来展示(represent 怎么翻译?)数据和逻辑规则。用用户登录的视图来显示用户界面,用UserLogin类(一个很小的controller)来协调模块和视图