2

我查看了大量关于未显示验证错误的论坛并尝试了各种方法但无济于事......

基本上,验证正确地识别出字段没有值时应该有值,但是错误消息不会“自动”出现在输入框下方。

模型验证规则如下图所示:

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

回声 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
)

所以,它正在生成要显示的错误消息,但它们实际上并没有显示在视图中,我不知道为什么?

“视图”代码的摘录如下所示:

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

有没有人知道为什么错误消息没有显示?

4

2 回答 2

1

我在使用 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");

似乎这种索引方案是处理表单中 hasMany 项的正确方法,但验证消息无法找到此表单输入的方式。有趣的是,我的视图实际上确实可以访问验证错误。这可以通过使用在视图中看到(注意这些行中没有数字索引):

if($this->Form->isFieldError("ModelName.field_name")) {
  echo $this->Form->error("ModelName.field_name");
}

将这些行放在 '$this->Form->input("ModelName.0.field_name")' 之后将验证消息插入到页面中,只是不在与输入字段相同的 div 中(因此它没有看起来很理想)。

我想不出一种方法来告诉 Cake 在 '$this->Form->input("ModelName.0.field_name")' 中使用该验证消息。所以我采用了前面描述的 'validate' => 'only' 方法,这对我来说效果很好。

于 2011-08-09T17:22:00.800 回答
0

不应该

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

?

于 2011-06-10T15:33:55.843 回答