2017-01-24 67 views
1

我試圖在單擊按鈕後使用AJAX運行我的控制器代碼。從我收集的信息來看,這就是您應該使用AJAX的原因......它會從前端向後端發送響應,然後生成json響應。如何在Symfony2中正確使用AJAX

但我無法弄清楚如何正確地做到這一點。我不確定如何讓AJAX成功運行控制器代碼。

所有我已經能夠做的就是展示在成功的表,但我不希望控制器代碼運行按鈕被點擊,直到,因爲這是AJAX的點。

的Symfony似乎並不對此有文檔:http://symfony.com/legacy/doc/book/1_0/en/11-Ajax-Integration

而且這些堆棧溢出的問題/答案是太老了我的使用或不幫我:

How to integrate Ajax with Symfony2

How to make a POST Ajax request with Symfony and Jquery

嫩枝:

<button id="begin-check" type="button">Run Test</button> 

<table class="stab"> 
    <thead> 
    <tr> 
     <th style="text-align: center">Ang</th> 
     <th style="text-align: center">Lat</th> 
    </tr> 
    <tr> 
     <th>Name &amp; Age</th> 
     <th>Name &amp; Age</th> 
    </tr> 
    </thead> 
    <tbody> 
    {% for person in persons %} 
     <tr> 
      <td> 
       <a href="{{ path('users_edit', { 'id': person[0] }) }}"> 
        {{ person[1] }}, {{ person[2] }} 
       </a> 
      </td> 
      <td> 
      {% if person[7] == 'Moe' %} 
       <a href="{{ path('edit', { 'id': person[6] }) }}"> 
      {% else %} 
       <a href="{{ path('low_edit', { 'id': person[8] }) }}"> 
      {% endif %} 
        {{ person[4] }}, {{ person[5] }} 
       </a> 
      </td> 
     </tr> 
    {% endfor %} 
    </tbody> 
</table> 

AJAX:

<script type="text/javascript"> 
    $(document).ready(function(){ 
     $(document).on('click', "#begin-check", function(e){ 
      console.log('You have clicked'); 
      e.preventDefault(); 
      $.ajax({ 
       method: 'POST', 
       url: "{{ path('control_check') }}", 
       data: { //research what to put here 
       }, 
       success: function(responseData){ 
        //run the controller code 
        //Show HTML table 
       }, 
       error: function (xhr, ajaxOptions, thrownError) { 
        console.log(xhr.status); 
        console.log(xhr.responseText); 
        console.log(thrownError); 
       }, 
      }) 
     }); 
    }); 

</script> 

在控制器:

/** 
* 
* @Route("/control", name="control_check") 
* @Template() 
*/ 
public function controlCheckAction() 
{ 
    $request = $this->get('request'); 
    $em = $this->getDoctrine()->getManager(); 

    $persons = array(); 

    //more code 

    return new JsonResponse(array('persons' => $persons)); 

} 
+0

是你的javascript代碼插入樹枝模板嗎? –

+0

它與上面的我的樹枝在同一個文件中 – grgre

+0

您不能在JavaScript成功函數中運行嚴重的側控制器代碼。當調用成功時,responseData將擁有controlCheckAction生成的任何json。然後您需要javascript來渲染表格。看看你是否能找到一個好的介紹Ajax教程,而沒有Symfony的複雜性。你需要首先理解基礎知識。 – Cerad

回答

0

我想你需要添加到你已經擁有的是isXmlHttpRequest()方法。 Here的官方文檔。

所以:

/** 
* 
* @Route("/control", name="control_check") 
* @Template() 
*/ 
public function controlCheckAction(Request $request) 
{ 
    if ($request->isXmlHttpRequest()) { 
     //$request = $this->get('request'); 
     //replace the up line code with the folloging, which gets a particular form field 
     $name = $request->request->get('name'); // <=> $name = $_POST['name'] 
     $em = $this->getDoctrine()->getManager(); 

     $persons = array(); 

     //more code 

     return new JsonResponse(array('persons' => $persons)); 
    } 
} 
+0

我肯定忘了將request $ request參數添加到控制器函數中......所以非常感謝你,但是我對$ request-> request-> get('name')會產生困惑。 ;'對我來說。我沒有一個表單字段在這裏使用... – grgre

+0

然後只需在'controlCheckAction()'中輸入'dump($ request)',在按下提交按鈕後查看可用的東西。我真的不知道你打算做什麼。通常在模板中有一個'

',它通過AJAX調用發送它的數據。 –

0

也許,我遇到同樣的情況。

就我而言,我忘了添加「使用」聲明。 難道你忘了添加這一行嗎?

use Symfony\Component\HttpFoundation\JsonResponse; 

我附加了我的檢查點。

【1】檢查服務器側應用程序日誌

error_log("create json response OK" . "\n", 3, "/usr/local/var/log/php/error.log"); 
return new JsonResponse(array('persons' => $persons)); 

【2】檢查控制檯調試器

開放鉻調試器(F12) - >網絡標籤 - > 「/控制」(左導航)

因此,您可以確認「響應標題」。

[OK] Content-Type:application/json 
[NG] Content-Type:text/html 

如果找到「text/html」,我想服務器端的問題。

【3】檢查Symfony2的調試

你可以找到Symfony2的調試器的URL在同一標籤【2】

X-Debug-Token-Link:http://xxxxxxxxx/_profiler/xxxxx 

你應該打開這個鏈接探查。 如果此問題來自服務器端,則可以發現任何問題。