Yii入门指导(五):实战之“会员注册”

事情纠结多了反而不好。。。。。

1,会员数据库表结构如下:

Yii入门指导(五):实战之“会员注册”_第1张图片

2,建立会员模型,位于:protected/modules/admin/models 目录下

 <?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' => '&nbsp;')
	); ?>
	<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' => '&nbsp;')); ?>
	<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中做数据库配置,如下:

Yii入门指导(五):实战之“会员注册”_第2张图片

6,在浏览器中访问该控制器“http:://localhost/testyii/index.php?r=admin”,页面效果如图:

Yii入门指导(五):实战之“会员注册”_第3张图片


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入门指导(五):实战之“会员注册”_第4张图片

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文件上传与验证码使用


你可能感兴趣的:(Yii入门指导(五):实战之“会员注册”)