フォームと検証がすべて従来のポストバックを使用して正しく機能するCakePHP(最新バージョン)Webアプリがありますが、現在、いくつかのフォームをajax経由で送信するように切り替えています。検証エラーが発生した場合は、次のようにフォーマットされたJSONとしてクライアントに戻したいと思います。
{
"success":false,
"errors":{
"data[User][username]":["This is not a valid e-mail address"],
"data[User][password]":["You must choose a password"]
}}
エラー配列のキーは、フォームフィールドのname属性に対応している必要があります。このようにフォーマットされたJSONを期待するビルド済みのクライアントスクリプトがいくつかあります。幸いなことに、これはCakePHPのvalidationErrorsオブジェクトの外観に非常に近いものです。だから私は現在私のコントローラーでこれを行っています:
if ($this->User->save($this->request->data)) {
} else {
if ($this->request->is('ajax')) {
$this->autoRender = $this->layout = false;
$response['success'] = false;
$response['errors'] = $this->User->validationErrors;
echo json_encode($response);
exit(0);
}
}
ただし、JSON応答は次のようになります。
{
"success":false,
"errors":{
"username":["This is not a valid e-mail address"],
"password":["You must choose a password"]
}}
エラーキーには、基本的なデータベーステーブルのフィールド名だけが含まれていることに注意してください。これらは、FormHelperが通常処理するdata[User][username]形式に変換されません。
配列を返す前に配列を調整する簡単な方法はありますか?「data[User]」は十分に堅牢ではないため、単純にループして先頭に追加したくありません。1つの場所に配置して、さまざまなモデルのさまざまなコントローラーから呼び出すことができるコードが欲しいのですが。FormHelperは入力名属性を考え出すために何を使用しますか?それを利用できますか?どういうわけかJSONビューを使用する必要がありますか?