首页 > 代码库 > YII model模型和登陆详解

YII model模型和登陆详解

模型是 CModel 或其子类的实例。模型用于保持数据以及与其相关的业务逻辑。

模型是单独的数据对象。它可以是数据表中的一行,或者一个用户输入的表单。 数据对象的每个字段对应模型中的一个属性。每个属性有一个标签(label), 并且可以通过一系列规则进行验证。

Yii 实现了两种类型的模型:表单模型和 Active Record。二者均继承于相同的基类 CModel。

表单模型是 CFormModel 的实例。表单模型用于保持从用户的输入获取的数据。 这些数据经常被获取,使用,然后丢弃。例如,在一个登录页面中, 我们可以使用表单模型用于表示由最终用户提供的用户名和密码信息。更多详情,请参考 使用表单。

Active Record (AR) 是一种用于通过面向对象的风格抽象化数据库访问的设计模式。 每个 AR 对象是一个CActiveRecord 或其子类的实例。代表数据表中的一行。 行中的字段对应 AR 对象中的属性。更多关于 AR 的细节请阅读 Active Record.

CFormModel:代表收集HTML表单输入的数据模型。 

不同于CActiveRecord,CFormModel收集的数据只存储在内存中, 而不是数据库中。
yii登陆表单:
model
class LoginForm extends CFormModel {}
表单的模型要继承CFormModel

controller
$model=new LoginForm;

$this->render(‘login‘,array(‘model‘=>$model));

controller 实例化要用到的表单,传递给views

views

<?php $form=$this->beginWidget(‘CActiveForm‘, array(‘id‘=>‘login-form‘,‘enableAjaxValidation‘=>true,)); ?>

....

<?php $this->endWidget(); ?>

views用 beginWidget(‘CActiveForm‘)生成一个表单
 
model如下:
 
<?phpclass LoginForm2 extends CFormModel{    public $username;    public $password;    public function rules()    {        return array(        array(‘username,password‘,‘required‘),        array(‘password‘,‘authenticate‘),        );    }    public function attributeLabels()    {        return array("username"=>"用户名",‘password‘=>"密码");    }        public function authenticate($attribute,$params)    {        if($this->username=="admin")            $this->addError("username", "can‘t login with admin");                        }    }

public array rules () 
{return} 
array 要调用 validate() 时应用的有效性规则。 

array(‘attribute list‘, ‘validator name‘, ‘on‘=>‘scenario name‘, ...validation parameters...) 
attribute list: 指定属性 (以逗号分隔) 进行验证 ;
validator name: 指定要使用的验证程序。 它可以是方法的一个模型类的一个内置的验证器或验证程序类 (或其路径的别名) 名称的名称。 一种验证方法必须具有以下签名:
// $params refers to validation parameters given in the rulefunction validatorName($attribute,$params) 
内置的验证程序是指在 CValidator::builtInValidators 中声明的验证程序之一。 验证程序的类是扩展 CValidator 的类。 
on: 应执行有效性规则时,此选项指定的情形。 用逗号分开不同的方案。 如果未设置此选项,将在任何情况下应用规则。 请 方案 中有关此选项的更多详细信息,参阅。 
附加参数用于初始化相应的验证程序属性。 请参阅 individal 验证器类 API 可能的属性。 

 

 

我们的模型类非常简单,只有username和passsword两个属性。username的校验规则是不为空,且不能是“admin”,而password的校验规则只是不为空。注意,当我们检查到用户输入的username的值为“admin”时候,校验失败,我们添加错误信息为“can
not login with admin”,这段信息会在页面中的Yii提供的error元素中输出。

我们可以在rules方法中指定任何一条验证规则的错误信息,我们需要使用message属性。例如:array(‘username’, ‘required’,‘message’=>’not
null’),当‘username’的内容为空的时候,我们会使用message指定的内容在页面上显示错误信息。当然我们可以使用中文,如果出现乱码,可以这样设置:array(‘username’,
‘required’,‘message’=>iconv(“gb2312″,”utf-8″,”不能为空“))

你将main.php里的app配置加上language=>’zh_cn’,系统默认的提示就是中文的了!

其他验证规则案例:

array(‘title, content,
status’, ‘required’),

array(‘title’, ‘length’,
‘max’=>128),

array(‘status’, ‘in’,
‘range’=>array(0, 1, 2)),

array(‘tags’, ‘match’,
‘pattern’=>’/^[\w\s,]+$/’,‘message’=>’Tags can only contain word
characters.’),

 

我们的页面代码如下:

<div class="form"><?php$form=$this->beginWidget(‘CActiveForm‘,array(    ‘id‘=>‘login-form‘,    ‘enableAjaxValidation‘=>true,    ‘action‘=>array(‘login2/login‘),));?><div class="row">    <?php echo $form->labelEx($model,‘username‘);?>    <?php echo $form->textField($model,‘username‘);?>    <?php echo $form->error($model,‘username‘);?></div><div class="row">    <?php echo $form->labelEx($model,‘password‘);?>    <?php echo $form->passwordField($model,‘password‘);?>    <?php echo $form->error($model,‘password‘);?></div><div class="row submit">    <?php echo CHtml::submitButton("登陆");?></div><?php $this->endWidget();?></div>

