23

How can i pass {{app.user}} into Javascript ?

for now I do a block like;

<script type="text/javascript">
    var app_name = '{{ app_name }}';
    var app_url= '{{ app_url }}';
    var app_description= '{{ app_description }}';
    var app_email= '{{ app_email }}';
    var app_title= '{{ app_title }}';
    var app_dominio= '{{ app_dominio }}';
    var env = '{{ app.environment }}';
</script>

where these parameters are set in config.yml

4 Answers 4

29

I don't understand what's exactly your problem with the solution you choose, it should work well with {{ app.user }} except that app.user is an object, so you should have a toArray function into your user and call :

app_user = {{ app.user.toArray|json_encode() }};

Or call each parameter of the user like {{ app.user.id }}

Documentation : https://twig.sensiolabs.org/doc/filters/json_encode.html

You should use json_encode for your variables above, if you have a quote into one of your string it will break your javascript.

Example for profile:

<script type="text/javascript">
    nickname = {{ profile.nickname|json_encode() }}; // Nickname will be a string
    // 2nd solution if you have more informations related to profile
    profile = {
        nickname: {{ profile.nickname|json_encode() }},
        lastname: {{ profile.lastname|json_encode() }}
    };
    // Profile is now an object with a nickname property.
    // use profile.nickname on your javascripts
</script>
Sign up to request clarification or add additional context in comments.

1 Comment

for example i have this var in twig {{profile.nickname}}, if i want use the value of {{profile.nickname}} inside my javascript?
25

The accepted solution doesn't work (anymore ?) because of twig autoescaping the outputs, changing all the JSON " with &quot;.

Equivalent would now have to use the raw filter:

<script type="text/javascript">
    nickname = {{ profile.nickname|json_encode()|raw }}; // Nickname will be a string
    // 2nd solution if you have more informations related to profile
    profile = {
        nickname: {{ profile.nickname|json_encode()|raw }},
        lastname: {{ profile.lastname|json_encode()|raw }}
    };
    // Profile is now an object with a nickname property.
    // use profile.nickname on your javascripts
</script>

That being said, directly printing the raw JSON into the javascript may cause some problems, has in this configuration:

<script>
    var myvar = {{ '{"test": "</script>"}'|raw }};
</script>

The </script> tag in the JSON would be interpreted by the HTML parser, resulting in a broken script.

The truly correct way to do this would rather be to print the JSON as an escaped string, and then parse it within the js script:

<script>
    var myvar = JSON.parse('{{ '{"test": "</script>"}'|e('js') }}');
</script>

Comments

2

Try this:

var title = '{{ 'My Daily Activities'|trans({}, 'general') }}'; 

with additional apostrophy

Comments

0

Use an attribute or any tag

example: <span profile="{{ profile.nickname }}"></span>

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.