2

プロジェクトの 1 つに CakePHP 2.1.3 を使用しています。モデルの検証エラーをコントローラー経由で JSON 形式で返す必要があります。モデルに検証エラーがあります。ただし、プライマリ モデルが有効で、関連付けられているモデルに検証エラーがある場合、無効な検証エラー配列が生成されます。以下に例を示します。

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

よろしくお願いします:)

4

1 に答える 1

0

$validationErrorsコントローラーは通常、アクションをレンダリングするときにプロパティを構築します。コントローラーから json を直接エコーする代わりに、json ビューを使用する必要があります。ビューに表示ロジックを処理させます。この場合、通常の html ではなく json として結果を表示します。

拡張機能をルート ファイルに追加します。

Router::parseExtensions('json');

次に、/View/Controller/json/action.ctp「コントローラー」と「アクション」をコントローラーとアクション名に置き換えてビューを作成します。ビューは次のようになります。

echo json_encode($this->validationErrors);

また、 で json レイアウトを作成する必要があります/View/Layouts/json/default.ctp

echo $content_for_layout;

そして、通常のアクションのようにアクセスしますが.jsonhttp://example.com/controller/action.json.

于 2012-06-13T14:23:50.717 に答える