我从布局文件导入宏,在该宏内部我定义了几个树枝块。
当我扩展我的基地时,新视图中的布局文件'文件,我不能覆盖我在宏中定义的块的内容。
这是我的用例的一个非常简化的最小版本。
结构:
base.twig
{% import 'macros' as macros %}
<section>
{{ macros.render_sections() }}
{% block working %}
content1-default
{% endblock %}
</section>
macro.twig
{% macro render_sections() %}
<section>
{% block notworking %}
content2-default
{% endblock %}
</section>
{% endmacro %}
view.twig
{% extends "base" %}
{% block working %}
content1-override
{% endblock %}
{% block notworking %}
content2-override
{% endblock %}
预期行为: 我希望看到&#34; content1-override content2-override&#34;在我的HTML中。
实际发生的事情: 我看到&#39; content1-override content2-default&#39;
有没有办法将块范围传递给宏?
我已经尝试在base.twig文件中定义宏,以排除导入功能,但这没有帮助。 显然其他一切都有效,因为我可以看到被覆盖的块。
答案 0 :(得分:8)
你应该了解Twig的内部结构:
所有Twig文件都转换为PHP类
{% extends %}
等同于PHP extends
(用于继承)。
{% import %}
将您的上下文属性指定给“您正在导入的twig文件”类型的对象
块只不过是php方法,而本机的php继承让你可以甜蜜地覆盖Twig块。
因此,考虑到这一点,您转换的树枝代码将如下所示:
class base {
public function display() {
$context['macros'] = new macros();
$context['macros']->render_sections();
echo '<section>';
echo $this->blockWorking();
echo '</section>';
}
public function blockWorking() {
echo "content1-default";
}
}
class macros {
public function render_sections() {
echo '<section>';
echo $this->blockNotWorking();
echo '</section>';
}
public function blockNotWorking() {
echo "content2-defualt";
}
}
class view extends base {
public function blockWorking() {
echo "content1-override";
}
public function blockNotWorking() {
echo "content2-override";
}
}
$view = new view();
$view->display();
您可以在此清楚地看到视图类的blockNotWorking()
方法不能永远不会覆盖宏的方法。