我看过大量有关验证错误的论坛没有显示并尝试了各种各样的事情,但无济于事......
基本上,验证是正确识别字段没有值时应该,但错误消息不会“自动”出现在输入框下方。
模型验证规则如下所示:
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'])); ?>
是否有人知道错误消息未显示的原因?
答案 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'
)
)
);