或许这个问题可以转为两个问题:
如果我在 .html.twig 中包含了一个模板,我可以控制显示或隐藏包含的树枝中的某些块吗?
我可以从几个树枝布局中延伸一根树枝吗?
我和一位同事刚刚发现了一件很酷的事情,它与这个问题有某种联系。
例如,如果您只想在调用renderBlock
(Twig 方法)方法而不是在扩展模板时渲染块,则可以使用此技巧。
{% if false %}
{% block subject %}
subject_message
{% endblock %}
{% endif %}
当您调用时renderBlock
(如此处 -> https://stackoverflow.com/a/7580461/922165),此块将被渲染,因为该方法不关心其他语句。
但是,当您扩展时 - 此块将永远不会显示。
例如,当您有一些其他电子邮件模板正在扩展的基本默认电子邮件模板时,这很有帮助。您可以在块中包装一些默认的电子邮件主题,并且该块不需要显示在其他模板上。
我不确定这是你要找的东西,你的描述有点模糊,所以我会坚持这个问题。
你可以用中间的模板来解决这个问题。
您不能直接包含模板并修改其块 AFAIK,但您可以创建第二个模板,扩展第一个模板并删除块,然后在需要的地方包含第二个模板。
假设这是您最初想要包含的模板:
<div>
This is the template you want to include (articleDetails.html.twig)
{% block article %}
This is some content you want to delete
{% endblock article %}
</div>
您可以尝试创建第二个模板,像这样扩展它:
{% extends 'articleDetails.html.twig' %}
{# This is template emptyArticle.html.twig, it deletes the article block #}
{% block article %}
{% endblock article %}
然后,您可以不包含 articleDetails,而是包含第二个模板(emptyArticle),您将获得第一个模板的内容,但不包含文章块的内容。您可以使用任意数量的块来执行此操作。
这已经超过了这个问题的“到期日期”,但如果其他人可能有类似的问题,我通过在包含的模板中使用 twig 变量解决了这个问题。
{% set myConditionalBlockToShow %}
<span>some interesting things {{ withVariable }}</span>
{% endset %}
{% if myCondition %}
{{ myConditionalBlockToShow }}
{% endif %}
您可以在包含中传递变量
{% include 'template.html' with {'foo': 'bar'} %}
在 template.html 中,您检查 'foo' 的值并根据值显示/隐藏您的块
或者,如果您有更复杂的模板,您可以拆分它们并在控制器中调用它们。
{% render url('latest_articles', { 'view': 2 }) %}
public function recentArticlesAction($view = 1) {
// make a database call or other logic
// to get the "$max" most recent articles
$articles = ...;
if($view == 2) {
return $this->render(
'AcmeArticleBundle:Article:recentList.html.twig',
array('articles' => $articles)
);
}
return $this->render(
'AcmeArticleBundle:Article:recentList2.html.twig',
array('articles' => $articles)
);
}
http://symfony.com/doc/current/book/templating.html#embedding-controllers