2013-10-15 10 views
11

私のsymfonyプロジェクトにいくつかのマップパラメータを保存する必要があります。これを行うには、いくつかの情報をコントローラに渡すことができる私のビューにAjaxを実装する必要があります。symfonyとJqueryでPOST Ajaxリクエストを作成する方法

私はドキュメントを読んで、いくつかのコードを書こうとしましたが、動作させることはできません。そして、Ajaxは本当にデバッグするのに苦労しています。ここで は、コントローラの一部です:

/**                     
* @Route("/ajax", name="_recherche_ajax") 
*/ 
public function ajaxAction()  
{ 
    $isAjax = $this->get('Request')->isXMLHttpRequest(); 
    if ($isAjax) {   
     return new Response('This is ajax response'); 
    } 
    return new Response('This is not ajax!', 400); 
} 

そして、JS:

map.on('zoomend', function(e) { 
    // use callback e variable 
    console.log('zoom: ' + e.target.getZoom()); 

    $.ajax({ 
     type: "POST", 
     url: "/recherche/ajax", 
     data: { 
      zoom: e.target.getZoom() 
     }, 
     dataType: "json", 
     success: function(response) { 
      console.log(response); 
     } 
    }); 

}); 

私はそれは予想通り「これはアヤックスではありません」が存在し、返さないURL recherche/ajaxをご確認ください。しかし、console.logは値を返しません...

これは正しい方法ですか?

編集: コントローラがPOSTリクエストを処理できないようです。私はに注釈を変更しようとしました:

/**                     
* @Route("/ajax", name="_recherche_ajax") 
* @Method({"GET", "POST"}) 
*/ 

しかし、それが返されます。

([Semantical Error] The annotation "@Method" in method MySite\SiteBundle\Controller\RechercheController::ajaxAction() was never imported. Did you maybe forget to add a "use" statement for this annotation?) 
+1

応答が出力されていませんか、まったく出力されません。 – Touki

+0

私は私のコンソールに何も持っていません... – Xavier

+0

これは、PHPで 'FATAL'エラーが原因と考えられます。ブラウザにajaxリクエストアドレスを直接入力してみてください(私はそれが 'POST'ではないことを知っています)、symfonyエラーがあるかどうかを確認してください... –

答えて

20

は、あなたがAjaxリクエストを送信する場合には

/**                     
* @Route("/ajax", name="_recherche_ajax") 
*/ 
public function ajaxAction(Request $request)  
{ 
    if ($request->isXMLHttpRequest()) {   
     return new JsonResponse(array('data' => 'this is a json response')); 
    } 

    return new Response('This is not ajax!', 400); 
} 

これを試してみてください、あなたはjson/plaintext/xmlを返却する必要がありますデータであり、Responseオブジェクト全体ではありません。

PS:あなたは追加のエラーメッセージは、あなたが使用して注釈@Methodをインポートする必要があり、言うように

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;RequestJsonResponse

EDITために使用なステートメントを追加することを忘れないでください。

+0

Hum、まだ何も – Xavier

+0

私はコントローラから実際のAJAX呼び出しを呼びたい。 Plsは何か提案します。 –

+0

'condition =" request.isXmlHttpRequest() "、' '@ Route'を追加すると、ajaxリクエストへの一致を制限することができます。 '@ Method'の仕組みと似ています。参照:http://symfony.com/doc/current/routing/conditions.html – fyrye

2

私はインターネット全体を探していて、同様の問題に対する解決策は見つかりませんでした。しかし、私はそれを見つけた - > 私はコントローラ、またはjavascript/jquery/ajaxもセキュリティの問題もどちらも問題がありませんでした。 それは.... HTMLで待っています。 htmlタグにtype = "button"を追加する必要がありました。そうしないと、ページ全体がリフレッシュされていました。 デバッグの目的で4時間が無駄になりました。

問題をデバッグするにはどうすればよいですか? 1. ajaxがクライアント側で投稿と一致する投稿経路を送信しているかどうかを確認します。 Firefoxの> f12 - > network - > POSTイベントを見る 2. - > /app_dev.php/(dev環境) - > Get Request/Responseサブメニューのsymfonyプロファイラ(非常に便利なツール!あなたがPOSTルートを参照する場合は、その戻りコードとパラメータ(HTML応答以外の設定の場合、レスポンスは表示されません) 3.コントローラで、このルート内のスクリプトが実行されたかどうかを確認できるアクションを実行します。そうであれば、サーバー側(コントローラー)またはクライアント側(twig/ajax/html)のいずれの応答も表示されません。 4。コード例:

function aButtonPressed(){ 
     $.post('{{path('app_tags_sendresponse')}}', 
      {data1: 'mydata1', data2:'mydata2'}, 
      function(response){ 
       if(response.code === 200 && response.success){ 
        alert('success!'); 
       } 
       else{ 
        alert('something broken'); 
       } 
      }, "json"); 
    } 

今...サーバ側:HTMLまたは他のjsのインクルードファイル内のHTMLで

ボタン(これは私の問題だった)

<button name="button" id="button" class="button" type="button" value="100"> Click me </button> 

アヤックス。コントローラ:

namespace AppBundle\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
class JsonApiController extends Controller 
    /** 
     * @Route("/api/programmers") 
     * @Method("POST") 
     */ 
     public function sendResponse() 
     { 
      if(isset($_POST['data1'])){ 
       $json = json_encode(array('data' => $_POST['data1']), JSON_UNESCAPED_UNICODE); 
       file_put_contents("test.json", $json); 
       return new JsonResponse($json); 
      } 
      return new Response('didn't set the data1 var.'); 
     } 
    } 

File put contents Webディレクトリに新しいファイルを作成します。一致してファイルが作成された場合は、ルートに一致しましたが、応答は得られませんでした。