我们建立的应用框架已经自带了一个登陆页面。本节中,我们把这个页面转为一个名字为UserLogin的登陆模块。当用户未登录时将会在侧边栏出现。用户登陆后消失,同时先前开发的用户菜单项显示出来。
建立UserLogin类
像用户菜单模块一样。我们在blog/protected/components/UserLogin.php建立的UserLogin类,里面包含了用户登陆的逻辑处理,代码如下:
- <?php
- class UserLogin extends Portlet
- {
- public $title='Login';
- protected function renderContent()
- {
- $form=new LoginForm;
- if(isset($_POST['LoginForm']))
- {
- $form->attributes=$_POST['LoginForm'];
- if($form->validate())
- $this->controller->refresh();
- }
- $this->render('userLogin',array('form'=>$form));
- }
- }
renderContent()方法中的代码是从最初用Yiic工具建立的SiteController的actionLogin()方法处复制来的。我们主要修改显示userLogin视图时调用的render()方法。注意我们在这个方法里建立一个LoginForm类的对象。这个类展示了我们从用户表单收集来的用户输入。保存在/wwwroot/blog/protected/models/LoginForm.php文件中.当我们用Yiic生成应用框架时自动生成的
建立登陆视图
userLogin视图的内容几乎都是从SiteController的登陆action的视图复制来。保存在blog/protected/components/views/userLogin.php中,内容如下:
- <?php echo CHtml::beginForm(); ?>
- <div class="row">
- <?php echo CHtml::activeLabel($form,'username'); ?>
- <br/>
- <?php echo CHtml::activeTextField($form,'username') ?>
- <?php echo CHtml::error($form,'username'); ?>
- </div>
- <div class="row">
- <?php echo CHtml::activeLabel($form,'password'); ?>
- <br/>
- <?php echo CHtml::activePasswordField($form,'password') ?>
- <?php echo CHtml::error($form,'password'); ?>
- </div>
- <div class="row">
- <?php echo CHtml::activeCheckBox($form,'rememberMe'); ?>
- <?php echo CHtml::label('Remember me next time',CHtml::getActiveId($form,'rememberMe')); ?>
- </div>
- <div class="row">
- <?php echo CHtml::submitButton('Login'); ?>
- <p class="hint">You may login with <b>demo/demo</b></p>
- </div>
- <?php echo CHtml::endForm(); ?>
在登陆表单中,我们用显示了用户名和密码字段的输入框。用复选框指出用户的登录状态在用户的浏览器关闭后是否被记住。视图的变量$form,是从UserLogin::renderContent()的render()方法传递过来的
因为登陆表单模块(model)包含对输入变量的验证(像在文章模块中那样),当一个用户提交表单,模块要先检查变量的合法性。如果有错误,表单会用CHtml::error()把错误显示在对应的输入框附近。
使用登陆模块
像使用用户菜单模块一样,我们通过如下修改布局文件blog/protected/views/layouts/main.php来使用登陆模块
- ......
- <div id="sidebar">
- <?php $this->widget('UserLogin',array('visible'=>Yii::app()->user->isGuest)); ?>
- <?php $this->widget('UserMenu',array('visible'=>!Yii::app()->user->isGuest)); ?>
- </div>
- ......
注意登陆模块和用户菜单模块相反,仅当用户未登录时可见。
测试登陆模块
可按照如下步骤测试登陆模块
- 打开地址 http://www.example.com/blog/index.php 如果用户没用登陆,则应该可以看到登录模块
- 不输入任何登陆信息,点击登陆按钮,我们应该能看到对应的错误提示
- 用正确的用户名密码登陆,当前页面会被刷新,登陆模块消失,显示出了用户菜单模块。
- 点击用户菜单里的注销按钮,我们将会看到用户菜单模块消失,用户登陆模块又显示出来了
总结
登录模块是遵循MVC设计模式的典型例子,它使用一个LoginForm模块来展示(represent 怎么翻译?)数据和逻辑规则。用用户登录的视图来显示用户界面,用UserLogin类(一个很小的controller)来协调模块和视图