我从布局文件导入一个宏,并在该宏内部定义了几个树枝块.
当我在新的"视图"文件中扩展"基础"布局文件时,我无法覆盖我在宏中定义的块的内容.
这是我的用例的一个非常简化的最小版本.
结构体:
base.twig
{% import 'macros' as macros %}
<section>
{{ macros.render_sections() }}
{% block working %}
content1-default
{% endblock %}
</section>
Run Code Online (Sandbox Code Playgroud)
macro.twig
{% macro render_sections() %}
<section>
{% block notworking %}
content2-default
{% endblock %}
</section>
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)
view.twig
{% extends "base" %}
{% block working %}
content1-override
{% endblock %}
{% block notworking %}
content2-override
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
预期的行为:我希望在我的html中看到"content1-override content2-override".
实际发生的事情:我看到'content1-override content2-default'
有没有办法将块范围传递给宏?
我已经尝试在base.twig文件中定义宏,以排除导入功能,但这没有帮助.显然其他一切都有效,因为我可以看到被覆盖的块.
你应该了解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();
Run Code Online (Sandbox Code Playgroud)
你可以在这里清楚地看到,blockNotWorking()视图类的方法不能永远不会覆盖宏的方法.
| 归档时间: |
|
| 查看次数: |
2178 次 |
| 最近记录: |