在yii2应用程序中,我有User
模型。例如,我有字段name
和is_admin
(0或1)。
当用户注册时,他只输入name
。
他有user/update
页面来编辑他的name
。但是,如果您是管理员,您还可以编辑每个人页面并设置is_admin
字段(对于管理员,它在页面上可见)。
规则如下:
public function rules()
{
return [
['name', 'string'],
['is_admin', 'integer'],
];
}
问:如何通过添加另一个user/update
来保护能力用户从<input name="User[...]">
页面设置管理员的操作?
这意味着每个人都可以将输入属性name="User[name]"
替换为name="User[is_admin]"
,并将值设置为1
。然后$model->load(Yii::$app->request->post())
自动设置is_admin
var。
是的,我可以在is_admin
中手动清空$_POST
,但在实际项目中我在db表中有20多个字段并且有很多操作,每次查看我有哪些输入都很难在每个视图中进行比较。
控制器:
$model = User::findIdentity($id);
if ($model->load(Yii::$app->request->post())) {
if ($model->save())
...
}
答案 0 :(得分:1)
使用scenario
。例如:
在model
const SCENARIO_USER_SAVE = 'user-save'; // anything you want to call your scenario
public function scenarios()
{
return [
self::SCENARIO_USER_SAVE => ["field1","field2"], // list only the fields you will allow user to update
];
}
现在在controller
中使用方案
$model = User::findIdentity($id);
$model->scenario = User::SCENARIO_USER_SAVE; // use the scenario
if ($model->load(Yii::$app->request->post())) {
if ($model->save())
...
}
注意,当您执行时,方案中不允许的字段将具有 NULL
值
$model->load(Yii::$app->request->post())
无论您通过表单发送什么
更新:在调用$model->save()
(我已对其进行测试)时,不会更新/保存场景中不允许的其他字段
详情指南:http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios
答案 1 :(得分:1)
在这种情况下,您可以使用ActiveRecord
beforeValidate
,类似:
class User extends ActiveRecord
{
public function beforeValidate(){
//If User Role is Not Admin $user is User ActiveRecord Object
if($user->role === 'user'){
$this->is_admin = 0;
}
parent::beforeValidate();
}
}