2013-08-06 3 views
1

Я пытаюсь найти способ расширения известного блока ветви в прослушивателе событий/подписчике.Symfony2 Extend Twig Block в прослушивателе событий

Код очень простой.

Главная веточка:

<!doctype html> 
<html> 
<head> 
<meta http-equiv="content-type" content="text/html; charset=utf-8"> 
<title>Hello World</title> 
</head> 
<body> 

{% block body %}{% endblock %} 

{% block javascripts %}{% endblock %} 

</body> 
</html> 

Как вы можете видеть, что это просто обычный HTML с 2-х блоков: тело и JavaScripts.

Теперь, например, у меня есть прослушиватель событий onKernelResponse. Я хочу здесь, чтобы добавить новый javascript в блок «javascripts» с расширением «twends».

Код может быть что-то вроде:

public function onKernelResponse(FilterResponseEvent $event) 
{ 
    if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) { 
     return; 
    } 

    $response = $event->getResponse(); 

    //complete guesswork code to illustrate what I'm trying to achieve 

    $content = $this->twig->extend(//extend() function is imaginary 
     $response, //pass in current response 
     'AcmeBundle:Javascript:index.html.twig', 
    ); 
    $response->setContent($content); 
} 

$ this-> twig-> простираться должны работать как $ this-> twig-> рендер, но вместо того, чтобы вынести что-то новое, расширить() следует возьмите $ response и расширьте его с помощью «AcmeBundle: Javascript: index.html.twig», где я могу добавить больше контента в блок «javascripts».

Вот пример «AcmeBundle: Javascript: index.html.twig»:

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

    <script> 
     var something = "new"; 
    </script> 
{% endblock %} 

В основном я искал способ программно расширить прут блок в обработчиках событий.

Спасибо за помощь заранее.

ответ

0

Вы можете зарегистрировать глобальную переменную twig в прослушивателе событий, чтобы указать, может ли продлить блок.

... или вы можете включить глобальную переменную, зарегистрированную в вашем прослушивателе событий, в виде кода шаблона, несколько похожа на eval с использованием функции твика template_from_string().

{% block javascripts %} 
    {{ parent() }} 
    {{ include(template_from_string(global_variable_name|default(''))) }} 
{% endblock %} 
+0

Спасибо за быстрый ответ nifr. Что делать, если у нас есть несколько прослушивателей событий для добавления нескольких кодов в блок? – Vincent

+0

зарегистрировать переменную массива, если она еще не существует, добавить в нее элементы в каждом прослушивателе .. затем перебрать ее при включении :) – nifr

+0

Я пытаюсь выяснить, как добавить элементы к глобальной переменной: $ twig-> addGlobal ('js_footer_extra', ''); Но, конечно, это позволяет мне переопределить глобальную переменную, а не добавлять к ней элементы. Каков наилучший способ добавить к глобальному массиву twig? Еще раз спасибо. – Vincent

Смежные вопросы