YIIMVC之用户注册和用户登录

原文  http://blog.csdn.net/buyingfei8888/article/details/40457731

这部分主要包含

1 基本控制器、模型、视图使用规则;

2 登录和注册在视图通过表单使用YII小物件并分析;

3 模型中规则制定和分析;

4 控制器用方法形式访问其他类;

5 进行session和cookie分析 ,并在前后区分session和cookie;

6 生成验证码 ;

这期间也会会有错误,会不断修正

先看下目录结构:

1 基本控制器、模型、视图使用规则;

控制器:都需要继承Controller基类  进行外部访问的方法都需要以action做为方法名称的开始。

用方法形式访问其他类,需要定义actions方法,返回一个二维数组

模型:继承CActiveRecord,基本要实现:四个方法,一个是model,是静态public类型,用来返回模型名称,

一个talbeName,用来返回方法名称;

一个是attributeLabels,设置显示内容,将前面视图中英文转化为汉字,进行统一管理

一个是rules,设置一些验证规则

视图:主要是通过小物件来实现,$this -> beginWidget('CActiveForm');

此篇把主要贴下来,下面再进行调用讲解

前台控制器:

<?php
/**
 * 用户控制器
 */
class UserController extends Controller{
	/*
	 * 验证码生成
	 * 以下代码的意思:在当前控制器里边,以方法的形式访问其他类
	 * 我们访问./index.php?r=user/captcha就会访问到以方法的CCaptchaAction
	 *		  会走CCaptchaAction类里边的run()方法
	 * 
	 * 谁会过来使用 user/captcha 这个路由
	 * 答:是视图表单间接过来调用($this->widget('CCaptcha'))
	 */
	function actions(){
		return array(
			'captcha'=>array(
				'class'=>'system.web.widgets.captcha.CCaptchaAction',
				'width'=>75,
				'height'=>30,
			),
			
			//我们在外边随便定义一个类,都可以通过这种方式访问
			// user/co 就会访问Computer.php里边的run()方法
			'co'=>array(
				'class'=>'application.controllers.Computer',
			),
		);
	}
	
	/**
	 *用户登录 
	 */
	function actionLogin(){
		echo $this -> id."<br />";
		echo $this -> action->id;
		
		//创建登录模型对象
		$user_login = new LoginForm;
		
		if(isset($_POST['LoginForm'])){
			//收集表单信息
			$user_login->attributes = $_POST['LoginForm'];
			
			//校验数据,走的是rules()方法
			//该地方不只校验用户名和密码是否填写,还要校验真实性(在模型里边自定义方法校验真实性)
			//用户信息进行session存储,调用模型里边的一个方法login(),就可以进行session存储
			
			if($user_login->validate() && $user_login->login()){
				$this ->redirect ('./index.php');
			}
		}
		
		$this -> render('login',array('user_login'=>$user_login));
	}
	
	/*
	 * 实现用户注册功能:
	 * 1. 展现注册表单
	 * 2. 收集数据、校验数据、存储数据
	 */
	function actionRegister(){
		//实例化数据模型对象user
		$user_model = new User();
		/**
		 * renderPartial不渲染布局
		 * render会渲染布局 
		 */
		//$this ->renderPartial('register');
		
		//性别信息
		$sex[1] = "男";
		$sex[2] = "女";
		$sex[3] = "保密";
		
		//定义学历
		$xueli[1] = "-请选择-";
		$xueli[2] = "小学";
		$xueli[3] = "初中";
		$xueli[4] = "高中";
		$xueli[5] = "大学";
		
		//定义爱好信息
		$hobby[1] = "篮球";
		$hobby[2] = "足球";
		$hobby[3] = "排球";
		$hobby[4] = "棒球";
		
		//如果用户有注册表单
		if(isset($_POST['User'])){
			//给模型收集表单信息
			//foreach($_POST['User'] as $_k => $_v){
			//	$user_model -> $_k = $_v;
			//}
			
			//收集转化爱好的信息implode
			if(is_array($_POST['User']['user_hobby']))
				$_POST['User']['user_hobby'] = implode(',',$_POST['User']['user_hobby']);
			
			//密码要md5加密
			$_POST['User']['password'] = md5($_POST['User']['password']);
			$_POST['User']['password2'] = md5($_POST['User']['password2']);
			
			//上边的foreach,在yii框架里边有优化,使用模型属性attributes来进行优化
			//attributes 属性已经把foreach集成好了,我们可以直接使用
			$user_model -> attributes = $_POST['User'];
			
			//实现信息存储
			if($user_model -> save())
				$this ->redirect ('./index.php');  //重定向到首页
		}
		
		$this -> render('register',array('user_model'=>$user_model,'sex'=>$sex,'xueli'=>$xueli,'hobby'=>$hobby));
	}
	
