CakePHP: обновление нескольких полей для одной строки (не мешая другим) - PullRequest
1 голос
/ 15 октября 2011

Я пытаюсь обновить только некоторую информацию для пользователя. В частности, я не хочу менять пароль. Итак, у меня есть хорошая форма с данными, которые я хочу изменить, и мой контроллер готов их получить, даже указав поля в $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 ]

2 голосов
/ 17 октября 2011

установите для поля «требуется» значение «ложь».Если вы хотите сохранить определенные поля, помните, что Model-> save () имеет следующую подпись:

save(array $data = null, boolean $validate = true, array $fieldList = array())
2 голосов
/ 15 октября 2011

Добавьте 'on' => 'create' к правилу проверки. Таким образом, проверка пароля выполняется только при создании записи.

Если вы хотите сохранить проверку пароля для некоторых случаев позже (например, когда пользователь действительно хочет изменить свой пароль), добавьте другое подобное правило, но с 'on' => 'update' и 'required' => false.

1 голос
/ 16 октября 2011

Почему бы не сохранить вручную () там?Вместо


$this->User->save()

попробуйте


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

ОБНОВЛЕНО

0 голосов
/ 17 октября 2011

Я бы использовал поведение для этого.они могут быть прикреплены по требованию - в любом из этих действий register / change_pw у вас может быть http://www.dereuromark.de/2011/08/25/working-with-passwords-in-cakephp/

, таким образом, вы не ограничены «созданием» или другими вещами.просто прикрепите поведение и добавьте поле pwd в форму.вот и все.

0 голосов
/ 15 октября 2011
//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;
}
...