事情纠结多了反而很差。。。。。php
1,会员数据库表结构以下:css
2,创建会员模型,位于:protected/modules/admin/models 目录下html
<?php /** * 用户表的模型 * @author koma * */ class User extends CActiveRecord { //声明非数据库字段 public $password2; public static function model($className = __CLASS__) { return parent::model($className); } public function tableName() { return '{{user}}'; } public function attributeLabels() { return array( 'username' => '用 户 名:', 'password' => '密 码:', 'password2' => '重复密码:', 'email' => '经常使用邮箱:', 'gender' => '性 别:', 'hobby' => '我的爱好:', 'remark' => '个性签名:' ); } public function rules() { return array( /* * 验证规则数组的写法: * array(验证的字段名, 验证类别名, 验证类属性1, 验证类属性2, ...) * */ //必填项验证 array('username', 'required', 'message'=>'用户名不能为空'), //用户名不能重复验证,须要去校验数据库 array('username', 'unique', 'message'=>'用户名已经被占用'), array('password', 'required', 'message'=>'密码不能为空'), //重复密码验证 array('password2', 'compare', 'compareAttribute' => 'password', 'message'=>'两次密码不一致'), //邮箱验证,并规定不能为空 array('email', 'email', 'allowEmpty' => false, 'message'=>'邮箱格式错误'), //自定义验证方法 array('hobby', 'myvalidator'), //为没有验证规则的属性,设置安全的验证规则,不然经过 //$user_model->attributes执行数据接收的时候 //没有验证规则的字段是不会被接收,也就不会存储到数据库中 array('gender,remark', 'safe') ); } public function myvalidator() { /* * 全部的字段信息在模型中以属性的形式存在 * 这里检测用户选择的爱好信息是否超过两项 */ if ( strlen($this->hobby) < 3 ) { //这里和在验证规则里添加一个message属性同样 //都是为表单域设置错误信息 //它们不能互相替换 $this->addError('hobby', '爱好必须选择两项以上'); } } }
3,在默认控制器中写入以下代码,位于:protected/modules/admin/controllers/DefaultController.php 下数据库
/** * admin模块默认控制器 * @author koma * */ class DefaultController extends Controller { public function actionIndex() { $user_model = new User(); $this->renderPartial('index', array('userModel' => $user_model)); } }
4,创建对应的视图文件,位于:protected/modules/admin/views/default/index.php 下编程
<html> <head> <title>会员注册</title> <style type="text/css"> #container{ width: 600px; margin:0 auto; border:1px solid #CCC; padding-left: 10px;} </style> </head> <body> <div id="container"> <?php $form = $this->beginWidget('CActiveForm'); ?> <p> <?php echo $form->label($userModel, 'username'); ?> <?php echo $form->textField($userModel, 'username'); ?> <font color="#ff0000">*</font> <font color="#ff0000"><?php echo $form ->error($userModel,'username'); ?></font> </p> <p> <?php echo $form->label($userModel, 'password'); ?> <?php echo $form->passwordField($userModel, 'password'); ?> <font color="#ff0000">*</font> <font color="#ff0000"><?php echo $form ->error($userModel,'password'); ?></font> </p> <p> <?php echo $form->label($userModel, 'password2'); ?> <?php echo $form->passwordField($userModel, 'password2'); ?> <font color="#ff0000">*</font> <font color="#ff0000"><?php echo $form ->error($userModel,'password2'); ?></font> </p> <p> <?php echo $form->label($userModel, 'email'); ?> <?php echo $form->textField($userModel, 'email'); ?> <font color="#ff0000">*</font> <font color="#ff0000"><?php echo $form ->error($userModel,'email'); ?></font> </p> <p> <?php echo $form->label($userModel, 'gender'); ?> <?php echo $form->radioButtonList( $userModel, 'gender', array('m'=>'男', 'f'=>'女'), array('separator' => ' ') ); ?> <font color="#ff0000"><?php echo $form ->error($userModel,'gender'); ?></font> </p> <p> <?php echo $form->label($userModel, 'hobby'); ?> <?php echo $form->checkBoxList($userModel, 'hobby', array( 1 => '篮球', 2 => '足球', 3 => '台球', 4 => '编程' ), array('separator' => ' ')); ?> <font color="#ff0000"><?php echo $form ->error($userModel,'hobby'); ?></font> </p> <p> <?php echo $form->label($userModel, 'remark'); ?> <?php echo $form->textArea($userModel, 'remark', array('rows'=>5, 'cols'=>30)); ?> <font color="#ff0000"><?php echo $form ->error($userModel,'remark'); ?></font> </p> <p> <input type="submit" value="提交注册" /> </p> <?php $form = $this->endWidget(); ?> </div> </body> </html>
5,在main.php中作数据库配置,以下:数组
6,在浏览器中访问该控制器“http:://localhost/testyii/index.php?r=admin”,页面效果如图:浏览器
7,而后在:protected/modules/admin/controllers/DefaultController.php 文件中进行以下编码测试安全
public function actionIndex() { $user_model = new User(); if ( isset($_POST['User']) ) { var_dump($_POST['User']); } $this->renderPartial('index', array('userModel' => $user_model)); }
测试截图:yii
8,继续更改控制器代码,以下:测试
public function actionIndex() { $user_model = new User(); if ( isset($_POST['User']) ) { if ( is_array($_POST['User']['hobby']) ) { $_POST['User']['hobby'] = implode(',', $_POST['User']['hobby']); } //对用户密码进行加密 $_POST['User']['password'] = md5($_POST['User']['password']); $_POST['User']['password2'] = md5($_POST['User']['password2']); //收集用户输入 $user_model->attributes = $_POST['User']; if ( $user_model->save() ) { echo '注册成功'; } } $this->renderPartial('index', array('userModel' => $user_model)); }
执行注册以后,数据库中已经有了刚刚咱们注册的用户数据,截图以下:
截止到此,会员注册功能实现!
9,最后,针对上面的代码作一个解释说明:
首先在模型文件中,咱们让模型“User”继承自“CActiveRecord”是由于咱们的用户注册数据是须要永久保存的,那么就须要使用Yii中的“ActiveRecord”数据模型而非“FormModel”表单模型。
那么针对“ActiveRecord”模型,有两个方法时必须从新定义并且格式是固定的,即静态方法“model”和公共方法“tableName”,其中“tableName”方法中使用“return '{{user}}';”形式则模型会主动获取到main.php中配置的数据表前缀,固然咱们也能够直接返回表名称,如“return 'yii_user';”
接着方法“attributeLabels”,是定义了生成表单中的标签名,供视图文件中的“echo $form->label($userModel, 'username');”来调用,而生成一个表单项的说明文本
接着方法“rules”,是定义了表单在提交时的验证规则,上面都有注释说明,这里再也不赘述
而后在视图文件中,视图文件中的代码一目了然无需过多解释,只需解释“echo $form ->error($userModel,'password');”这段代码的做用是当提交表单的时候,若是表单项不满意模型方法“rules”中的规则的话那么模型会抛出“错误信息”,而这段代码的做用就是显示这个错误信息,若是没有的话则不显示
最后在控制器文件中,咱们使用“$user_model = new User();”的方式来得到一个User数据模型对象,那么采用这种方法来获取数据模型对象以后咱们能够调用数据模型对象的“save”方法来向对应的数据表中插入数据,可是当咱们采用“$user_model = User::model()”这种方式来得到数据模型对象以后,咱们能够对数据表进行删除、查询、和更新数据,其中注意,数据的更新也是调用“save”方法。
当咱们经过小物件来生成表单后,那么咱们就能够在控制器中经过“$_POST['User']”来获取表单提交过来的数据,注意“$_POST”中的“User”键和咱们获取的数据模型对象“User”的名称一致。
在最后,咱们经过“$user_model->attributes = $_POST['User'];”来把从表单中获取到的数据“注入”到数据对象模型中,而后接着就能够调用数据模型中相应方法对数据进行操做,那在“注入”数据以前,咱们能够先对数据作一些操做,例如“密码加密”等操做
下一节继续:Yii文件上传与验证码使用