2013-08-06 66 views
1

我正試圖找到一種方法來擴展事件監聽器/訂戶中已知的枝條塊。Symfony2在事件監聽器中延伸枝條塊

該代碼是非常基本的。

主要枝杈:

<!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塊:身體和JavaScript的。

現在例如我有一個事件監聽器onKernelResponse。我想在這裏是能夠添加新的JavaScript到「枝」的「延伸」的「JavaScripts」塊。

的代碼可能是這樣的:

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

的$這個 - > twig->延長工作應該像$這個 - > twig->渲染,但而不是呈現一些新的東西,擴展()應獲取$ response並用'AcmeBundle:Javascript:index.html.twig'擴展它,我可以在其中添加更多內容到「javascripts」塊。

這裏是的例子「AcmeBundle:使用Javascript:index.html.twig」:

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

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

基本上我正在尋找一種方式來在事件偵聽器編程擴展樹枝塊。

感謝您的幫助提前。

回答

0

您可以在事件偵聽器中註冊一個樹枝全局變量以指示是否擴展該塊。

...或者您可以在您的事件監聽器中註冊的全局變量作爲模板代碼,與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',''); 但當然這隻允許我重寫全局變量,而不是添加元素。什麼是追加枝全局數組最好的最佳方式?再次感謝。 – Vincent