对于每一个模型属性的页面表示来说,我们都会有一个Label来说明其属性名,还有一个input框用来输入该属性值,最后有个error元素来显示校验失败时的错误信息。Yii对Form及其子元素封装的太多,我们将以上php代码翻译成静态页面为:

<div class="form"><form id="login-form" action="/validator/index.php?r=site/login" method="post"><div class="row"><label for="LoginForm_username" class="required">Username<span class="required">*</span></label><input name="LoginForm[username]" id="LoginForm_username" type="text" value="" /><div id="LoginForm_username_em_" class="errorMessage" style="display:none"></div></div><div class="row"><label for="LoginForm_password" class="required">Password<span class="required">*</span></label><input name="LoginForm[password]" id="LoginForm_password" type="password" value="" /><div id="LoginForm_password_em_" class="errorMessage" style="display:none"></div></div><div class="row submit"><input type="submit" name="yt0" value="http://www.mamicode.com/Login" /></div></form></div>

CActiveForm很重要的一个特性就是它支持Ajax校验。我们可以设置CActiveForm的enableAjaxValidation属性为ture来启动Ajax校验。例如,当用户在input框中输入一些值后就会触发Ajax校验。CActiveForm会向服务器提交Ajax请求,用来校验用户当前输入的值。服务器的校验一般是调用模型类Model的validate()方法。如果校验失败,相对应的错误信息将会被返回并显示给用户。即使用户在浏览器禁用javascript,他也会通过整个页面的提交自动回滚到传统的页面验证。

 

在客户端,Yii认为input框可以存在四个状态:初始化,校验,错误和成功。为了区分这些状态,CActiveForm自动指定了不同的CSS样式给包含此input框的HTML
element。默认情况下,这些CSS样式类的名字为:validating,error,success。当然我们可以使用CActiveForm的options属性去自定义他们。

 

CActiveForm的提交和校验是基于Ajax模式的。如果你的Form表单中有很大量的数据需要提交,那么这种Ajax模式的提交可能就不那么好了。这种情况下,你可以设计自己轻量级的Ajax校验。使用Yii对JQuery的支持?

 

使用CActiveForm来做Ajax校验,我们需要使用两个JS库:jquery.js和jquery.yiiactiveform.js。他们的位置在工程根目录下:assets\5ce53e17\文件夹中。不用担心,这些JS库Yii会自动发布到你的工程中。虽然这些动作Yii会悄悄的做,当你必须知道。

Yii的Ajax的校验效果是通过CSS来实现的,上文提到一个input框可以存在四个状态:初始化,校验,错误和成功。每个状态对应不同CSS样式类。初始化和校验这两个状态我们不需要关心,我们只注重用户校验失败和成功时,该input框的CSS样式。此外当校验失败的时候,我们还要定义错误信息的样式,从翻译过来的静态文本来来,我们需要定义errorMessage类。以下是我的CSS类:

 

/*标签是否换行*/

.form label {
font-size:12px; display:block; }

 

/*属性是否必填项,客户端根据model的rule方法而定*/

.form span.required {
color:red; }

 

/*校验出错时标签CSS样式*/

.form .error label {
color:#FFCC33; }

/*校验出错时输入框的CSS样式*/

.form .error input {
background:#FEE; border-color:#C00; }

/*校验出错时错误信息的CSS样式,我们可以设置其display属性让其不换行。*/

.form .errorMessage {
display:inline; color:red; font-size:12px; }

 

/*校验成功时标签CSS样式*/

.form .success label {
color:#000000; }

/*校验成功时输入框的CSS样式*/

.form .success input {
background:#E6EFC2; border-color:#C6D880; }

以上的CSS注释已经很详细了,我们来看看校验流程,首先我们需要先渲染我们的页面:

$model = new LoginForm;

$this->render(‘index’,array(‘model’=>$model));

注意,这里我们必须使用render()方法对其进行渲染。

我们的actionLogin如下:

<?phpclass Login2Controller extends Controller {     public function actionLogin()    {        $model=new LoginForm2();        //ajax validate        if(isset($_POST[‘ajax‘])&& $_POST[‘ajax‘]===‘login-form‘)        {            echo CActiveForm::validate($model);            Yii::app()->end();                    }        //submit handle and validate        if(isset($_POST[‘LoginForm2‘]))        {            $model->attributes=$_POST[‘LoginForm2‘];            if($model->validate())            {                //no business login handel                $this->renderPartial("success");                Yii::app()->end();            }        }                $this->render("login",array(‘model‘=>$model));    }            }

当input框失去焦点的时候,页面会向服务器提交Ajax请求,服务器端就会根据模型类LoginForm中定义的校验规则就其就行验证。如果校验成功,则input框会按指定的success样式类去显示,如果校验失败,则input框会按指定的error样式类去显示,同时还会按照errorMessage指定的样式类显示错误信息。

需要注意的是,如果我们对用户输入的信息进行了校验,而且有可能校验失败,但是用户在校验失败的情况下,仍然可以提交Form表单。所以当用户提交Form表单的处理代码中,我们仍需要对用户的输入进行校验。

到这里controller,model和view就写完了。