user198729
user198729

Reputation: 63686

What's the symfony way to set a javascript variable?

<script type="text/javascript">var name="value";</script>

I need it to be executed before another file included by use_javascript('name.js');

How to do it in symfony?

Upvotes: 0

Views: 1989

Answers (3)

Neznajka
Neznajka

Reputation: 321

this is twig excample you may use php.

{% if value %}
    <script type="text/javascript">var name="{{ value }}";</script>
{% endif %}

if your script won't work most of the mistakes are ( value is defined after adding main script), or ( you may var same variable in the main script it would bug your source. )

and if you need paste many variables you may use for. like this

{% if js_items %}
    <script type="text/javascript">
    {% for item in js_items %}
          var {{ item.name }} = "{{ item.value }}";
    {% endfor %}
    </script>
{% endif %}

Upvotes: 1

Andrei Dziahel
Andrei Dziahel

Reputation: 969

To implement this in unobstrusive manner I'd recommend to use use_dynamic_javascript helper.

Upvotes: 1

Peter Bailey
Peter Bailey

Reputation: 105916

You could do it any number of ways

let's say, in your action method, you add a template variable like so

$this->jsVar = 'foo';

Then, in your template file(s)

echo javascript_tag( 'var name="' . $jsVar . '";' );

or

<script type="text/javascript">
  var name='<?php echo $jsVar; ?>';
</script>

EDIT

Ok, based on your specific needs, you'll need to do a few things. First, look at your page template (the one located in apps/app-name/templates - you should see a line that looks like this

<?php include_javascripts(); ?>

That's the function that takes all javascript resources defined in view.yml files or those included by the use_javascript() helper and prints them to the page.

So our goal, then, is to put a javascript block in front of where all the other scripts are included (and by in-front, I mean appearing first in source-order)

To solve this in a somewhat flexible manner, let's use a slot. Modify the above line in your page template to look like this

<?php
  if ( has_slot( 'global_js_setup' ) )
  {
    include_slot( 'global_js_setup' );
  }
  include_javascripts();
?>

Then, in your action method

sfLoader::loadHelpers( 'Asset' );
$this->getResponse()->setSlot(
    'global_js_setup',
  , javascript_tag( 'var name="value";' );
);

You could extend this idea by using component slots if you wanted to.

Upvotes: 3

Related Questions