如何仅更新Yii框架中的某些字段?

I'm*_*ker 9 php yii

在此输入图像描述

我不想更新密码fields.how使用this.Im使用md5编码为password.So我不想更新yii框架中的密码字段.任何帮助赞赏?

sla*_*.bg 7

我认为更好的方法是在这种情况下不使用场景.规则中的下一个代码只是对场景说:下一个字段是必需的.但不是:跳过其他人.

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),您需要输入两次新密码.