	function actionCc(){
		echo "cc";
	}
	
	/*
	 * 用户退出系统
	 */
	function actionLogout(){
		//删除session信息
		//Yii::app()->session->clear();  //删除内存里边sessiion变量信息
		//Yii::app()->session->destroy(); //删除服务器的session文件
		
		//session和cookie一并删除
		Yii::app()->user->logout();
		
		$this->redirect('/');
	}
	
	/*
	 * session使用
	 */
	function actionS1(){
		echo $this->id."<br />";
		echo $this->action->id."<br />";
		//设置session,通过session组件来设置
		Yii::app()->session['username'] = "zhangsan";
		Yii::app()->session['useraddr'] = "beijing";
		echo "make session success";
	}
	
	function actionS2(){
		//使用session
		echo Yii::app()->session['username'],"<br />";
		echo Yii::app()->session['useraddr'];
		echo "use session success";
	}
	
	function actionS3(){
		//删除一个session
		//unset(Yii::app()->session['useraddr']);
		
		//删除全部session
		Yii::app()->session->clear();  //删除session变量
		Yii::app()->session->destroy(); //删除服务器的session信息
	}
	
	/*
	 * cookie在Yii框架使用 
	 */
	function actionC1(){
		//设置cookie
		$ck = new CHttpCookie('hobby','篮球,足球');
		$ck -> expire = time()+3600;
		//把$ck对象放入cookie组件里边
		Yii::app()->request->cookies['hobby'] = $ck;
		
		$ck2 = new CHttpCookie('sex','nan');
		$ck2 -> expire = time()+3600;
		//把$ck对象放入cookie组件里边
		Yii::app()->request->cookies['sex'] = $ck2;
		
		echo "cookie make success";
	}
	function actionC2(){
		//访问cookie
		echo Yii::app()->request->cookies['hobby'],"<br />";
		echo Yii::app()->request->cookies['sex'];
	}
	function actionC3(){
		//删除cookie
		unset(Yii::app()->request->cookies['sex']);
	}
	
	function actionLu(){
		//输出路径别名信息/yii就是框架直接可以操作使用的类
		//Yii::app() 是一个实例,是在当前框架里边唯一可以直接使用的实例对象
		//echo Yii::getPathOfAlias('system');  //D:\www\0507\framework
		//echo Yii::getPathOfAlias('system.web');  //D:\www\0507\framework\web
		//echo Yii::getPathOfAlias('application');  //D:\www\0507\shop\protected
		//echo Yii::getPathOfAlias('zii');  //D:\www\0507\framework\zii
		echo Yii::getPathOfAlias('webroot');  //D:/www/0507/shop
		
	}
	
	
	/*
	 * 使用Yii::app()调用相关属性、方法
	 */
	function actionAp(){
		echo Yii::app()->defaultController,"<br />";
		echo Yii::app()->layout,"<br />";
		echo Yii::app()->name,"<br />";
		echo Yii::app()->charset,"<br />";
		echo Yii::app()->getLayoutPath(),"<br />";
		echo Yii::app()->request->getUrl(),"<br />";
		echo Yii::app()->request->getHostInfo(),"<br />";
	}
	
