1

我将 Symfony2 与 Twig 一起使用,当试图确定应该是 div 的类时,Twig 说所有 4 个类都处于活动状态,即使在 if..else 子句中也是如此。重定向只有 1 个值。我检查了语法,我认为它是正确的,所以也许我遗漏了一些东西。

我的代码是正确的还是 Twig 比较有问题(平等或 if..else 子句)?

这是树枝代码:

{% if redirect == 'a' %}
    {% block classA 'active' %}
{% elseif redirect == 'b' %}
    {% block classB 'active' %}
{% elseif redirect == 'c' %}
    {% block classC 'active' %}
{% else %}
    {% block classD 'active' %}
{% endif %}

和控制器代码:

[...]
$redirect = "a";

return $this->render('FrontendBundle:Default:delete.html.twig', array(
    'id' => $id,
    'redirect' => $redirect,
    'text' => $text)
);

已编辑。

解决方案

我发现不可能在一个块之外使用 if 子句,因此解决方案继续使用每个类一个块。

我还认为更好的解决方案是使用动态名称块,但我读到这是不可能的。

最后我发现这个以不同的方式解决了我的问题:http: //peter-hoffmann.com/2012/highlight-active-menu-item-with-twig-and-silex.html

亲切的问候。

4

2 回答 2

1

尽管这个问题很老,但我想澄清一些事情,因为没有提供真正的答案。

这里的根本问题是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' 没有被渲染,因为它没有在父模板中定义。

要解决这个问题,需要从本质上交换ifandblock语句。

{% 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 %}
于 2019-05-31T19:38:28.837 回答
0

我不确定你是否对这种行为采取了最有效的方法,但无论如何,你的块不应该这样定义吗?

{% block classA %}active{% endblock %}

于 2013-01-23T11:49:56.963 回答