CakePHP: сохранение пользовательских данных. Все молча не удается? - PullRequest
1 голос
/ 18 марта 2012

У меня есть модель пользователя, которая имеет много инструментов и жанров. Инструмент и жанр сохраняются при использовании приведенного ниже кода:

$this->User->saveAll($this->data, array(
                'fieldList' => array('User', 'UserInstrument', 'Genre')))
        )

Но Пользователь этого не делает. Все массивы invalidFields пусты в моем отладчике (User, UserInstrument, Genre, UserGenre, Instrument).

Одна странная вещь, которую я замечаю, это то, что здесь:

public function beforeSave() {
        // get the password reset
        if(isset($this->data[$this->alias]['password_reset'])) {
            $this->data[$this->alias]['password'] = $this->data[$this->alias]['password_reset'];
            unset($this->data[$this->alias]['password_reset']);
        }
        // get rid of the password confirm
        if(isset($this->data[$this->alias]['password_confirm'])) {
            unset($this->data[$this->alias]['password_confirm']);
        }
        // hash the password
        if (isset($this->data[$this->alias]['password'])) {
            $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
        }
        return true;
    }

Я сбрасываю password_reset и password_confirm, но после того, как сохранение завершено, эти поля волшебным образом появляются в $this->data['User'] (вероятно, повторно взяты из $_POST). Но если при сохранении произошла ошибка, saveAll вернет false. В моем журнале ошибок ничего нет.

Есть идеи, почему это молча проваливается? Спасибо!

Ответы [ 2 ]

1 голос
/ 20 марта 2012

, если ваша цель - использовать хеширование для вновь созданных пользователей, пожалуйста, обратитесь к this

Особенно функция beforeSave, которая просто

public function beforeSave() {
    if (isset($this->data[$this->alias]['password'])) {
        $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
    }
    return true;
}

Пожалуйста, поймите, что в CakePHP, если вы включите поле, которого на самом деле НЕ в данных для моделей, это поле будет игнорироваться. Поэтому вам не нужно делать сброс для полей password_reset и password_confirm.

Что касается сохранения связанных записей и использования fieldList, я заметил, что вы явно не указали поля, которые хотите сохранить, в ключе fieldList массива.

Кроме того, вы указали, что у пользователя есть много инструментов, а у пользователя есть много жанров.

Пожалуйста, используйте способ сохранения ассоциированный.

Подготовьте ваши данные в контроллере следующим образом:

$this->data['Instrument'] = array(
    array('instrument_field1'=>'v1',
           'instrument_field2' => 'v2',
         ),// first instrument
    array('instrument_field1' => 'v1',
          'instrument_field2' => 'v2')// second instrument
);

$this->data['Genre'] = array(
    array('field1'=>'v1',
           'field2' => 'v2',
         ),// first genre
    array('field1' => 'v1',
          'field2' => 'v2')// second genre
);

ИЛИ в ваших формах вы делаете что-то вроде этого:

$this->Form->input('Instrument.0.field1'); // for the first instrument 
$this->Form->input('Instrument.1.field1'); // for the second instrument

Прокомментируйте мой ответ, если я неправильно понял вопрос.

0 голосов
/ 13 апреля 2012

Я достал fieldList. Не самое безопасное решение, но это просто вызвало больше хлопот, чем оно того стоило.

...