2011-06-30 10 views
5

Quiero crear vistas que pueden por sí solas imprimir algo de código html, y al mismo tiempo, enviar código JavaScript a la parte inferior, sin extender el diseño¿Cómo enviar javascripts al final? (En Symfony 2)

La idea es que tengo un diseño , entonces la vista específica para la url actual amplía ese diseño, y dentro de esa vista, incluyo otras vistas, que tienen el poder de agregar código a otros bloques que están fuera del alcance (porque no heredan del diseño o del vista que hereda de él). ¿Es eso posible?

supongo que esto es una parte de mi diseño:

{# ::layout.html.twig #} 
. 
. 
{% block javascripts %} 
{% endblock %} 
</body> 
. 
. 

y este es mi punto de vista:

{# Company:Bundle:about.html.twig #} 
{% extends '::layout.html.twig' %} 
. 
. 
{% include 'Company:buttons:google_button.html.twig' %} 
. 
. 

Y esta es la vista que quiero incluir, por ejemplo, un Google +1 Botón:

{# Company:buttons:google_button.html.twig #} 
<gb></gb> {# or whatever #} 

{# somehow send '<script>blabla</script>' to the 'javascripts' block #} 

¿Es posible hacer algo como esto con twig y symfony2?

Respuesta

2

Supongo que tendrá que escribir su propia extensión Twig que definirá dos funciones, digamos add_js y print_js.

ramita Extensión:

namespace Me\MyBundle\Twig\Extension; 

class MyExtension extends \Twig_Extension { 
    private $js = array(); 

    /** 
    * {@inheritdoc} 
    */ 
    public function getFunctions() { 
     return array(
      'put_js' => new \Twig_Function_Method($this, 'putJs', array('is_safe' => array('html'))), 
      'print_js' => new \Twig_Function_Method($this, 'printJs', array('is_safe' => array('html'))) 
     ); 
    } 

    public function putJs($js) { 
     $this->js[] = $js; 
    } 

    public function printJs() { 
     return implode(PHP_EOL, $this->js); 
    } 

    /** 
    * Returns the name of the extension. 
    * 
    * @return string The extension name 
    */ 
    public function getName() { 
     return 'my'; 
    } 
} 

Dependencia configuración de inyección:

<service id="twig.extension.me.my" class="Me\MyBundle\Twig\Extension\MyExtension" public="false"> 
    <tag name="twig.extension" /> 
</service> 

uso final:

{# ::layout.html.twig #} 

    ... 
    {{ print_js() }} 
</body> 

{# Company:buttons:google_button.html.twig #} 

{% put_js('<script>...</script>') %} 
1

acabo de implementado el problema exacto que está enfrentando el uso de 'uso': http://twig.sensiolabs.org/doc/tags/use.html

Algunas refactorizaciones serán necesarias, ya que deberá quitar el bloque javascript de su archivo base principal e incluirlo nuevamente en un archivo javascript ramita. A continuación, dentro de la vista, se puede acceder al bloque de Javascript por primera definición:

{% use 'ExampleBundle::javascript.html.twig' with javascript' %}

+1

¿Estás diciendo que tengo que poner un bloque de 'uso' tanto en el diseño como en la vista? De lo contrario, ¿cómo va mi 'google_button' a poder enviar el código de JavaScript al final de la salida final? Si pongo el bloque 'usar' tanto en el diseño como en la vista, ¿no aparecerá dos veces en el resultado final? – HappyDeveloper

Cuestiones relacionadas