2012-09-24 16 views
13

¿Qué debo hacer para que twig procese un archivo JavaScript? Tengo un html.twig que usa una ramita de JavaScript. Algo como esto:Symfony2, ramita y JavaScript

{% extends 'BaseBundle::layout.html.twig' %} 

{% block javascripts %} 
    {{ parent() }} 
    {% javascripts 
     '@BaseBundle/Resources/js/main.js.twig' 
    %} 
    {% endjavascripts %} 
{% endblock %} 

< more template omitted > 

y partes de main.js.twig:

function testFunction() 
{ 
    alert('{{VariableFromPHP}}'); 
} 

y el controlador:

/** 
* @Route("/",name="home") 
* @Template("MyBundle:Default:index.html.twig") 
*/ 
public function indexAction() 
{ 
    return array('VariableFromPHP' => 'Hello World'); 
} 

Yo esperaba que el Javascript para este aspecto en tiempo de ejecución :

alert('Hello World'); 

Pero, th El código e no se modifica. ¿Alguna idea de lo que estoy haciendo mal?

Gracias, de Scott

Respuesta

12

Assetic no incluye las plantillas ramita; deberías crear un controlador separado para el archivo javascript. Aunque lo consideraría una mala práctica en cuanto a rendimiento, porque tendrá que procesar dos solicitudes de esta manera.

/** 
* @Route("/main.js") 
*/ 
public function mainJsAction() { 
    $params = array('test' => 'ok'); 
    $rendered = $this->renderView('MyBundle:Default:main.js.twig', $params); 
    $response = new \Symfony\Component\HttpFoundation\Response($rendered); 
    $response->headers->set('Content-Type', 'text/javascript'); 
    return $response; 
} 
{% extends 'BaseBundle::layout.html.twig' %} 

{% block javascripts %} 
    {{ parent() }} 
    <script type="text/javascript" src="{{ path('my_default_mainjs') }}"></script> 
{% endblock %} 

Una alternativa consiste en mover las variables dinámicas en el html, y sólo utilizar los archivos JavaScript estáticas.

1

En su lugar, lo que hice es esto en las main.js:

function doGetStringFromSubClass() 
{ 
    if (typeof getStringFromSubClass == 'function') 
    { 
     return getStringFromSubClass(); 
    } 
    else 
    { 
     alert('getStringFromSubClass() needs to be defined.') 
    } 
} 

function testFunction() 
{ 
    alert(doGetStringFromSubClass()); 
} 

y, en las ramas de las subclases, tenemos esta main.js:

function getStringFromSubClass(){ 
    return "baseClassString"; 
    } 

Y esta rama:

{% extends 'BaseBundle:Default:index.html.twig' %} 

{% block javascripts %} 
    {{ parent() }} 

    {% javascripts 
     '@SomeSubclassBundle/Resources/js/main.js' 
    %} 

    <script type="text/javascript" src="{{ asset_url }}"></script> 
    {% endjavascripts %} 
{% endblock %} 

Un poco tonto, pero funciona.

de Scott

17

Mi sugerencia de utilizar variables globales:

{% javascripts '@AcmeBundle/Resources/public/js/*' output='js/compiled/main.js'%} 
     <script> 
      var TWIG = {}; 
      TWIG.variableOne = "{{ path('rote_to_nowhere') }}"; 
      TWIG.variableTwo = "{{ helloworldVar }}"; 
      TWIG.variableThree = "{{ "something"|trans }}"; 
     </script> 
     <script type="text/javascript" src="{{ asset_url }}"></script> 
{% endjavascripts %} 

a continuación, puede utilizarlo en su js archivo:

alert(TWIG.variableTwo); 
+0

Esto es perfecto para lo que necesito, rutas generadas para su uso en consultas ajax. –

+3

Posiblemente usando 'var TWIG = TWIG || {}; ', especialmente cuando planeas usar esto dos veces. – jeroenvisser101

+0

@LaytonEverson El [FosJsRoutingBundle] (https://github.com/FriendsOfSymfony/FOSJsRoutingBundle) puede ayudarlo con eso – MauganRa

-1

quiero usar

<!DOCTYPE html> 
<html> 
<body> 

<p>A function is triggered when the user releases a key in the input field. The function outputs the actual key/letter that was released inside the text field.</p> 

Enter your name: <input type="text" id="fname" onkeyup="myFunction()"> 

<p>My name is: <span id="demo"></span></p> 

<script> 
function myFunction() { 
    var x = document.getElementById("fname").value; 
    document.getElementById("demo").innerHTML = x; 
} 
</script> 

</body> 
</html> 

en TWI G

+0

¿Es esta una respuesta? –

+0

Esto no es una respuesta. Es solo una declaración que puede o no ser su propia pregunta. – innerurge1

Cuestiones relacionadas