3

I'm new in Symfony i wanted to do some manipulation such I can get a list of all elemets in the entity Theme via Ajax but the answer is still "undefined" Here the code text strong

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

}

the server response is 200 OK, everything seems to work, I have the same number of data in the database but I can't read the objects values

and here is the : console.log(json)

2
  • can you provide some move info? what is the response from the server? what is 'undefined'? the "json.value"? Commented Aug 22, 2016 at 14:11
  • 1
    the server response is 200 OK, everything seems to work, I have the same number of data in the database but I do not read the objects values Commented Aug 22, 2016 at 14:19

2 Answers 2

5

There are many ways to do that; I will show you one of them.

First, prepare your data to send it from a controller and return a JsonResponse instance:

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

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

The JsonResponse tells the browser that the data sent must be interpreted as JSON; otherwise, these data are interpreted as plain text by default.

Second, use the same data structure for accessing it through a JavaScript callback function:

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

In your question, your data sent was an array of objects, so you need to look at this variable "json" (array) and access each property of the object.

Sign up to request clarification or add additional context in comments.

2 Comments

how can i loop to each property of object. i guess that i already did it in the " $.each(json, function (index, value) { ..." is that right ?
Yes, but it depends of your WebSiteBackBundle:Theme entity, if it contains the "id" and "value" properties. Otherwise, you should prepare these data before send the json response in your controller.
3

well, i found the answer i had to change the controller to make it happen. thank you Yonel ! here is a link that helped me 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();
                });
            }
        });
    });

Hoping it will help someone. thank you all for your answer it helped me a lot

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.