У меня возникла та же проблема с моделью hasMany (где форма имела числовые индексированные поля), и я нашел решение для проверки, которое работало для меня.
Быстрый ответ : Прежде чем пытаться действительно сохранить данные, я проверил данные отдельно, например (уведомление «validate» => «only»):
if($this->ModelName->saveAll($this->data, array('validate' => 'only'))) {
// proceed to save...
}
При таком способе я получил сообщение об ошибке проверки модели в форме прямо под полем ввода, которое не прошло проверку (обычный способ отображения ошибки проверки Cake).
Примечание: Я не мог использовать saveAll () для фактического сохранения моих данных (я объясню почему через минуту).Если бы я мог использовать saveAll () для фактического сохранения данных, я мог бы получить проверку одновременно с сохранением, используя (уведомление 'validate' => 'first'):
if($this->ModelName->saveAll($this->data, array('validate' => 'first')))
ОднакоЯ не мог использовать saveAll () для фактического сохранения данных, поскольку мне нужно было использовать транзакцию для сохранения нескольких моделей одновременно, когда некоторые из моделей не были напрямую связаны с другими моделями.saveAll () сохранит только модель, для которой он вызывается, плюс модели, непосредственно связанные с ним.Поскольку Cake в настоящее время не поддерживает вложенные транзакции, а saveAll () использует одну транзакцию автоматически, мне пришлось использовать save () на моих моделях, а также запускать и завершать транзакцию вручную.Однако это привело к тому, что я потерял сообщение проверки в моей форме на элементах hasMany, даже если я сохранил, используя «$ this-> ModelName-> save ($ this-> data, array ('validate' => 'first')) ".
Дальнейшее объяснение : Кажется, проблема связана с использованием числовых индексированных полей в форме. Например:
$this->Form->input("ModelName.0.field_name");
ItКажется, эта схема индексации является правильным способом обработки элементов hasMany в форме, но сообщения проверки не могут найти пути к этой форме ввода. Интересно отметить, что мое представление действительно имело доступ к ошибка проверки. Это можно увидеть в представлении с помощью (обратите внимание, что в этих строках нет числового индекса):
if($this->Form->isFieldError("ModelName.field_name")) {
echo $this->Form->error("ModelName.field_name");
}
Помещение этих строк после ввода '$ this-> Form-> input ("ModelName.0.field_name ") 'вставил сообщение проверки на страницу, но не в том же div, что и поле ввода (и, таким образом, оно не выглядело идеально).
Я не мог найти способсказать Cake использовать это сообщение проверки вe '$ this-> Form-> input ("ModelName.0.field_name")'.Поэтому я прибег к описанному выше методу validate = only, который хорошо работает для меня.