64

I have a controller that passes an array to a twig template, which I want to use in a script written on that page. How would I go about doing that?

I've tried this in my .twig template:

<script>
    $(document).ready(function(){
        var test = {{ testArray }};
});
</script>

but that only works if it's a string.

1
  • 1
    Adding the current output and expected output to your question can make finding a solution to your problem much easier. Commented Dec 18, 2012 at 8:26

5 Answers 5

198

You might have to json_encode the array, try this:

<script>
    $(document).ready(function(){
        var test = {{ testArray|json_encode(constant('JSON_HEX_TAG'))|raw }};
    });
</script>
Sign up to request clarification or add additional context in comments.

3 Comments

Don't forget to add quotes var test = '{{ testArray|json_encode|raw }}';
No, you don't want to quote it. That will make the variable a string containing a json value. Without the quotes it is parsed correctly as an array object.
You should pass the JSON_HEX_TAG flag to json_encode: json_encode(constant('JSON_HEX_TAG')). Otherwise, you can get broken HTML (try "<!--<script>").
8

First, send the data json encoded from controller and

then in javascript,

var context= JSON.parse('{{ YourArrayFromController|raw}}');

2 Comments

@JoséGabrielGonzález How would you do it ?
Um, what if some of values in your JSON has single quote? Like in {"message": "Can't process"}
5

I do it this way:

Return of the controller test.data then

$test = array('data' => array('one','two'))

Twig:

<div id="test" data-is-test="{{ test.data|json_encode }}"></div>

Js:

$(document).ready(function() {
    var test = $('#test').data("isTest");
    console.log(test);
});

Output:

 ["one", "two"]

documentation here

Comments

1

json_encode works well, in combination with the raw filter.

<script>
    $(document).ready(function(){
        let test = {{ testArray | json_encode(constant('JSON_HEX_TAG')) | raw }};
    });
</script>

Don't forget the JSON_HEX_TAG flag.
Otherwise, you can get broken HTML. A string containing <!--<script> is a good way to test that.

Comments

0

In My Controller I Install SerializerBundle

$serializer = $this->get('serializer');
        $countries = $this->getDoctrine()->getRepository("QSCORBundle:CountryMaps")->findAll();
        $jsonCountries = $serializer->serialize($countries, 'json');
 return $this->render('QSCORBundle:Default:index.html.twig',array("countries"=> $jsonCountries));

And In My File Twig

<script type="text/javascript" >
 var obj = {{ countries|json_encode|raw }};
 var myObject = eval('(' + obj + ')');

 console.log(myObject[0]['capital_latitude'] + " " + myObject[0]['capital_longitude']);//for the First Element
</script>

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.