【问题标题】:CakePHP 1.3 validation errors not showing with numerical indexed array数字索引数组未显示 CakePHP 1.3 验证错误
【发布时间】:2011-09-12 09:54:55
【问题描述】:

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

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

模型验证规则如下:

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'])); ?>  

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

【问题讨论】:

  • 不确定,但验证问题似乎与使用 Model::saveAll() 相关,如果有帮助的话..

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


【解决方案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' 方法,这对我来说效果很好。

【讨论】:

    【解决方案2】:

    应该是这样的

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

    ?

    【讨论】:

    • OP 的数组应该(并且确实)工作,因为该字段只有一个验证规则。当一个字段有多个规则时,您的数组是常用且正确的格式,尽管'notEmpty' key 完全是可选的(并且是任意的)。 ;)
    • 无论如何尝试了数组选项,但它仍然没有在表单上显示错误消息。 :|
    猜你喜欢
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多