CakePHP:为一行更新多个字段(不会弄乱其他行)

时间:2011-10-15 17:26:05

标签: cakephp cakephp-1.3

我正在尝试仅为用户更新某些信息。具体来说,我不想更改密码。所以我有一个很好的表单,我想要更改的数据和我的控制器准备好接收它,甚至指定$model->save($param)中的字段。

我让控制器准备好验证所有内容,包括所需密码。但我不需要验证它,因为我没有改变它。即便如此,我收到验证错误,告诉我密码是必需的。

我只想更改某些特定字段,我希望只在一个查询中执行此操作(将$model->saveField()从游戏中删除)。
这可能吗?

我的控制器:

if (!empty($this->data)) {
    $this->User->set($this->data);
    if ($this->User->save()) {
        //do stuff
    }
}

数据数组只包含从表单发送的字段,其中不包含密码,但仍然出现验证错误。

在模型中,我有以下验证规则:

'passwordConfirmacion' => array(
    'camposIdenticos' => array(
        'rule' => array('camposIdenticos', 'password'),
        'message' => 'La confirmacion no coincide',
        'required' => true,
        'allowEmpty' => false,
    ),

function camposIdenticos($data, $comparacion) {
    $temp = array_keys($data);
    $campo = $temp[0];
    return $data[$campo] === $this->data['User'][$comparacion];
}

5 个答案:

答案 0 :(得分:2)

'on' => 'create'添加到验证规则。这样,只有在创建记录时才能验证密码。

如果您希望稍后针对某些情况保留密码验证(例如,当用户确实想要更改其密码时),请使用'on' => 'update''required' => false添加其他类似规则。

答案 1 :(得分:2)

为密码字段将'required'设置为false。 如果要保存某些字段,请记住Model-> save()具有以下签名:

save(array $data = null, boolean $validate = true, array $fieldList = array())

答案 2 :(得分:1)

为什么不在那里手动保存()? 而不是


$this->User->save()


    $this->User->id = $id;
    $this->User->save(array('User'=>array('field1'=>'value1','field2'=>'value2')));

<强>已更新

答案 3 :(得分:0)

//user.php
function beforeValidate() {
    if ( isset( $this->data['User']['custom_validation'] ) ) { // or another flag
        $validationSet = array();
        switch ($this->data['User']['custom_validation']) {
            case 'profile':
                if ( !empty($this->data['User']['passwd']) || !empty($this->data['User']['passwd_confirm']) ) {         
                    $validationSet['passwd'] = $this->validate['passwd'];
                    $validationSet['passwd_confirm'] = $this->validate['passwd_confirm'];                           
                }
            break;
        }
        $this->validate = $validationSet;       
    }
    return true;
}

答案 4 :(得分:0)

我会使用此行为。 它们可以根据需要附加 - 在您可能拥有的任何register / change_pw操作中 http://www.dereuromark.de/2011/08/25/working-with-passwords-in-cakephp/

这样你不仅限于“创造”或其他东西。只需附加行为并在表单中添加pwd字段。多数民众赞成。