CakePHP 1.3验证错误未显示数字索引数组

时间:2011-06-10 10:47:48

标签: php validation cakephp cakephp-1.3 cakephp-appmodel

我看过大量有关验证错误的论坛没有显示并尝试了各种各样的事情,但无济于事......

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

模型验证规则如下所示:

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
)

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

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

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

是否有人知道错误消息未显示的原因?

2 个答案:

答案 0 :(得分:1)

我遇到了与hasMany模型相同的问题(表单中有数字索引的字段),并提出了一个适用于我的验证解决方案。

快速回答:在尝试实际保存数据之前,我单独验证了数据,例如(通知'validate'=&gt;'only'):

if($this->ModelName->saveAll($this->data, array('validate' => 'only'))) {
  // proceed to save...
}

这样做就给了我模型中的模型验证错误消息,正好在验证失败的输入字段下(显示验证错误的正常Cake方式)。


注意:我无法使用saveAll()实际保存我的数据(我会在一分钟内解释原因)。如果我可以使用saveAll()来实际保存数据,我可以通过使用(通知'validate'=&gt;'first')保存的同时获得验证:

if($this->ModelName->saveAll($this->data, array('validate' => 'first'))) 

但是,我无法使用saveAll()实际保存数据,因为我需要使用事务一次保存多个模型,其中一些模型与其他模型没有直接关系。 saveAll()只会保存调用它的模型,以及与之直接相关的模型。由于Cake当前不支持嵌套事务,而saveAll()自动使用一个事务,因此我必须在模型上使用save()并手动启动和结束我的事务。但是,这导致我在hasMany项目的表单中丢失了验证消息,即使我使用“$ this-&gt; ModelName-&gt; save($ this-&gt; data,array('validate'=&gt ; '第一')”


进一步说明:该问题似乎与在表单中使用数字索引字段有关。例如:

$this->Form->input("ModelName.0.field_name");

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

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

将这些行放在'$ this-&gt; Form-&gt;输入(“ModelName.0.field_name”)之后,将验证消息插入到页面中,而不是与输入字段在同一个div中(和因此看起来并不理想。)

我无法找出告诉Cake在'$ this-&gt; Form-&gt;输入(“ModelName.0.field_name”)'中使用该验证消息的方法。所以我采用'验证'=&gt;前面描述的“唯一”方法,对我来说效果很好。

答案 1 :(得分:0)

不应该是

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