CakePHP模型validationErrors属性的问题

时间:2012-06-13 11:17:33

标签: php validation cakephp model cakephp-2.1

我正在使用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');
?>

提前谢谢大家:)

1 个答案:

答案 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