Yii入門指導(五):實戰之「會員註冊」

事情糾結多了反而很差。。。。。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' => '&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中作數據庫配置,以下:數組

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文件上傳與驗證碼使用

相關文章
相關標籤/搜索