2013-02-23 4 views
0

У меня есть список записей пользователя, которые я сохраняю за один раз (форма заполняется из загруженного CSV).Ошибки Vallidation с saveAll в CakePHP

Все, кажется, работает нормально, и мои правила проверки соблюдаются, но одна вещь, которая ускользает от меня, - это конкретные сообщения об ошибках проверки.

Я получаю общую ошибку проверки (если, скажем, поле, которое должно быть уникальным, это не так), но я не получаю ошибку в конкретном поле, чтобы пользователь знал, что представляет собой настоящая проблема.

Это ошибка, или что-то не так с моим кодом? Вот действие от моего контроллера (FWIW я передаю данные в формате CSV для этого действия от другого действия, следовательно, сниппета в начале):

public function finalizeCsv() { 
    if (isset($this->request->params['named']['csvData'])) { 
     $csvData = unserialize($this->request->params['named']['csvData']); 
    } else { 
     $csvData = $this->request->data; 
    } 
    $this->set('users', $csvData); 
    if ($this->request->is('get')) { 
     $this->request->data = $csvData; 
    } 
    if ($this->request->is('post') || $this->request->is('put')) { 
     if ($this->User->saveAll($this->request->data)) { 
      $this->Session->setFlash('Users added!', 'default', array('class' => 'success')); 
      $this->redirect(array('action' => 'index')); 
     } else { 
      $this->Session->setFlash('There were errors with your data.'); 
     } 
    } 
} 
+0

попробуйте изменить SaveAll() в '$ this-> User-> SaveAll ($ this-> request-> данные)' – Costa

+0

Из-за того, как мои данные прихода, я должен срывать массив изнутри Это. Я могу реорганизовать, но действительно ли это имеет значение? Все сохраняет и проверяет правильность, я просто не получаю конкретных ошибок. –

+0

Рефакторинг, без изменений. Все мое сохранение недействительно, поэтому я знаю, что мои правила проверки соблюдаются, но конкретные ошибки не появляются в посягающих полях. –

ответ

1

Для уникальных полей добавить правило проверки

'field_name' => array(
    'rule' => 'isUnique', 
    'required' => 'create' 
), 

Далее - при появлении ошибки вам необходимо будет просмотреть $this->User->validationErrors. Будет много массивов внутри - 1 для каждой созданной записи. Пропустите их, соберите ошибки и отправьте их в $ this-> Session-> setFlash().
Также вы можете обернуть $this->User->saveAll($this->request->data) в транзакцию, если используете InnoDB или другой движок, поддерживающий транзакции. При ошибке - выполните откат и повторите попытку.

$ds = $this->User->getDataSource(); 
$ds->begin(); 
// > saving here < // 
$ds->commit(); //< on success 
$ds->rollback(); //< on error 
+0

The InnoDB - отличный совет. Я не уверен, действительно ли вы прочитали этот вопрос. 1) У меня есть правила проверки, которые работают нормально. 2) Я могу вернуть общую вспышку Auth. 3) Проблема состоит в том, что ошибки, связанные с полем, не появляются, как и при сохранении одной записи. –

+0

Вы не указали свои правила проверки, поэтому я предположил, что вы, возможно, пропустили ('rule' => 'isUnique'). ОК. Давайте сделаем diag =) 1) у вас есть правило «isUnique» для поля 2) у вас нет ошибки Php или ошибки БД при сохранении дублирующего элемента; 3) вы получаете false из saveAll(); 4) $ this-> User-> validationErrors пустые (обратите внимание, что формат массива отличается от метода one()() производит); 5) вам удалось сохранить как минимум 1 пакет пользователей, и это было успешно. 6) режим отладки включен. – Swayok

+0

Если все выше верно - тогда вам лучше использовать foreach() и User-> create(); User-> сохранить ($ oneRecord). Они, по крайней мере, работают как ожидалось =) – Swayok

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