	/*
	 * 计算脚本执行时间
	 */
	function actionTime(){
		//查看脚本开始时间
		Yii::beginProfile('mytime');
		for($i=0; $i<=100; $i++){
			if($i%7==0)
				echo "seven<br />";
			else if($i%8==0)
				echo "eight<br />";
			else
				echo $i."<br />";
		}
		Yii::endProfile('mytime');
	}
}

前台user模型:

User.php

<?php
/**
 * 用户模型model
 * 两个基本方法:
 * model
 * tableName
 */
class User extends CActiveRecord{
	//在当前模型增加一个属性password2,因为数据库表里边没有这个属性
	//我们可以在当前类直接设置这个属性使用
	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'=>'确认密码',
			'user_sex'=>'性  别',
			'user_qq'=>'qq号码',
			'user_hobby'=>'爱  好',
			'user_xueli'=>'学  历',
			'user_introduce'=>'简  介',
			'user_email'=>'邮  箱',
			'user_tel'=>'手机号码',
		);
	}
	
	/*
	 * 实现用户注册表单验证
	 * 在模型里边设置一个方法,定义具体表单域验证规则
	 */
	public function rules() {
		return array(
			
			array('username','required','message'=>'用户名必填'),
		   
			//用户名不能重复(与数据库比较)
			array('username', 'unique', 'message'=>'用户名已经占用'),
			
			array('password','required','message'=>'密码必填'),
			
			//验证确认密码password2  要与密码的信息一致
			array('password2','compare','compareAttribute'=>'password','message'=>'两次密码必须一致'),
			
			//邮箱默认不能为空
			array('user_email','email','allowEmpty'=>false,  'message'=>'邮箱格式不正确'),
			
			//验证qq号码(都是数字组成,5到12位之间,开始为非0信息,使用正则表达式验证)
			array('user_qq','match','pattern'=>'/^[1-9]\d{4,11}$/','message'=>'qq格式不正确'),
			
			//验证手机号码(都是数字,13开始,一共有11位)
			array('user_tel','match','pattern'=>'/^13\d{9}$/','message'=>'手机号码格式不正确'),
			
			//验证学历(信息在2、3、4、5之间则表示有选择,否则没有),1正则;2范围限制
			//范围限制
			array('user_xueli','in','range'=>array(2,3,4,5),'message'=>'学历必须选择'),
						
			//验证爱好:必选两项以上(自定义方法对爱好进行验证)
			array('user_hobby','check_hobby'),

			//为没有具体验证规则的属性,设置安全的验证规则,否则attributes不给接收信息
			array('user_sex,user_introduce','safe'),
		);
	}
	
	/*
	 * 在当前模型里边定义一个方法check_hobby对爱好进行验证
	 */
	function check_hobby(){
		//在这个方法里边,我们可以获得模型的相关信息
		//$this -> 属性名;  //调用模型对象的相关属性信息
		//$this 就是我们在控制器controller里边实例化好的模型对象
		
		$len = strlen($this -> user_hobby);
		if($len < 3)
			$this -> addError('user_hobby','爱好必须选择两项或以上');
	}
}

前台登陆视图:

login.php

<style type="text/css">
	div .errorMessage{color:red;}
	label  .required {color:red;}
