打开protected\models\User.php文件, 修改我们的User Model.
首先修改Model指向的表名, 将tableName()里面return的内容改成users, 如下:
public function tableName() {
return 'users';
}
用户注册的时候, 我们需要用户来输入他喜欢的密码, 需要一个密码确认的字段, 为了防止机器人程序恶意注册,我们还需要一个验证码字段, 所以要在User这个类里加入2个属性: passwordConfirm和verifyCode,代码如下:
public $passwordConfirm;
public $verifyCode;
下面我们来添加User的字段验证规则.根据我们的需求, username, password, passwordConfirm,email和verifyCode都是必填项, 所以需要添加如下的规则:
array(‘username, password, passwordConfirm, email, verifyCode’,‘required’)
另外, 我们希望用户名和nickname唯一, 就需要添加以下的规则:
array(‘username’, ‘unique’),
array(‘nickname’, ‘unique’)
注册的时候, 用户需要输入两遍密码以确保没有把密码输错, 这里就需要passwordConfirm字段的值等于password了,可以使用以下的规则:
array(‘passwordConfirm’, ‘compare’, ‘compareAttribute’=> ‘password’)
这个规则的意思是, passwordConfirm的值必须与password相同.
这样, 我们完成好的验证规则就应该像下面的代码:
public function rules() {
return array(
array('username, password, passwordConfirm, email, verifyCode', 'required'),
array('username', 'unique'),
array('username', 'length', 'min' => 5, 'max' => 12),
array('password', 'length', 'min' => 5, 'max' => 12),
array('nickname', 'length', 'min' => 4, 'max' => 20),
array('nickname', 'unique'),
array('verifyCode', 'captcha'),
array('passwordConfirm', 'compare', 'compareAttribute' => 'password'),
);
}
Yii的model里有个特殊的地方就是, 它可以保护字段的安全性,所有放在safeAttributes()方法里的字段被认为是可以访问和修改的, 不在里面的字段则是需要保护的,所以我们需要将我们刚才的字段都放进这个方法里, 如下:
public function attributeLabels() {
return array(
'username' => '用户名',
'password' => '密码',
'passwordConfirm' => '密码确认',
'email' => '邮件地址',
'nickname' => '昵称',
'verifyCode' => '验证码'
);
}
好了, 现在我们已经有了一个完善的字段验证规则, 又确保了我们的字段是可以访问的, 现在该修改controller文件了.打开protected/controllers/UserController.php文件, 创建一个新的方法register,根据yii的规则, 所有允许用户访问的的action方法必须以action开头,所以我们创建的方法名字应该是actionRegister()了.
书写该方法的方法体, 首先我们需要创建一个form, 这个form是一个Model的实例, 因为我们的目的是注册一个用户,所以这个form需要是User的实例, 用以下代码:
$form = new User;
这个form建好后, 没有任何属性, 但是已经可以使用了, 我们需要将它传到view里去显示它, 以便让用户填写自己的信息,使用代码:
$this->render(‘register’, array(‘form’=> $form));
将$form传到register试图并命名为form.
在protected/views/user目录下创建register.php文件, 内容如下:
<h2>新用户注册</h2><?php echo CHtml::beginForm(); ?> <?php echo CHtml::errorSummary($form); ?> <p> <?php echo CHtml::activeLabelEx($form, 'username'); ?> <?php echo CHtml::activeTextField($form, 'username', array('size' => 20, 'maxlength' => 12)); ?> </p> <p> <?php echo CHtml::activeLabelEx($form, 'password'); ?> <?php echo CHtml::activePasswordField($form, 'password', array('size' => 20, 'maxlength' => 12)); ?> </p> <p> <?php echo CHtml::activeLabelEx($form, 'passwordConfirm'); ?> <?php echo CHtml::activePasswordField($form, 'passwordConfirm', array('size' => 20, 'maxlength' => 12)); ?> </p> <p> <?php echo CHtml::activeLabelEx($form, 'email'); ?> <?php echo CHtml::activeTextField($form, 'email', array('size' => 20)); ?> </p> <p> <?php echo CHtml::activeLabelEx($form, 'nickname'); ?> <?php echo CHtml::activeTextField($form, 'nickname', array('size' => 20, 'maxlength' => 12)); ?> </p> <p> <label> </label> <?php $this->widget('CCaptcha'); ?> </p> <p> <?php echo CHtml::activeLabelEx($form, 'verifyCode'); ?> <?php echo CHtml::activeTextField($form, 'verifyCode'); ?> </p> <p> <label> </label> <?php echo CHtml::submitButton('注册'); ?> </p> <?php echo CHtml::endForm(); ?>
里面调用了Yii提供的方法来创建我们需要的HTML标签,有一个需要注意的地方就是里面使用$this->widget(‘CCaptcha’);
来显示一个验证码, 用它的时候, 我们需要在controller里声明它, 声明的方法如下:
public function actions() {
return array(
'captcha'=>array(
'class' => 'CCaptchaAction',
'backColor' => 0xCCCCCC,
'testLimit' => 1,
),
);
}
这样,我们就可以在view里使用验证码了, 怎么样, 赶紧去试试吧, 访问url:
http://localhost/index.php?r=user/register
怎么?显示你没有权限访问该action, 嘿嘿, 这就对了, 在Yii的世界里, 任何一个action在被访问的时候,都会检查它的权限的, 我们只需要到controller里找到accessRules()方法, 在’user’=> array(‘*’)的这个array里, 将我们的action加进入, 就可以顺利访问了,比如说:
array('allow', // allow all users to perform 'list' and 'show' actions
'actions' => array('register', 'login', 'logout', 'captcha'),
'users' => array('*'),
),
注意, 要在view里显示captcha, 也必须把captcha action加进去.
回到浏览器重新刷新一下, 怎么样, 我们的表单出来了吧.