4

私はこのスクリプトをビューに持っています:

<script type="text/javascript">
$(document).ready(function() {
    $("#addbrand").click(function() {
        $.ajax({
            url : '../brands/add',
            data : {
                name : "test",
                shortname : "tst"
            },
            dataType : 'json',
            success : function(html, textStatus) {
                alert('Success ' + textStatus + html);
            },
            error : function(xhr, textStatus, errorThrown) {
                alert('An error occurred! ' + errorThrown);
            }
        });
    });
});</script>

そして、コントローラーの追加には、次の行があります。

... else if($this->request->is('ajax')){
        if ($this->Brand->save($this->request->query)) {
            // How to send feedback!?
        }else{
            // How to send feedback!?
        }
        $this->autoRender = false;
        exit();
    }

addbrandをクリックすると、Ajax操作が正常に実行され、データベースに追加された行が表示されますが、エラーまたは成功メッセージをユーザーに送信する方法がわかりません。私はいくつかのチュートリアルを読みましたが、2.xですべてが変更されている間、それらのどれもcakephp2.0に関するものではありませんでした。JSONとXMLのビューも読んだことがありますが、残念ながら何も理解できませんでした。ステータスコードを送信する必要があります。ステータスがOKの場合は、文字列の配列(実際にはブランド名)を送信する必要があります。ステータスがOKでない場合は、操作が正常に完了しない理由を説明する文字列を送信する必要があります。誰かが私を助けてくれるなら、私は最も感謝するでしょう。ありがとう


アップデート:

コードを変更しました。CakeResponse()を使用しましたが、アクションは次のようになります。

if($this->RequestHandler->isAjax()){
        if ($this->Brand->save($this->request->query)) {
            return new CakeResponse(array('body'=> json_encode(array('val'=>'test ok')),'status'=>200));
        }else{
            return new CakeResponse(array('body'=> json_encode(array('val'=>'test not ok')),'status'=>500));
        }
    }

CakeResponseを使用すると、Jqueryで可能な応答をうまく処理できます。

$("#addbrand").click(function() {
        $.ajax({
            url : '../brands/add',
            data : {
                name : "test",
                shortname : "tst"
            },
            dataType : 'json',
            success : function(data) {
              alert("The brand has been saved");
            },
            error : function(data) {
              alert("Eorror occured");
            },
            complete : function(data) {
                alert($.parseJSON(data.responseText).val);
            }
        });
    });

すべてが機能しているように見え、クライアントとサーバー間でJSON形式でAjaxを介していくつかの変数を送信できますが、CakePHPでAjax応答を送信する標準的な方法かどうかを知る必要がありますか?これを行うための他の簡単な方法はありますか?

4

2 に答える 2

7

return new CakeResponse(array('body'=> json_encode(array('val'=>'test ok')),'status'=>200));次のコード行は、私の質問で行うこととまったく同じことを行います。

$this->set('val','test ok');
$this->set('_serialize',array('val'));
$this->response->statusCode(200);

次の 2 つの重要なことを行う必要があることを忘れないでください。

  1. Router::parseExtensions('json');App/Config/routs.phpに追加します。
  2. コントローラーに追加var $components = array("RequestHandler");します。

何も返す必要がないので、この方法の方が良いと思います。以前のソリューションでは、cakeresponse オブジェクトを返す必要がありましたが、これはアクションの性質に不安を感じていました。

于 2012-09-18T12:11:56.060 に答える
2

ルート拡張機能を備えたJSONビューを使用する必要があります。最初に、ルート拡張機能を設定する必要があります。これは通常、次の方法で行われます。

Router::parseExtensions('json'); // In App/Config/routes.php

これにより、ルーターは「json」拡張子を処理し、www.example.com / people/index.jsonのようなリクエストを処理する方法を知ることができます。

if($this->RequestHandler->isAjax()){
    if ($this->Brand->save($this->request->query)) {
        //Logic for success
    } else {
       //Logic for save failure
    }
}

この時点で、シリアル化キーを使用してデータビューを使用するか、ビューファイル(CakeBookからコピー)を使用してデータビューを使用するかを選択できます。

<?php
// Controller code
class PostsController extends AppController {
    public function index() {
        $this->set(compact('posts', 'comments'));
    }
}

// View code - app/View/Posts/json/index.ctp
foreach ($posts as &$post) {
    unset($post['Post']['generated_html']);
}
echo json_encode(compact('posts', 'comments'));

ビューが.../Views / Posts / json / ...の下にあることに注意してください。ルーターに複数の拡張機能を含めることができるため、あらゆる種類のコンテンツを返し、処理できます。結局のところ、それはすべて単なるデータ表現です。

乾杯!

于 2012-09-19T07:14:55.247 に答える