</style>

			<div class="block box">
			<div class="usBox clearfix">
				<div class="usBox_1 f_l">
					<div class="logtitle"></div>
					<?php $form = $this -> beginWidget('CActiveForm'); ?>
						<table align="left" border="0" cellpadding="3" cellspacing="5" width="100%">
							<tbody><tr>
									<td align="right" width="25%">
										<?php echo $form->labelEx($user_login,'username'); ?>
									</td>
									<td width="75%">
										<?php echo $form->textField($user_login,'username',array('size'=>25,'class'=>'inputBg')); ?>
										<?php echo $form->error($user_login,'username'); ?>
									</td>
								</tr>
								<tr>
									<td align="right">
										<?php echo $form->labelEx($user_login,'password'); ?>
									</td>
									<td>
										<?php echo $form->textField($user_login,'password',array('size'=>15,'class'=>'inputBg')); ?>
										<?php echo $form->error($user_login,'password'); ?>
									</td>
								</tr>
								<tr>
									<td align="right">
										<?php echo $form->labelEx($user_login, 'verifyCode'); ?>
									</td>
									<td>
										<?php echo $form->textField($user_login, 'verifyCode',array('size'=>15,'class'=>'inputBg','maxlength'=>4)); ?>
										<!--显示验证码图片/使用小物件显示验证码-->
										<?php $this -> widget('CCaptcha'); ?>
										<?php echo $form->error($user_login,'verifyCode'); ?>
									</td>
								</tr>
								<tr>
									<td align="right">
										<?php echo $form->checkBox($user_login, 'rememberMe'); ?>
									</td>
									<td>
										<?php echo $form->labelEx($user_login, 'rememberMe'); ?>
									</td>
								</tr>
								<tr>
									<td> </td>
									<td align="left">
										<input name="submit" value="" class="us_Submit" type="submit" />
									</td>
								</tr>
								<tr><td></td><td><a href="#" class="f3">密码问题找回密码</a>   <a href="#" class="f3">注册邮件找回密码</a></td></tr>
							</tbody>
						</table>
					<?php $this->endWidget(); ?>
					<div class="blank"></div>
				</div>
				<div class="usTxt">
					<div class="regtitle"></div>
					<div style="padding-left: 50px;">
						<strong>如果您不是会员,请注册</strong>  <br />
						<strong class="f4">友情提示:</strong><br />
						不注册为会员也可在本店购买商品<br />
						但注册之后您可以:<br />
						1. 保存您的个人资料<br />
						2. 收藏您关注的商品<br />
						3. 享受会员积分制度<br />
						4. 订阅本店商品信息  <br />
						<a href="#"><img src="<?php echo IMG_URL; ?>bnt_ur_reg.gif"></a>
					</div>
				</div>
			</div>
			</div>
			</div>

前台register.php视图

<!--放入view具体内容-->
<style type="text/css">
	div .errorMessage{color:red;}
	label  .required {color:red;}
