首页 >后端开发 >php教程 >php yii框架模型的场景属性问题

php yii框架模型的场景属性问题

WBOY
WBOY原创
2016-06-06 20:44:20951浏览

Yii在模型中有个场景属性(scenario),文档(http://www.yiiframework.com/doc/guide/1.1/zh_cn/form.model)中提到如果在场景中执行块赋值,就只有出现在该场景验证规则中的特性会被块赋值,例如:

<code class="lang-php">array('username, password', 'required', 'on'=>'login, register'),
array('email', 'required', 'on'=>'register'),
</code>

如果我们在login场景中执行块赋值,就只有username和password会被块赋值,因为只有它们出现在login场景的验证规则中。 如果场景是register,这三个特性就都会被块赋值。

在实际的应用中,创建一个LoginForm模型拥有“username, password, email”三个属性并设置默认值,然后在控制器中执行:

<code class="lang-php">$model = new LoginForm('login');
$model->attributes = $_POST;      // $_POST = array('username' => 'value', 'password' => 'value');
</code>

此时得到的$model->attributes属性中还是含有LoginForm模型所有的3个属性的,不知道要怎样才能得到经过验证器过滤后只含有username和password这两个键的属性,因为可能我需要将这两个字段插入数据库但是不需要有email属性,或者我需要将这两个属性输出到视图中附加到URL参数后面

另外咨询下Yii::app()->clientScript->registerCssFile该方法在视图中调用怎么自定义插入位置,默认会插入到title标签的前面,这样不太美观,另外不能自定义位置也可能跟插件或其它的样式冲突。

回复内容:

Yii在模型中有个场景属性(scenario),文档(http://www.yiiframework.com/doc/guide/1.1/zh_cn/form.model)中提到如果在场景中执行块赋值,就只有出现在该场景验证规则中的特性会被块赋值,例如:

<code class="lang-php">array('username, password', 'required', 'on'=>'login, register'),
array('email', 'required', 'on'=>'register'),
</code>

如果我们在login场景中执行块赋值,就只有username和password会被块赋值,因为只有它们出现在login场景的验证规则中。 如果场景是register,这三个特性就都会被块赋值。

在实际的应用中,创建一个LoginForm模型拥有“username, password, email”三个属性并设置默认值,然后在控制器中执行:

<code class="lang-php">$model = new LoginForm('login');
$model->attributes = $_POST;      // $_POST = array('username' => 'value', 'password' => 'value');
</code>

此时得到的$model->attributes属性中还是含有LoginForm模型所有的3个属性的,不知道要怎样才能得到经过验证器过滤后只含有username和password这两个键的属性,因为可能我需要将这两个字段插入数据库但是不需要有email属性,或者我需要将这两个属性输出到视图中附加到URL参数后面

另外咨询下Yii::app()->clientScript->registerCssFile该方法在视图中调用怎么自定义插入位置,默认会插入到title标签的前面,这样不太美观,另外不能自定义位置也可能跟插件或其它的样式冲突。

此时得到的$model->attributes属性中还是含有LoginForm模型所有的3个属性的,不知道要怎样才能得到经过验证器过滤后只含有username和password这两个键的属性,因为可能我需要将这两个字段插入数据库但是不需要有email属性

即使得到的是3个属性值,但是也就会验证场景login下的属性值,其他场景不做验证。
如果非要得到其中2个属性值,可以参考下面的写法。

<code class="lang-php">//rule
array('username, password', 'required', 'on'=>'login, register'),
array('email', 'required', 'on'=>'register'),
</code>
<code class="lang-php">//controller
$model = new LoginForm('login');
$model->username= $_POST['username'];
$model->username= $_POST['password'];  
// $_POST = array('username' => 'value', 'password' => 'value');
</code>

实际的应用中,比如编辑和新增使用一个表单模型来做数据验证(这里先不考虑AR)其中有一个字段“field”默认值是“1”,该字段新增记录的时候会做修改。

如果数据库中已有一条记录,此时上来一个编辑该条记录的请求(POST不包含“field”字段),使用表单模型进行验证,$model->attributes = $_POST,得到的attributes属性中是会包含“field”字段,且值会为1,那这时如果用attributes属性执行update就会出现错误的修改。

本身用attributes特性赋值就是为了方便,如果我POST里有大量数据一条条赋值就太累了。

在使用“validate()”方法做验证时,就只有出现在该场景验证规则中的特性才会做验证,但是要怎么获取经过验证后的结果呢?

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn