yii在一个视图中只能创建一个yii2 表单验证吗

请问老师,在Yii2框架博客系统的创建分类表单中,在文章分类里 多出的 0,是什么原因?
在这个 分类 的 在暂无分类的上头,,,多出一个0,是哪来的〉? 代码看了几遍没找到原因非常感谢老师
Copyright (C)
All Rights Reserved | 京ICP备 号-2yii 一个表单提交多个模型数据_懒人程序
支付宝赞助帐号:
yii 一个表单提交多个模型数据
yii 一个表单提交多个模型数据
--user表&&
Create&Table:&CREATE&TABLE&`user`&(&&
&&`id`&int(11)&NOT&NULL&AUTO_INCREMENT,&&
&&`username`&varchar(45)&DEFAULT&NULL,&&
&&`userpass`&varchar(45)&DEFAULT&NULL,&&
&&`profile_id`&int(11)&DEFAULT&NULL,&&
&&PRIMARY&KEY&(`id`),&&
&&KEY&`fk_msjy_user_1_idx`&(`profile_id`),&&
&&CONSTRAINT&`profile_id`&FOREIGN&KEY&(`profile_id`)&&&
REFERENCES&`msjy_profile`&(`id`)&ON&DELETE&NO&ACTION&ON&UPDATE&NO&ACTION&&
)&ENGINE=InnoDB&AUTO_INCREMENT=3&DEFAULT&CHARSET=utf8&&
--profile表&&
Create&Table:&CREATE&TABLE&`msjy_profile`&(&&
&&`id`&int(11)&NOT&NULL&AUTO_INCREMENT,&&
&&`status`&tinyint(4)&DEFAULT&NULL,&&
&&`address`&varchar(45)&DEFAULT&NULL,&&
&&PRIMARY&KEY&(`id`)&&
)&ENGINE=InnoDB&AUTO_INCREMENT=9&DEFAULT&CHARSET=utf8&&
接下来,gii生成user和profile模型
然后gii生成RegisterController并整理成如下:
class&RegisterController&extends&Controller&&
&&&&public&function&actionIndex()&&
&&&&&&&&$this-&render('index');&&
&&&&public&function&actionCreate()&&
&&&&&&&&&$modelA&=&new&U&&
&&&&&&&&&$modelB&=&new&P&&
&&&&&&&&&if(isset($_POST['User'])&&&&isset($_POST['Profile']))&&
&&&&&&&&&{&&
&&&&&&&&&&&&&$modelA-&attributes=$_POST['User'];&&
&&&&&&&&&&&&&$modelB-&attributes=$_POST['Profile'];&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&if($modelA-&validate()&&&&$modelB-&validate())&&
&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&if&($modelB-&save(false))&&
&&&&&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&&&&&&&&&$modelA-&profile_id&=&$modelB-&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&if&($modelA-&save(false))&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$this-&redirect(array('User/view','id'=&$modelA-&id));&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&}&&
&&&&&&&&&}&&
&&&&&&&&&$this-&render('create',array(&&
&&&&&&&&&&&&&'modelA'=&$modelA,&&
&&&&&&&&&&&&&'modelB'=&$modelB,&&
&&&&&&&&&));&&
在views里的register包里创建
&&?php&echo&$this-&renderPartial('_form',&array('modelA'=&$modelA,'modelB'=&$modelB));&?&&&
_form.php&&
&div&class=&form&&&&
&?php&$form=$this-&beginWidget('CActiveForm',&array(&&
&&&&'id'=&'User-form',&&
&&&&'enableAjaxValidation'=&false,&&
&&&&&p&class=&note&&Fields&with&&span&class=&required&&*&/span&&are&required.&/p&&&
&&&&&?php&echo&$form-&errorSummary(array($modelA,$modelB));&?&//注意这里&&
&&&&&div&class=&row&&&&
&&&&&&&&&?php&echo&$form-&labelEx($modelA,'username');&?&&&
&&&&&&&&&?php&echo&$form-&textField($modelA,'username');&?&&&
&&&&&&&&&?php&echo&$form-&error($modelA,'username');&?&&&
&&&&&/div&&&
&&&&&div&class=&row&&&&
&&&&&&&&&?php&echo&$form-&labelEx($modelA,'userpass');&?&&&
&&&&&&&&&?php&echo&$form-&textField($modelA,'userpass');&?&&&
&&&&&&&&&?php&echo&$form-&error($modelA,'userpass');&?&&&
&&&&&/div&&&
&&&&&div&class=&row&&&&
&&&&&&&&&?php&echo&$form-&labelEx($modelB,'status');&?&&&
&&&&&&&&&?php&echo&$form-&textField($modelB,'status');&?&&&
&&&&&&&&&?php&echo&$form-&error($modelB,'status');&?&&&
&&&&&/div&&&
&&&&&div&class=&row&&&&
&&&&&&&&&?php&echo&$form-&labelEx($modelB,'address');&?&&&
&&&&&&&&&?php&echo&$form-&textField($modelB,'address');&?&&&
&&&&&&&&&?php&echo&$form-&error($modelB,'address');&?&&&
&/div&&div&class=&row&&&&
&/div&&div&class=&row&buttons&&&&
&?php&echo&CHtml::submitButton($modelA-&isNewRecord&?&'Create'&:&'Save');&?&&&
&&&&&/div&&&&&&&
&?php&$this-&endWidget();&?&&&
另外,关于create方法里的验证,原文有说明,此处省略文字若干。。。。。
支持键盘 ← →1989人阅读
CActiveForm实际上是对Chtml类的封装,它与Chmtl不同的地方是CActiveForm提供了验证机制,有三种:
&& 服务器端/客户端/ajax验证
&& 基本表单:
&& &?php $form=$this-&beginWidget('CActiveForm',
&&&'id'=&'contact_form',
&&&'enableAjaxValidation'=&true//是否是ajax验证
//'enableClientValidation'=&true,//是否客户端验证
&&&//'action'=&'site/contact',
&&&//'method'=&'get',
&&p class=&note&&Fields with &span class=&required&&*&/span& are required.&/p&
&&div class=&row&&
&&&?php echo $form-&labelEx($model,'name');& ?&
&&&?php echo $form-&textField($model,'name');?&
&&&//单独显示错误信息&
&&&echo $form-&error($model,'name');&&&
&&div class=&row&&
&&&?php echo $form-&labelEx($model,'email'); ?&
&&&?php echo $form-&textField($model,'email'); ?&
&&&//单独显示错误信息&
&&&echo $form-&error($model,'email');&&&
&&div class=&row&&
&&&?php echo $form-&labelEx($model,'subject'); ?&
&&&?php echo $form-&textField($model,'subject',array('size'=&60,'maxlength'=&128)); ?&
&&div class=&row&&
&&&?php echo $form-&labelEx($model,'body'); ?&
&&&?php echo $form-&textArea($model,'body',array('rows'=&6, 'cols'=&50)); ?&
&& $model -& name = 0;
&&& echo $form-&radioButtonList($model,'name',
&&&&&& array('1'=&'Male','0'=&'Female'),
&&&&&& array('separator'=&'&','labelOptions'=&array('class'=&''))
& &div class=&row&&
& &?php echo $form-&labelEx($model,'label:'); ?&
&&& $model -&name = array(1,2,3,4);//设定checkbox的默认值,其实应该在controller里面设定最好,radio,select的设定方法和这个一样
&&& echo $form-&checkBoxList($model,'name',
&&&&&& array('1'=&'Football','2'=&'Music','3'=&'Game','4'=&'basketball'),
&&&&&& array('separator'=&'&','labelOptions'=&array('class'=&'mylabel'))
&&?php if(extension_loaded('gd')): ?&
&&div class=&row&&
&&&?php echo $form-&labelEx($model,'verifyCode'); ?&
&&&?php $this-&widget('CCaptcha'); ?&
&&&?php echo $form-&textField($model,'verifyCode'); ?&
&&&div class=&hint&&Please enter the letters as they are shown in the image above.
&&&br/&Letters are not case-sensitive.&/div&
&&div class=&row submit&&
&&&echo CHtml::submitButton('Submit');
& //总体显示错误信息
&&?php echo $form-&errorSummary($model); ?&
&?php $this-&endWidget(); ?&
1、如果开启ajax验证在controller端实现代码:
&public function actionContact()
&&$model=new ContactF
&&//ajax validation
&&if(isset($_POST['ajax']) && $_POST['ajax']==='contact_form')
&&&echo CActiveForm::validate($model);
&&&Yii::app()-&end();
&&if(isset($_POST['ContactForm']))
&&&$model-&attributes=$_POST['ContactForm'];
&&&if($model-&validate())//服务器端验证
&&&&$headers=&From: {$model-&email}\r\nReply-To: {$model-&email}&;
&&&&mail(Yii::app()-&params['adminEmail'],$model-&subject,$model-&body,$headers);
&&&&Yii::app()-&user-&setFlash('contact','Thank you for contacting us. We will respond to you as soon as possible.');
&&&&$this-&refresh();
&&$this-&render('contact',array('model'=&$model));
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:257464次
积分:4870
积分:4870
排名:第4996名
原创:235篇
转载:50篇
评论:16条
(1)(3)(4)(2)(1)(1)(1)(1)(1)(2)(2)(6)(2)(3)(3)(6)(7)(4)(11)(4)(8)(2)(12)(6)(4)(7)(12)(13)(11)(1)(2)(6)(7)(7)(20)(3)(7)(6)(10)(16)(17)(21)(21)Yii框架form表单用法实例
投稿:shichen2014
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Yii框架form表单用法,实例分析了Yii中form表单的实现方法与相关技巧,非常具有实用价值,需要的朋友可以参考下
本文实例讲述了Yii框架form表单用法。分享给大家供大家参考。具体方法如下:
在 Yii 中处理表单时,通常需要以下步骤:
1. 创建用于表现所要收集数据字段的模型类。
2. 创建一个控制器动作,响应表单提交。
3. 在视图脚本中创建与控制器动作相关的表单。
一、创建模型
在编写表单所需的 HTML 代码之前,我们应该先确定来自最终用户输入的数据的类型,以及这些数据应符合什么样的规则。模型类可用于记录这些信息。正如模型章节所定义的,模型是保存用户输入和验证这些输入的中心位置。
取决于使用用户所输入数据的方式,我们可以创建两种类型的模型。如果用户输入被收集、使用然后丢弃,我们应该创建一个表单模型; 如果用户的输入被收集后要保存到数据库,我们应使用一个Active Record。两种类型的模型共享同样的基类 CModel ,它定义了表单所需的通用接口。
1、定义模型类
例如创建为一个表单模型:
代码如下:class LoginForm extends CFormModel
public $rememberMe=
LoginForm 中定义了三个属性: $username, $password 和 $rememberMe。他们用于保存用户输入的用户名和密码,还有用户是否想记住他的登录的选项。由于 $rememberMe 有一个默认的值 false,相应的选项在初始化显示在登录表单中时将是未勾选状态。
我们将这些成员变量称为特性(attributes)而不是属性(properties),以区别于普通的属性(properties)。特性(attribute)是一个主要用于存储来自用户输入或数据库数据的属性(propertiy)。
2、声明验证规则
一旦用户提交了他的输入,模型被填充,我们就需要在使用前确保用户的输入是有效的。这是通过将用户的输入和一系列规则执行验证实现的。我们在 rules() 方法中指定这些验证规则,此方法应返回一个规则配置数组。
代码如下:class LoginForm extends CFormModel
public $rememberMe=
private $_
public function rules()
return array(
array('username, password', 'required'), //username 和 password 为必填项
array('rememberMe', 'boolean'), //rememberMe 应该是一个布尔值
array('password', 'authenticate'), //password 应被验证(authenticated)
public function authenticate($attribute,$params)
$this-&_identity=new UserIdentity($this-&username,$this-&password);
if(!$this-&_identity-&authenticate())
$this-&addError('password','错误的用户名或密码。');
rules() 返回的每个规则必须是以下格式:
代码如下:array('AttributeList', 'Validator', 'on'=&'ScenarioList', ...附加选项)
其中的参数:
AttributeList(特性列表)是需要通过此规则验证的特性列表字符串,每个特性名字由逗号分隔;
Validator(验证器) 指定要执行验证的种类;
on 参数是可选的,它指定此规则应被应用到的场景列表;
附加选项 是一个名值对数组,用于初始化相应验证器的属性值。
二、form表单更新数据时候选值问题
category表和post表是多对多,有个中间表relationships,分别记着category_id和post_id
Post.php model中 有关系
代码如下:'cids'=&array(self::HAS_MANY,'Relationships','post_id'),
Category.php model中有方法:
代码如下:static public function getAllCategory(){
& return CHtml::listData(self::model()-&findAll(), 'id', 'name');
比如现在我要更新一条数据,这条数据的栏目有两个,假设该文章id是21,是属于两个栏目,那么在relationship表中的数据就应该是
代码如下:id post_id category_id
1&&& 21&&&&&&&&& 1
2&&& 21&&&&&&&&& 2
其中id是流水,该文章的category是1和2. 该栏目的数据我通过建立Relationship.php的AR能够获取,
_from中表单我是这么写的:
代码如下:&div class='row'&
& &?php echo $form-&labelEx($model,'cid'); ?&
& &?php echo $form-&checkBoxList($model,'cid',
&&& Category::getAllCategory(),array(
&&&& 'style'=&'display:',
&&&& 'separator'=&"&br /&n",
&&&& 'template'=&'{input}{label}',
&&&& 'labelOptions'=&array('style'=&'display:inline')));
& &?php echo $form-&error($model,'cid'); ?&
问题是我在_form 中不知道要肿么将数据填进去?就是我在更新数据的时候,栏目应该选中才对。
对于view层数据的解耦,抛开checkBoxList,用dropDownList来说举个例子:
1=&分类1,2=&分类2,表现层(view)中可能是''=&请选择,1=&分类1,2=&分类2。通过此,你想到了什么?
关于Behavior是这样的,Behavior只是一种解决方案,稍后再说。目前你要明白的是,你如果要为Model提供一个属性(像cid[]),需要考虑哪几点?(提示:要与CActiveRecord接地气)
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Yii中表单用法实例详解
作者:zm2714
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Yii中表单用法,结合实例形式较为详细的分析总结了Yii针对表单的各种常用操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
本文实例讲述了Yii中表单用法。分享给大家供大家参考,具体如下:
在 Yii 中处理表单时,通常需要以下步骤:
1. 创建用于表现所要收集数据字段的模型类。
2. 创建一个控制器动作,响应表单提交。
3. 在视图脚本中创建与控制器动作相关的表单。
一、创建模型
在编写表单所需的 HTML 代码之前,我们应该先确定来自最终用户输入的数据的类型,以及这些数据应符合什么样的规则。模型类可用于记录这些信息。正如模型章节所定义的,模型是保存用户输入和验证这些输入的中心位置。
取决于使用用户所输入数据的方式,我们可以创建两种类型的模型。如果用户输入被收集、使用然后丢弃,我们应该创建一个表单模型;
如果用户的输入被收集后要保存到数据库,我们应使用一个Active Record。两种类型的模型共享同样的基类 CModel,它定义了表单所需的通用接口。
1、定义模型类
例如创建为一个表单模型:
class LoginForm extends CFormModel
public $rememberMe=
LoginForm中定义了三个属性: $username, $password 和$rememberMe。他们用于保存用户输入的用户名和密码,还有用户是否想记住他的登录的选项。由于 $rememberMe 有一个默认的值false,相应的选项在初始化显示在登录表单中时将是未勾选状态。
我们将这些成员变量称为特性(attributes)而不是属性(properties),以区别于普通的属性(properties)。特性(attribute)是一个主要用于存储来自用户输入或数据库数据的属性(propertiy)。
2、声明验证规则
一旦用户提交了他的输入,模型被填充,我们就需要在使用前确保用户的输入是有效的。这是通过将用户的输入和一系列规则执行验证实现的。我们在 rules() 方法中指定这些验证规则,此方法应返回一个规则配置数组。
class LoginForm extends CFormModel
public $rememberMe=
private $_
public function rules()
return array(
array('username, password', 'required'), //username 和 password 为必填项
array('rememberMe', 'boolean'), //rememberMe 应该是一个布尔值
array('password', 'authenticate'), //password 应被验证(authenticated)
public function authenticate($attribute,$params)
$this-&_identity=new UserIdentity($this-&username,$this-&password);
if(!$this-&_identity-&authenticate())
$this-&addError('password','错误的用户名或密码。');
rules() 返回的每个规则必须是以下格式:
代码如下:array('AttributeList', 'Validator', 'on'=&'ScenarioList', ...附加选项)
AttributeList(特性列表)是需要通过此规则验证的特性列表字符串,每个特性名字由逗号分隔;
Validator(验证器) 指定要执行验证的种类;
on 参数是可选的,它指定此规则应被应用到的场景列表;
附加选项 是一个名值对数组,用于初始化相应验证器的属性值。
有三种方式可在验证规则中指定 Validator:
第一, Validator 可以是模型类中一个方法的名字,就像上面示例中的 authenticate 。验证方法必须是下面的结构:
代码如下:public function 验证器名称($attribute,$params) { ... }
第二,Validator可以是一个验证器类的名字,当此规则被应用时,一个验证器类的实例将被创建以执行实际验证。规则中的附加选项用于初始化实例的属性值。验证器类必须继承自 CValidator。
第三,Validator 可以是一个预定义的验证器类的别名。在上面的例子中,required 名字是 CRequiredValidator 的别名,它用于确保所验证的特性值不为空。下面是预定义的验证器别名的完整列表:
boolean: CBooleanValidator 的别名,确保特性有一个 CBooleanValidator::trueva lue 或 CBooleanValidator::falseva lue 值。
captcha: CCaptchaValidator 的别名,确保特性值等于 CAPTCHA 中显示的验证码。
compare: CCompareva lidator 的别名,确保特性等于另一个特性或常量。
email: CEmailValidator 的别名,确保特性是一个有效的Email地址。
default: CDefaultValueva lidator 的别名,指定特性的默认值。
exist: CExistValidator 的别名,确保特性值可以在指定表的列中可以找到。
file: CFileva lidator 的别名,确保特性含有一个上传文件的名字。
filter: CFilterValidator 的别名,通过一个过滤器改变此特性。
in: CRangeva lidator 的别名,确保数据在一个预先指定的值的范围之内。
length: CStringValidator 的别名,确保数据的长度在一个指定的范围之内。
match: CRegularExpressionValidator 的别名,确保数据可以匹配一个正则表达式。
numerical: CNumberValidator 的别名,确保数据是一个有效的数字。
required: CRequiredValidator 的别名,确保特性不为空。
type: CTypeva lidator 的别名,确保特性是指定的数据类型。
unique: CUniqueva lidator 的别名,确保数据在数据表的列中是唯一的。
url: CUrlValidator 的别名,确保数据是一个有效的 URL。
下面我们列出了几个只用这些预定义验证器的示例:
// 用户名为必填项
array('username', 'required'),
// 用户名必须在 3 到 12 个字符之间
array('username', 'length', 'min'=&3, 'max'=&12),
// 在注册场景中,密码password必须和password2一致。
array('password', 'compare', 'compareAttribute'=&'password2', 'on'=&'register'),
// 在登录场景中,密码必须接受验证。
array('password', 'authenticate', 'on'=&'login'),
3、安全的特性赋值
在一个类的实例被创建后,我们通常需要用最终用户提交的数据填充它的特性。这可以通过如下块赋值(massive assignment)方式轻松实现:
$model=new LoginF
if(isset($_POST['LoginForm']))
$model-&attributes=$_POST['LoginForm'];
最后的表达式被称作 块赋值(massive assignment) ,它将 $_POST['LoginForm'] 中的每一项复制到相应的模型特性中。这相当于如下赋值方法:
foreach($_POST['LoginForm'] as $name=&$value)
if($name 是一个安全的特性)
$model-&$name=$
检测特性的安全非常重要,例如,如果我们以为一个表的主键是安全的而暴露了它,那么攻击者可能就获得了一个修改记录的主键的机会,从而篡改未授权给他的内容。
特性如果出现在相应场景的一个验证规则中,即被认为是安全的。例如:
array('username, password', 'required', 'on'=&'login, register'),
array('email', 'required', 'on'=&'register'),
如上所示, username 和 password 特性在 login 场景中是必填项。而 username, password 和 email特性在 register 场景中是必填项。于是,如果我们在 login 场景中执行块赋值,就只有 username 和 password会被块赋值。因为只有它们出现在 login 的验证规则中。另一方面,如果场景是 register ,这三个特性就都可以被块赋值。
// 在登录场景中
$model=new User('login');
if(isset($_POST['User']))
$model-&attributes=$_POST['User'];
// 在注册场景中
$model=new User('register');
if(isset($_POST['User']))
$model-&attributes=$_POST['User'];
那么为什么我们使用这样一种策略来检测特性是否安全呢?背后的基本原理就是:如果一个特性已经有了一个或多个可检测有效性的验证规则,那我们还担心什么呢?
请记住,验证规则是用于检查用户输入的数据,而不是检查我们在代码中生成的数据(例如时间戳,自动产生的主键)。因此,不要为那些不接受最终用户输入的特性添加验证规则。
有时候,我们想声明一个特性是安全的,即使我们没有为它指定任何规则。例如,一篇文章的内容可以接受用户的任何输入。我们可以使用特殊的 safe 规则实现此目的:
代码如下:array('content', 'safe')
还有一个用于声明一个属性为不安全的 unsafe 规则:
代码如下:array('permission', 'unsafe')
unsafe 规则并不常用,它是我们之前定义的安全特性的一个例外。
4、触发验证
一旦模型被用户提交的数据填充,我们就可以调用 CModel::validate() 触发数据验证进程。此方法返回一个指示验证是否成功的值。对CActiveRecord& 模型来说,验证也可以在我们调用其 CActiveRecord::save() 方法时自动触发。
我们可以通过设置scenario属性来设置场景属性,这样,相应场景的验证规则就会被应用。
验证是基于场景执行的。 scenario属性指定了模型当前用于的场景和当前使用的验证规则集。例如,在 login 场景中,我们只想验证用户模型中的username 和 password 输入;而在 register 场景中,我们需要验证更多的输入,例如 email, address,等。下面的例子演示了如何在 register 场景中执行验证:
// 在注册场景中创建一个 User 模型。等价于:
// $model=new U
// $model-&scenario='register';
$model=new User('register'); //给模型类添加参数,该参数就是要触发的验证场景
// 将输入的值填充到模型
$model-&attributes=$_POST['User'];
// 执行验证
if($model-&validate())
// 如果输入有效
规则关联的场景可以通过规则中的 on 选项指定。如果 on 选项未设置,则此规则会应用于所有场景。例如:
public function rules()
return array(
array('username, password', 'required'),
array('password_repeat', 'required', 'on'=&'register'),
array('password', 'compare', 'on'=&'register'),
第一个规则将应用于所有场景,而第二个将只会应用于 register 场景。
5、提取验证错误
验证完成后,任何可能产生的错误将被存储在模型对象中。我们可以通过调用 CModel::getErrors()和CModel::getError()& 提取这些错误信息。这两个方法的不同点在于第一个方法将返回所有 模型特性的错误信息,而第二个将只返回第一个 错误信息。
6、特性标签
当设计表单时,我们通常需要为每个表单域显示一个标签。标签告诉用户他应该在此表单域中填写什么样的信息。虽然我们可以在视图中硬编码一个标签,但如果我们在相应的模型中指定(标签),则会更加灵活方便。
默认情况下 CModel 将简单的返回特性的名字作为其标签。这可以通过覆盖 attributeLabels() 方法自定义。正如在接下来的小节中我们将看到的,在模型中指定标签会使我们能够更快的创建出更强大的表单。
二、创建动作
有了模型,我们就可以开始编写用于操作此模型的逻辑了。我们将此逻辑放在一个控制器的动作中。对登录表单的例子来讲,相应的代码就是:
public function actionLogin()
$model=new LoginF
if(isset($_POST['LoginForm']))
// 收集用户输入的数据
$model-&attributes=$_POST['LoginForm'];
// 验证用户输入,并在判断输入正确后重定向到前一页
if($model-&validate())
$this-&redirect(Yii::app()-&user-&returnUrl); //重定向到之前需要身份验证的页面URL
// 显示登录表单
$this-&render('login',array('model'=&$model));
如上所示,我们首先创建了一个 LoginForm 模型示例;如果请求是一个 POST 请求(意味着这个登录表单被提交了),我们则使用提交的数据$_POST['LoginForm'] 填充 $model;然后我们验证此输入,如果验证成功,重定向用户浏览器到之前需要身份验证的页面。如果验证失败,或者此动作被初次访问,我们则渲染 login视图,此视图的内容将在后续章节中讲解。
提示: 在 login 动作中,我们使用Yii::app()-&user-&returnUrl& 获取之前需要身份验证的页面URL。 组件Yii::app()-&user 是一种 CWebUser (或其子类) ,它表示用户会话信息(例如用户名,状态)。
让我们特别留意一下 login 动作中出现的下面的 PHP 语句:
代码如下:$model-&attributes=$_POST['LoginForm'];
正如我们在 安全的特性赋值 中所讲的,这行代码使用用户提交的数据填充模型。 attributes 属性由 CModel定义,它接受一个名值对数组并将其中的每个值赋给相应的模型特性。因此如果 $_POST['LoginForm']给了我们这样的一个数组,上面的那段代码也就等同于下面冗长的这段 (假设数组中存在所有所需的特性):
$model-&username=$_POST['LoginForm']['username'];
$model-&password=$_POST['LoginForm']['password'];
$model-&rememberMe=$_POST['LoginForm']['rememberMe'];
注意: 为了使 $_POST['LoginForm'] 传递给我们的是一个数组而不是字符串,我们需要在命名表单域时遵守一个规范。具体的,对应于模型类 C 中的特性 a 的表单域,我们将其命名为 C[a] 。例如,我们可使用LoginForm[username] 命名 username 特性相应的表单域。
现在剩下的工作就是创建 login 视图了,它应该包含一个带有所需输入项的 HTML 表单。
三、创建表单
编写 login 视图是很简单的,我们以一个 form 标记开始,它的 action 属性应该是前面讲述的 login动作的URL。然后我们需要为 LoginForm类中声明的属性插入标签和表单域。最后,我们插入一个可由用户点击提交此表单的提交按钮。所有这些都可以用纯HTML代码完成。
Yii 提供了几个助手(helper)类简化视图编写。例如,要创建一个文本输入域,我们可以调用 CHtml::textField();要创建一个下拉列表,则调用 CHtml::dropDownList()。
例如, 如下代码将生成一个文本输入域,它可以在用户修改了其值时触发表单提交动作。
代码如下:CHtml::textField($name,$value,array('submit'=&''));
下面,我们使用 CHtml& 创建一个登录表单。我们假设变量 $model 是 LoginForm 的实例。
上述代码生成了一个更加动态的表单,例如, CHtml::activeLabel()生成一个与指定模型的特性相关的标签。如果此特性有一个输入错误,此标签的CSS class 将变为 error,通过 CSS样式改变了标签的外观。相似的, CHtml::activeTextField() 为指定模型的特性生成一个文本输入域,并会在错误发生时改变它的CSS class。
我们还可以使用一个新的小物件 CActiveForm& 以简化表单创建。这个小物件可同时提供客户端及服务器端无缝的、一致的验证。使用 CActiveForm, 上面的代码可重写为:
beginWidget('CActiveForm'); ?&
errorSummary($model); ?&
label($model,'username'); ?&
textField($model,'username') ?&
label($model,'password'); ?&
passwordField($model,'password') ?&
checkBox($model,'rememberMe'); ?&
label($model,'rememberMe'); ?&
endWidget(); ?&
四、收集表格输入
有时我们想通过批量模式收集用户输入。也就是说,用户可以为多个模型实例输入信息并将它们一次性提交。我们将此称为 表格输入(tabular input) ,因为这些输入项通常以 HTML 表格的形式呈现。
要使用表格输入,我们首先需要创建或填充一个模型实例数组,取决于我们是想插入还是更新数据。然后我们从 $_POST变量中提取用户输入的数据并将其赋值到每个模型。和单模型输入稍有不同的一点就是:我们要使用 $_POST['ModelClass'][$i]提取输入的数据而不是使用 $_POST['ModelClass']。
public function actionBatchUpdate()
// 假设每一项(item)是一个 'Item' 类的实例,
// 提取要通过批量模式更新的项
$items=$this-&getItemsToUpdate();
if(isset($_POST['Item']))
foreach($items as $i=&$item)
if(isset($_POST['Item'][$i]))
$item-&attributes=$_POST['Item'][$i];
$valid=$valid && $item-&validate();
if($valid) // 如果所有项目有效
// ...则在此处做一些操作
// 显示视图收集表格输入
$this-&render('batchUpdate',array('items'=&$items));
准备好了这个动作,我们需要继续 batchUpdate 视图的工作以在一个 HTML 表格中显示输入项。
NamePriceCount
Description
$item): ?&
注意,在上面的代码中我们使用了 "[$i]name" 而不是 "name" 作为调用 CHtml::activeTextField 时的第二个参数。
如果有任何验证错误,相应的输入项将会自动高亮显示,就像前面我们讲解的单模型输入一样。
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 yii2 ajax 提交表单 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信