2013-10-15 25 views
11

Ho bisogno di memorizzare alcuni parametri della mappa nel mio progetto symfony, per fare questo ho bisogno di implementare alcuni Ajax nella mia vista che sarà in grado di passare alcune informazioni al controller.Come fare una richiesta Ajax POST con Symfony e Jquery

Ho letto i documenti, provo a scrivere del codice ma non riesco a farlo funzionare. E Ajax è davvero doloroso per il debug. Qui è la parte del controller:

/**                     
* @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); 
} 

E il 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); 
     } 
    }); 

}); 

verifico l'url recherche/ajax esso esiste e tornare la 'Questo non è l'Ajax' come previsto. Ma console.log non restituisce alcun valore ...

E 'questo il modo giusto per farlo?

EDIT: Sembra che il controller non può gestire POST Request. Ho provato a modificare le annotazioni a:

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

ma restituisce:

([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

La risposta restituisce "non definito" o non viene generato nulla? – Touki

+0

Non ho niente nella mia console ... – Xavier

+0

Questo è molto probabilmente dovuto all'errore 'FATAL' in PHP. Prova ad inserire direttamente un indirizzo di richiesta Ajax nel browser (lo so, non è 'POST') e vedi se c'è qualche errore di Symfony ... –

risposta

20

Prova questa,

/**                     
* @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); 
} 

In caso di voi l'invio di una richiesta Ajax, è necessario tornare json/plaintext/xml dati, e non un intero oggetto Response.

PS: Non dimenticare di aggiungere l'uso statment per Request e JsonResponse

EDIT: Come il messaggio di errore si è aggiunto dice, è necessario importare l'annotazione @Method utilizzando:

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

+0

Hum, ancora nulla – Xavier

+0

Desidero chiamare una chiamata ajax dal controller. Pls dare qualche suggerimento. –

+0

È possibile aggiungere 'condition =" request.isXmlHttpRequest() ",' a '@ Route' per limitare la corrispondenza alle richieste Ajax. Simile a come '@ Method' funziona. Vedi: http://symfony.com/doc/current/routing/conditions.html – fyrye

2

Stavo cercando l'intera Internet e non ho trovato alcuna soluzione a problemi simili. Ma l'ho trovato-> Non ho avuto alcun problema con il controller, né il javascript/jquery/ajax né i problemi di sicurezza. Era in .... aspettalo .... in HTML. ho dovuto aggiungere type = "button" nel tag html, altrimenti l'intera pagina si stava rinfrescando. 4 ore sprecate a scopo di debug ... ma lezioni apprese.

Come eseguire il debug dei problemi? 1. Controlla se ajax sta inviando post e abbina rotta postale sul lato client. Firefox -> f12 -> network -> guarda gli eventi POST 2. Controlla il profiler di symfony (strumento molto utile!) Su -> /app_dev.php/ (ambiente di sviluppo) -> Ottieni sottomenu Richiesta/Risposta: dura 10 , se vedi il percorso POST controlla attentamente se il suo codice di ritorno e parametri (non vedrai risposta, se il suo set diverso dalla risposta HTML) 3. Nel tuo controller fai qualche azione che può essere controllata se lo script all'interno di questa rotta è stato eseguito . In tal caso, e non si vede alcuna risposta sul lato server (controller) o lato client (twig/ajax/html) 4.Esempi di codice:

pulsante in html (questo era il mio problema)

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

Ajax in HTML o altri file incluso js:

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"); 
    } 

Ora .. lato server. Controller:

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 creare nuovo file in directory web. Se è stato abbinato e il file è stato creato significa che hai abbinato il percorso, ma non hai ottenuto la risposta

Problemi correlati