尽管这个问题很老,但我想澄清一些事情,因为没有提供真正的答案。
这里的根本问题是block
在编译时if
评估,而在运行时评估。这意味着总是定义块,不能有条件地定义块。这也是块不能有动态名称的原因。
使用问题中的模板,这不是问题:
类.html.twig:
{% if redirect == 'a' %}
{% block classA %}active{% endblock %}
{% elseif redirect == 'b' %}
{% block classB %}active{% endblock %}
{% elseif redirect == 'c' %}
{% block classC %}active{% endblock %}
{% else %}
{% block classD %}active{% endblock %}
{% endif %}
如果我们渲染它,我们会得到“活跃”,即预期的输出。虽然定义了每个块,但由于if
. 这个问题只有在我们有继承的情况下才会被发现。所以假设我们有以下父模板(我假设海报使用了类似的东西):
父.html.twig:
{% block classA %}{% endblock %}
{% block classB %}{% endblock %}
{% block classC %}{% endblock %}
{% block classD %}{% endblock %}
并更改我们的扩展模板以扩展它(还添加了 classE 用于演示目的):
类.html.twig:
{% extends "parent.html.twig" %}
{% if redirect == 'a' %}
{% block classA %}active{% endblock %}
{% elseif redirect == 'b' %}
{% block classB %}active{% endblock %}
{% elseif redirect == 'c' %}
{% block classC %}active{% endblock %}
{% else %}
{% block classD %}active{% endblock %}
{% endif %}
{% block classE %}undefined{% endblock %}
现在,如果我们渲染 classes.html.twig,我们会得到 'activeactiveactiveactive'。和之前一样,块都是用'active'定义的,但是父模板没有条件渲染,所以它们都显示出来了。块 'classE' 没有被渲染,因为它没有在父模板中定义。
要解决这个问题,需要从本质上交换if
andblock
语句。
{% extends "parent.html.twig" %}
{% block classA %}
{% if redirect == 'a' %}
active
{% endif %}
{% endblock %}
{% block classB %}
{% if redirect != 'a' and redirect == 'b' %}
active
{% endif %}
{% endblock %}
{% block classC %}
{% if redirect != 'a' and redirect != 'b' and redirect == 'c' %}
active
{% endif %}
{% endblock %}
{% block classD %}
{% if redirect != 'a' and redirect != 'b' and redirect != 'c' %}
active
{% endif %}
{% endblock %}
可悲的是,当我们这样做时,我们失去了 if/else 结构,所以我们必须编写更多的条件。为了解决这个问题,我们可以使用变量添加一个中间步骤。
{% extends "classes.html.twig" %}
{% if redirect == 'a' %}
{% set render = 'a' %}
{% elseif redirect == 'b' %}
{% set render = 'b' %}
{% elseif redirect == 'c' %}
{% set render = 'c' %}
{% else %}
{% set render = 'd' %}
{% endif %}
{% block classA %}
{% if render == 'a' %}
active
{% endif %}
{% endblock %}
{% block classB %}
{% if render == 'b' %}
active
{% endif %}
{% endblock %}
{% block classC %}
{% if render == 'c' %}
active
{% endif %}
{% endblock %}
{% block classD %}
{% if render == 'd' %}
active
{% endif %}
{% endblock %}