</style>
			<div class="block box">
				<div class="usBox">
					<div class="usBox_2 clearfix">
						<div class="logtitle3"></div>
						<?php $form = $this -> beginWidget('CActiveForm',
									array(
											'enableClientValidation'=>true,
											'clientOptions'=>array(
													'validateOnSubmit'=>true,
											),
									)
								); 
						?>
						<table cellpadding="5" cellspacing="3" style="text-align:left; width:100%; border:0;">
								<tbody>
									<tr>
										<td style="width:13%; text-align: right;">
											<?php echo $form->labelEx($user_model, 'username'); ?>
										</td>

										<td style="width:87%;">
											 <?php echo $form->textField($user_model,'username',array('class'=>'inputBg','id'=>'User_username')); ?>
											<!--表单验证失败显示错误信息-->
											<?php echo $form ->error($user_model,'username'); ?>
										</td>
									</tr>
									<tr>
										<td align="right">
										   <?php echo $form->labelEx($user_model, 'password'); ?>
										</td>

										<td>
											<?php echo $form->passwordField($user_model,'password',array('class'=>'inputBg','id'=>'User_password')); ?>
											<?php echo $form ->error($user_model,'password'); ?>
										</td>
									</tr>
									<tr>
										<td align="right">
											<?php echo $form->label($user_model,'password2') ?>
										</td>
										<td>
											 <?php echo $form->passwordField($user_model,'password2',array('class'=>'inputBg','id'=>'User_password2')); ?>
											<?php echo $form ->error($user_model,'password2'); ?>
										</td>

									</tr>
									<tr>
										<td align="right"><?php echo $form->label($user_model, 'user_email'); ?></td>
										<td>
											<?php echo $form->textField($user_model,'user_email',array('class'=>'inputBg','id'=>'User_user_email')); ?>
											<?php echo $form->error($user_model,'user_email'); ?>
										</td>
									</tr>
									<tr>

										<td align="right"><?php echo $form->label($user_model, 'user_qq'); ?></td>
										<td>
											<?php echo $form->textField($user_model,'user_qq',array('class'=>'inputBg','id'=>'User_user_qq')); ?>
											<?php echo $form->error($user_model,'user_qq'); ?>
										</td>
									</tr>
									<tr>
										<td align="right"><?php echo $form->label($user_model, 'user_tel'); ?></td>
										<td>
											<?php echo $form->textField($user_model,'user_tel',array('class'=>'inputBg','id'=>'User_user_tel','maxlength'=>11)); ?>
											<?php echo $form->error($user_model,'user_tel'); ?>
										</td>
									</tr>
									<tr>
										<!--radioButtonList($model,$attribute,$data,$htmlOptions=array())-->
										<td align="right"><?php echo $form->label($user_model, 'user_sex'); ?></td>
										<td>
											<?php echo $form->radioButtonList($user_model,'user_sex',$sex,array('separator'=>' ')); ?>
										</td>
									</tr>
									<tr>
										<!--dropDownList($model,$attribute,$data,$htmlOptions=array())-->
										<td align="right"><?php echo $form->label($user_model, 'user_xueli'); ?></td>
										<td>
											<?php echo $form -> dropDownList($user_model,'user_xueli',$xueli); ?>
											<?php echo $form->error($user_model,'user_xueli'); ?>
										</td>
									</tr>
									<tr>
										<!--checkBoxList($model,$attribute,$data,$htmlOptions=array())-->
										<td align="right"><?php echo $form->label($user_model, 'user_hobby'); ?></td>
										<td>
											<?php echo $form -> checkBoxList($user_model,'user_hobby',$hobby,array('separator'=>' ')); ?>
											<?php echo $form->error($user_model,'user_hobby'); ?>
										</td>
									</tr>
									<tr>

										<!--textArea($model,$attribute,$htmlOptions=array())-->
										<td align="right"><?php echo $form->label($user_model, 'user_introduce'); ?></td>
										<td>
											<?php echo $form -> textArea($user_model,'user_introduce',array('cols'=>50,'rows'=>5)); ?>
										</td>
									</tr>
									<tr>
										<td> </td>

										<td align="left">
											<input name="Submit" value="" class="us_Submit_reg" type="submit" />
										</td>
									</tr>
									<tr>
										<td colspan="2"> </td>
									</tr>
								</tbody>
							</table>

						<?php $this->endWidget(); ?>
					</div>
				</div>
			</div>
			<!--放入view具体内容-->

		</div>

后台管理员登陆模块

控制器:ManagerController.php

<?php
/**
 * 后台管理员登录控制器
 */
class ManagerController extends Controller{
    /*
     * 实现用户登录
     */
    function actionLogin(){
	$login_model = new LoginForm();
	
	if(isset($_POST['LoginForm'])){
	    $login_model->attributes = $_POST['LoginForm'];
	    
	    //用户名和密码(包括真实性)判断validate,持久化session信息login
	    if($login_model->validate() &&  $login_model->login())
		$this->redirect('./index.php?r=houtai/index/index');
	}
	
	//调用模板
	$this ->renderPartial('login',array('login_model'=>$login_model));
    }
    
    /*
     * 管理员退出系统
     */
    function actionLogout(){
	//删除session变量
	Yii::app()->session->clear();
	
	//删除服务器session信息
	Yii::app()->session->destroy();
	
	//页面重定向到登录页面
	$this -> redirect('./index.php?r=houtai/manager/login');
    }
    
}

后台模型:

Manager.php

<?php
/**
 * 后天管理员数据模型manager
 * 基本方法:
 * model()
 * tableName()
 * rules()
 * attributeLabels()
 */
class Manager extends CActiveRecord{
    public static function model($className = __CLASS__) {
        return parent::model($className);
    }
    
    public function tableName() {
        return '{{manager}}';
    }
    
    
}

LoginForm.php

<?php

/**
 * LoginForm class.
 * LoginForm is the data structure for keeping
 * user login form data. It is used by the 'login' action of 'SiteController'.
 */
class LoginForm extends CFormModel
{
	public $username;
	public $password;
        
	private $_identity;

