2013-09-15 4 views
0

Я сохраняю данные, отправленные из формы.Изменение данных CakePHP во время проверки и beforeSave не сохраняется с изменениями

В контроллере я делаю:

$this->User->create(); 
$this->User->save($this->request->data) 

> request-> данные $ this- выглядит следующим образом:

'User' => array(
    'password' => '*****', 
    'username' => 'ddddd', 
    'role' => '256/aa01bdf80d42beb48dd3225acddf447fdd7a39f3', 
    'parent_id' => '0/b6ba9bd57f6c70cf738891d4c6fac22abed4161d' 
) 

Существуют правила проверки, что работает на 'роль' и " parent_id ", чтобы гарантировать, что идентификаторы role/parent являются теми, к которым пользователь может получить доступ.

Валидация изменяет значения полей, если данные действительны.

У меня также есть поведение дерева, которое задает некоторые поля дерева в файле beforeSave() в поведении.

Правило проверки записывает изменение в $this->data->[$model][$field], как показано ниже.

public function checkListHash($check, $field) { 
    $explodedCheck = explode('/', $check[$field]); 
    if ($this->secureId($explodedCheck[0], $explodedCheck[1])) { 
     $this->data['User'][$field] = $explodedCheck[0]; 
     return true; 
    } 
    return false; 
} 

beforeFilter() в поведении изменяется массив данных с заявлениями, как это:

$Model->data[$Model->alias][$ancestors] = $ancestorList; 

Когда проверка и beforeFilter() обработка завершена, у меня есть красивый и правильный массив данные по $this->User->data который выглядит следующим образом:

'User' => array(
    'password' => '*****', 
    'active' => '0', 
    'role' => '256', 
    'parent_id' => '0', 
    'node' => '0', 
    'username' => 'ddddd', 
    'modified' => '2013-09-15 09:55:02', 
    'created' => '2013-09-15 09:55:02', 
    'ancestor_list' => ',0,' 
) 

Однако $this->request->data неизменна. И это то, что спасает.

Ясно, что я не понимаю отношения этих различных способов доступа к данным. Я пробовал различные способы для решения данных в трех контекстах:

  • Контроллер
  • Модель
  • Поведение

И я попытался $this->User->create($this->request->data); до контроллера экономии() заявление.

В контроллере, что я вижу, как доступные массивы данных:

  • ПРИОР К SAVE
  • $ this-> request-> данные = $ this-> данные = собственных данных из форма
  • $ this-> User-> данные = некоторые по умолчанию, безлюдной массив

  • ДО Чеховой, когда я использую $ this-> user-> создать ($ this-> request-> данные)

  • все три массивы содержат необработанные данные формы

  • после сохранения в любом случае

  • $ этом-> request-> данные = $ этом-> данные = точно так, как перед
  • $ этом-> Пользователь -> данные = правильно массированные данные

Может ли кто-нибудь меня разобраться?

Дон Drake

+0

данные не передаются по ссылке (к модели), поэтому они будут внутри модели, скорее всего, будут отличаться от контроллера после модификации. Это основной ООП. Какова ваша проблема сейчас? Обратите внимание, что вам просто нужно сделать '$ this-> request-> data = $ this-> Model-> data', чтобы снова получить последние данные в контроллере (обычно это необязательно). – mark

+0

Чтобы прояснить одну маленькую точку, данные $ this-request не изменяются, и сохранение не выполняется, хотя нет ошибок проверки или других ошибок, которые я вижу. – user2378787

+0

Вы проверили '$ this-> Model-> validationErrors'? Он содержит ошибки. – mark

ответ

1

Просто объяснить массивы данных для вас, когда вы отправите форму, данные из него хранятся в $this->request->data на контроллере. Затем вы изменяете $this->User->data внутри модели, которая представляет собой другой массив на самой модели. Это не повлияет на $this->request->data, потому что это совершенно другой массив, который принадлежит контроллеру, и модель не знает об этом.

Затем вы сохраняете модель пользователя, используя данные запроса, которые остаются неизменными с момента отправки формы. Это логичное и нормальное поведение, потому что на самом деле вы не используете массив $this->User->data, который вы изменили.

Сохранение всегда может быть неудачным, поскольку данные, которые пытается сохранить модель, не являются обновленными данными, это всего лишь основные данные от $this->request->data.

Попробуйте это:

$this->User->set($this->request->data); 
$this->User->save(); 

Кроме того, если вы используете beforeSave в вашей модели, убедитесь, что метод возвращает true, или он никогда не будет на самом деле идти, чтобы сэкономить.

 Смежные вопросы

  • Нет связанных вопросов^_^