请记住,由于历史原因,Contao 3中的模板继承非常简约,不能与其他引擎(即我们在Contao 4中移动到的)的灵活性进行比较。
要回答你的问题: 你可以在你的模板中定义自己的块,然后在子模板中覆盖它。 事实上,每块在其名称中的“根”模板“创建”,然后重写,看到这个动作是指例如表单元素模板看到的form_row.html5代码:
// ... code omitted, refer to linked file.
<div class="<?= $this->prefix ?><?php if ($this->class) echo ' ' . $this->class; ?>">
<?php $this->block('label'); ?>
<?php $this->endblock(); ?>
<?php $this->block('field'); ?>
<?php $this->endblock(); ?>
</div>
// ... code omitted, refer to linked file.
的块这里介绍和覆盖在form_radio.html5:
<?php $this->extend('form_row'); ?>
<?php $this->block('field'); ?>
// ... code omitted, refer to linked file.
<?php $this->endblock(); ?>
正如你可以看到,该块field
被覆盖和label
不是。 我们现在可以在另一个模板中重新覆盖此块或覆盖另一个扩展form_radio.html5
的模板中的标签。
如上所述,有一定的局限性需要注意的:
- 你不允许引进一个子模板新的块(一个使用
$this->extend()
这样做会在异常结束被抛出。
- 不能块之外的子模板引入代码。
如果应该有剩余的问题,请更新您的问题,因为它是一个有点模糊猜测你想知道到底是什么。
谢谢你的解释。我想我得到了一些块的一部分,但仍然要学习。所以,你的解释意味着我们不能创建自己的块,但只能扩展父模板中已经存在的块?所以,当扩展form_row时,无论我们发布到块('field'); ?>会显示以前的元素? – DpEN
正确的是,您可以在扩展时覆盖块(放入新内容或包装来自父级的内容)或在不扩展时定义可用块,而不是在同一模板中。 – xtra