	/**
	 * Declares the validation rules.
	 * The rules state that username and password are required,
	 * and password needs to be authenticated.
	 */
	public function rules()
	{
		return array(
			// username and password are required
			array('username', 'required','message'=>'用户名必填'),
			array('password', 'required','message'=>'密码必填'),
			// password needs to be authenticated
			//array('password', 'authenticate'),
	//校验用户名和密码的真实性,通过自定义方法实现校验
	array('password','authenticate'),
		);
	}
	/**
	 * Authenticates the password.
	 * This is the 'authenticate' validator as declared in rules().
	 */
	public function authenticate($attribute,$params)
	{
		if(!$this->hasErrors())
		{
			$this->_identity=new UserIdentity($this->username,$this->password);
			if(!$this->_identity->authenticate())
				$this->addError('password','用户名或密码不存在');
		}
	}
	/**
	 * Declares attribute labels.
	 */
	public function attributeLabels()
	{
		return array(
	'username'=>'用户名',
	'password'=>'密    码',
		);
	}



	/**
	 * Logs in the user using the given username and password in the model.
	 * @return boolean whether login is successful
	 */
	public function login()
	{
		if($this->_identity===null)
		{
			$this->_identity=new UserIdentity($this->username,$this->password);
			$this->_identity->authenticate();
		}
		if($this->_identity->errorCode===UserIdentity::ERROR_NONE)
		{
			//$duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days
			Yii::app()->user->login($this->_identity,$duration);
			return true;
		}
		else
			return false;
	}
}

视图login.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<meta content="MSHTML 6.00.6000.16674" name="GENERATOR" />

		<title>用户登录</title>
<style type="text/css">
.errorMessage {clear:both;}
</style>
		<link href="<?php echo HOUTAI_CSS_URL ?>User_Login.css" type="text/css" rel="stylesheet" />
	</head><body id="userlogin_body">
		<div></div>
		<div id="user_login">
			<dl>
				<dd id="user_top">
					<ul>
						<li class="user_top_l"></li>
						<li class="user_top_c"></li>
						<li class="user_top_r"></li></ul>
				</dd><dd id="user_main">
					<?php $form = $this -> beginWidget('CActiveForm'); ?>
						<ul>
							<li class="user_main_l"></li>
							<li class="user_main_c">
								<div class="user_main_box">
									<ul>
										<li class="user_main_text">
											<?php echo $form -> labelEx($login_model, 'username'); ?>
										</li>
										<li class="user_main_input">
											<?php echo $form -> textField($login_model,'username',array('class'=>'TxtUserNameCssClass','maxlength'=>20)); ?>
											<?php echo $form->error($login_model,'username'); ?>
										</li></ul>
									<ul>
										<li class="user_main_text"><?php echo $form -> labelEx($login_model, 'password'); ?> </li>
										<li class="user_main_input">
										   <?php echo $form -> textField($login_model,'password',array('class'=>'TxtPasswordCssClass','maxlength'=>20)); ?>	
											<?php echo $form->error($login_model,'password'); ?>
										</li>
									</ul>
								</div>
							</li>
							<li class="user_main_r">

								<input style="border: medium none; background: url('<?php echo HOUTAI_IMG_URL; ?>user_botton.gif') repeat-x scroll left top transparent; height: 122px; width: 111px; display: block; cursor: pointer;" value="" type="submit">
							</li>
						</ul>
					<?php $this -> endWidget(); ?>
				</dd><dd id="user_bottom">
					<ul>
						<li class="user_bottom_l"></li>
						<li class="user_bottom_c"><span style="margin-top: 40px;"></span> </li>
						<li class="user_bottom_r"></li></ul></dd></dl></div><span id="ValrUserName" style="display: none; color: red;"></span><span id="ValrPassword" style="display: none; color: red;"></span><span id="ValrValidateCode" style="display: none; color: red;"></span>
		<div id="ValidationSummary1" style="display: none; color: red;"></div>
	</body>
</html>
posted @ 2017-04-18 11:29  含蓄的凉面  阅读(708)  评论(0编辑  收藏  举报