我想创建可以自己打印一些HTML代码的视图,同时将javascript代码发送到底部,而不扩展布局
我的想法是我有一个布局,然后当前url的特定视图扩展了该布局,并且在该视图中,我包含了其他视图,这些视图可以将代码添加到超出范围的其他块(因为它们不从布局或从其继承的视图继承而来。这可能吗?
假设这是我布局的一部分:
{# ::layout.html.twig #}
.
.
{% block javascripts %}
{% endblock %}
</body>
.
.
这是我的观点:
{# Company:Bundle:about.html.twig #}
{% extends '::layout.html.twig' %}
.
.
{% include 'Company:buttons:google_button.html.twig' %}
.
.
这是我想要包含的视图,例如,Google +1按钮:
{# Company:buttons:google_button.html.twig #}
<gb></gb> {# or whatever #}
{# somehow send '<script>blabla</script>' to the 'javascripts' block #}
是否可以使用twig和symfony2做这样的事情?
答案 0 :(得分:2)
我想你必须编写自己的Twig扩展,它将定义两个函数,比方说add_js
和print_js
。
Twig Extension:
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';
}
}
依赖注入配置:
<service id="twig.extension.me.my" class="Me\MyBundle\Twig\Extension\MyExtension" public="false">
<tag name="twig.extension" />
</service>
最终用法:
{# ::layout.html.twig #}
...
{{ print_js() }}
</body>
{# Company:buttons:google_button.html.twig #}
{% put_js('<script>...</script>') %}
答案 1 :(得分:2)
只想实现一个包含来自@Crozin的代码的包,但是在packagist.org我找到了一个已经完成的包:
答案 2 :(得分:1)
我刚刚使用“使用”实现了您遇到的确切问题: http://twig.sensiolabs.org/doc/tags/use.html
需要进行一些重构,因为您需要从主基本文件中删除javascript块并将其再次包含在javascript twig文件中。然后在视图中,您可以通过首先定义:
来访问javascript块 {% use 'ExampleBundle::javascript.html.twig' with javascript' %}