我正在使用CakePHP 2.1.3作为我的一个项目,我希望通过控制器以JSON格式返回模型验证错误,当我尝试通过CakePHP的模型属性验证错误访问验证错误时,它会在主要和所有其他相关模型都有验证错误。但是当主模型有效且关联模型具有验证错误时,它会导致无效的验证错误数组。以下是一个例子:
if ($this->request->is('post') || $this->request->is('put')) {
if ($this->PrimaryModel->saveAll($this->request->data, array('validate' => 'first'))) {
echo json_encode(array('success' => true));
} else {
$errors=array();
$tablesToModels=$this->PrimaryModel->tableToModel; //List of table names included in the model description. Used for associations.
foreach($tablesToModels as $tabel => $model) {
$errors[$model]=$this->{$model}->validationErrors;
}
pr($errors);
//echo json_encode(array('errors' => $errors));
}
exit;
}
如果主要模型和关联模型有验证错误,则输出结果如下:
Array
(
[PrimaryModel] => Array
(
[field1] => Array
(
[0] => notempty
)
)
[AssociatedModel] => Array
(
[field1] => Array
(
[0] => notempty
)
[field2] => Array
(
[0] => notempty
)
)
)
当所有字段都填写在主模型中,或者主模型没有验证错误时,它会导致错误数组:
Array
(
[PrimaryModel] => Array
(
[AssociatedModel] => Array
(
[field1] => Array
(
[0] => notempty
)
[field2] => Array
(
[0] => notempty
)
)
)
[AssociatedModel] => Array
(
[field1] => Array
(
[0] => notempty
)
[field2] => Array
(
[0] => notempty
)
)
)
我不知道为什么会这样,我在做错什么?
这是一个编辑表单代码,你需要它来解决它:
<php
echo $this->Form->input('PrimaryModel.field1');
echo $this->Form->input('PrimaryModel.field2');
echo $this->Form->input('PrimaryModel.field3');
echo $this->Form->input('PrimaryModel.field4');
echo $this->Form->input('AssociatedModel.field1');
echo $this->Form->input('AssociatedModel.field2');
echo $this->Form->input('AssociatedModel.field3');
echo $this->Form->input('PrimaryModel.field5');
?>
提前谢谢大家:)
答案 0 :(得分:0)
控制器通常在呈现操作时构造$validationErrors
属性。您应该使用json视图,而不是直接从控制器回显json。让视图处理显示逻辑,在这种情况下,将结果显示为json而不是常规html。
将扩展名添加到路线文件中:
Router::parseExtensions('json');
然后在/View/Controller/json/action.ctp
中创建一个视图,用控制器和操作名称替换'controller'和'action'。视图将如下所示:
echo json_encode($this->validationErrors);
您还需要在/View/Layouts/json/default.ctp
中创建一个json布局。
echo $content_for_layout;
您可以像普通操作一样访问它,但使用.json
扩展名,例如http://example.com/controller/action.json
。