2011-06-30 28 views
5
Ben kendilerini bazı html kodunu yazdırmak ve aynı zamanda alta javascript kodu göndermek çıkaracağı görüşündedir görünümler oluşturmak isteyen

, düzen uzatmadan (symfony 2'de)Javascriptleri aşağıya nasıl gönderilir?

fikri bir düzen olması daha sonra, geçerli URL için belirli bir görünüm bu düzeni genişletir ve bu görünüm içinde, kapsam dışında olan diğer bloklara kod ekleme gücüne sahip başka görünümler ekleyebilirim (çünkü bunlar düzenden miras almazlar veya bunun kendisinden miras aldığını görüntüleyin. Mümkün mü?

bu benim düzen parçasıdır varsayalım:

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

ve bu benim görünümdür:

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

Ve bu, google 1 örneğin ben dahil etmek istediğiniz görünümüdür düğmesi:

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

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

Böyle bir şey dal ve symfony2 ile yapmak mümkün mü?

cevap

2

İki işlevi tanımlayacağınız kendi Twig uzantınızı yazmanız gerektiğini tahmin ediyorum, add_js ve print_js diyelim.

Twig Uzatma:

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'; 
    } 
} 

Bağımlılık enjeksiyon yapılandırma:

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

Final kullanım:

{# ::layout.html.twig #} 

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

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

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

Sadece 'Kullan' kullanarak karşı karşıya sorunu tam uyguladık: http://twig.sensiolabs.org/doc/tags/use.html

Javascript bloğunu ana temel dosyanızdan kaldırmanız ve bir javascript twig dosyasına yeniden eklemeniz gerekeceğinden, bazı refactoring'ler gerekli olacaktır. Sonra görünümü içinde, önce tanımlayarak javascript bloğu erişebilirsiniz:

:

+1

Hem düzende hem de görünümde bir 'use' bloğu koymam gerektiğini mi söylüyorsunuz? Aksi takdirde, 'google_button' javascript kodunu son çıktının altına nasıl gönderebilir? 'Layout' bloğunu hem düzende hem de görünümde koyarsam, son çıktıda iki kez görünmez mi? – HappyDeveloper

2

{% use 'ExampleBundle::javascript.html.twig' with javascript' %} sadece ben zaten bitmiş paket bulundu @Crozin uzak ama packagist.org üzerinde kodu içeren bir paket uygulamak istedi Asset Managment Bundle

İlgili konular