Ошибки проверки CakePHP 1.3 не отображаются с числовым индексированным массивом - PullRequest
2 голосов
/ 10 июня 2011

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

По сути, валидация корректно распознает поля, которые не имеют значений, когда должны,однако сообщения об ошибках «автоматически» не отображаются под полями ввода.

Ниже показано правило проверки модели:

var $validate = array(
    'description' => array(
        'rule' => 'notEmpty',
        'required' => true,
        'allowEmpty' => false,
        'message' => 'Please enter a description of the change'
    )
);

echo pr ($ this-> data);вывод показан ниже:

Array
(
[Change] => Array
    (
        [0] => Array
            (
                [id] => 3237
                [cn_id] => 5132
                [req_id] => 25
                [description] => 
            )

        [1] => Array
            (
                [id] => 3238
                [cn_id] => 5132
                [req_id] => 22
                [description] => 
            )

        [2] => Array
            (
                [id] => 3239
                [cn_id] => 5132
                [req_id] => 4
                [description] => 
            )

    )

)

echo pr ($ this-> Change-> invalidFields ());вывод показан ниже:

Array
(
[0] => Array
    (
        [description] => Please enter a description of the change
    )

[1] => Array
    (
        [description] => Please enter a description of the change
    )

[2] => Array
    (
        [description] => Please enter a description of the change
    )

[description] => Please enter a description of the change
)

Итак, он генерирует сообщения об ошибках для отображения, но они фактически не отображаются в представлении, и я не знаю почему?

Выдержка из кода 'view' показана ниже:

<?php echo $form->input('Change.'.$i.'.description', 
array('value' => $cn['Change'][$i]['description'],
    'label' => $engReq['Req']['description'])); ?>  

У кого-нибудь есть идеи, почему сообщения об ошибках не отображаются?

Ответы [ 2 ]

1 голос
/ 09 августа 2011

У меня возникла та же проблема с моделью 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, который хорошо работает для меня.

0 голосов
/ 10 июня 2011

не должно быть

var $validate = array(
  'description' => array(
    'notEmpty' => array(
        'rule' => 'notEmpty',
        'required' => true,
        'allowEmpty' => false,
        'message' => 'Please enter a description of the change'
    )
  )
);

?

...