2016-08-22 3 views
0

Ich bin neu in Symfony ich wollte einige Manipulation tun, wie ich eine Liste aller Elemets in der Entity Theme über Ajax bekommen kann, aber die Antwort ist immer noch "undefined" Hier der Code-Text starksymfony Antwort mit JSON AJAX

vue

$(document).ready(function() { 
     var $theme = $('#theme'); 
     $theme.append('<option value="">Choisir un thème</option>'); 
     $.ajax({ 
      type: 'post', 
      url: '{{ path('web_site_liste_theme_cmb') }}', 
      dataType: 'json', 
      beforeSend: function() { 
       $('#themediv').append('<div id="loading" style=" float: left; display: block;"><img src="{{ asset('bundles/BackBundle/img/loadingicon.gif') }}"/></div>'); 
      }, 
      success: function (json) { 
       {#$('#theme').append({{ dump(json)}});#} 
       console.log(json.value); 
       $.each(json, function (index, value) { 

        //console.log(value); 
        $('#theme').append('<option value="' + value.id + '">' + value.name + '</option>'); 
        $('#loading').remove(); 
       }); 
      } 
     }); 
    }); 

-Controller

public function ListeThemeAction(Request $request) 
{ 

    $em = $this->getDoctrine()->getEntityManager(); 
    if ($request->isXmlHttpRequest()) { 
     $themes = $em->getRepository('WebSiteBackBundle:theme'); 
     $themes = $themes->findAll(); 
     //var_dump($themes); 

     return new JsonResponse($json); 
    } 
    return new JsonResponse('no results found', Response::HTTP_NOT_FOUND); // constant for 404 

} 

der Server re sponse 200 OK, alles scheint zu funktionieren, ich die gleiche Anzahl von Daten in der Datenbank, aber ich kann die Objekte nicht lesen Wert

und hier ist die: console.log(json)

+0

können Sie einige Informationen zu bewegen? Wie lautet die Antwort vom Server? Was ist "undefiniert"? der "json.value"? – carmel

+0

die Serverantwort ist 200 OK, alles scheint zu arbeiten, ich habe die gleiche Anzahl von Daten in der Datenbank, aber ich lese nicht die Objekte Werte –

Antwort

0

Nun, ich fand die Antwort ich musste den Controller ändern, um es zu ermöglichen. danke Yonel! hier ist ein Link, der mir geholfen Json in controller

-Controller

public function ListeThemeAction(Request $request) 
{ 
$output=array(); 
    $em = $this->getDoctrine()->getEntityManager(); 
    if ($request->isXmlHttpRequest()) { 
     $themes = $em->getRepository('WebSiteBackBundle:theme'); 
     $themes = $themes->findAll(); 
     foreach ($themes as $theme){ 

      $output[]=array($theme->getId(),$theme->getName()); 
     } 
    /* var_dump($themes); 
     $json = json_encode($themes); 

     $response = new Response();*/ 
     //   return $response->setContent($json); 
     return new JsonResponse($output); 

    } 
    return new JsonResponse('no results found', Response::HTTP_NOT_FOUND); 
} 

Vue

 $(document).ready(function() { 
     var $theme = $('#theme'); 
     $theme.append('<option value="">Choisir un thème</option>'); 
     $.ajax({ 
      type: 'post', 
      url: '{{ path('web_site_liste_theme_cmb') }}', 
      dataType: 'json', 
      beforeSend: function() { 
       $('#themediv').append('<div id="loading" style=" float: left; display: block;"><img src="{{ asset('bundles/BackBundle/img/loadingicon.gif') }}"/></div>'); 
      }, 
      success: function (json) { 

       console.log(json); 
       $.each(json, function (index, value) { 

        //console.log(value); 
        $('#theme').append('<option value="' + value[0]+ '">' + value[1] + '</option>'); 
        $('#loading').remove(); 
       }); 
      } 
     }); 
    }); 

der Hoffnung, es jemand helfen. Vielen Dank für Ihre Antwort Es hat mir sehr geholfen

2

Es gibt viele Möglichkeiten zu tun das, ich zeige dir einen von ihnen.

Zuerst bereiten Sie Daten von Controller zu senden und gibt eine JsonResponse Instanz mit Ihnen Daten:

public function fooAction() 
{ 
    $data = ['foo1' => 'bar1', 'foo2' => 'bar2']; 

    return new JsonResponse($data); //or $this->json($data) since Symfony 3.1 
} 

Der JsonResponse erzählt an den Browser, die Daten gesendet werden, müssen als JSON interpretiert werden, sonst sind diese Daten standardmäßig als Plain/Text interpretiert.

Zweitens verwenden die Struktur gleichen Daten von Callback-Javascript-Funktion zuzugreifen:

$.post('{{ path('web_site_liste_theme_cmb') }}', function (data) { 
    console.log(data['foo1']); //output bar1 
    console.log(data.foo2); //output bar2 
}); 

In Ihrer Frage geschickt Ihre Daten das Array von Objekten war, so dass Sie Schleife für diese Variable „json“ muss (Array) und Zugriff auf jede Eigenschaft des Objekts.

+0

wie kann ich auf jede Eigenschaft des Objekts. ich denke, dass ich es schon in "$ .each (json, function (index, value) {..." gemacht habe, ist das richtig? –

+0

Ja, aber es hängt von Ihrer 'WebSiteBackBundle: Theme' Einheit ab, wenn sie das enthält "ID" und "Wert" Eigenschaften. Andernfalls sollten Sie diese Daten vorbereiten, bevor Sie die JSON-Antwort in Ihrem Controller senden. – yceruto

+0

Sie hatten Recht, es funktionierte für mich, danke! –