我认为更好的方法是在这种情况下不使用场景.规则中的下一个代码只是对场景说:下一个字段是必需的.但不是:跳过其他人.
array('name, username, email', 'required', 'on' => 'update'),
Run Code Online (Sandbox Code Playgroud)
例如,如果我们将密码的长度限制为最多32个字符,但是在数据库中以sha1(长度为40)的格式存储,那么我们就会遇到问题,因为验证器会阻止数据库查询.这是因为当你更新时,"validatе"方法检查所有类属性(关于数据库表映射),而不仅仅是post发送的新属性.
可以使用方法"saveAttributes",但后来我注意到了另一个问题.如果列"email"在数据库中是唯一的并且在编辑的电子邮件中复制了一个现有的,则规则中定义的Yii消息系统无法通知并抛出错误代码关于数据库查询.
我认为最简单的方法是:在这种情况下不要设置场景.只需将您想要的属性作为参数发送.这将保留GII创建的所有CRUD功能.
在您的代码中它看起来像这样:(在模型中)
public function rules() {
return array(
array('name, username, email, password', 'required'),
);
}
Run Code Online (Sandbox Code Playgroud)
(在控制器中)
if($id==Yii::app()->user->id){
$model=$this->loadModel($id);
if(isset($_POST['JbJsJobResume'])) {
$model->attributes=$_POST['JbJsJobResume'];
if($model->save(true, array('name', 'username', 'email')))
$this->redirect(array('view','id'=>$model->id));
}
$this->render('update',array( 'model'=>$model, ));
}
Run Code Online (Sandbox Code Playgroud)
我注意到你不使用RBAC.它非常方便灵活 - 试一试.
http://www.yiiframework.com/doc/guide/1.1/en/topics.auth#role-based-access-control
小智 5
在你的模型中你必须做这样的事情:
public function rules() {
return array(
array('name, username, email, password', 'required', 'on' => 'create'),
array('name, username, email', 'required', 'on' => 'update'),
);
}
Run Code Online (Sandbox Code Playgroud)
让我们说你现在运行的场景是更新.所以我不需要密码.我只在你可能拥有的创建场景中需要它.因此,在视图文件中,您删除了密码字段,并在您拥有的操作中包含以下内容:
$model->setScenario('update');
Run Code Online (Sandbox Code Playgroud)
所以它不需要密码,它将保持不变.
对于密码更改,您可以创建一个新操作(例如actionPassChange),您需要输入两次新密码.