【问题标题】:Twig embed and variable scopeTwig 嵌入和可变范围
【发布时间】:2016-12-10 22:41:05
【问题描述】:

我在嵌套树枝嵌入时遇到了一些问题,尤其是当两个嵌入都定义了相同的变量时。

一个例子:一个简单的代码摘自表单布局,其中包含一个字段集、一些行和输入元素(为了清楚起见,删除了一些变量):

{% embed 'components/frmGroup' with {'id':'myFieldset'} %}
    {% block main %}
        {% embed 'components/frmRow' with {'id':'mySpecialFormRow'} %}
            {% block main %}
                {% include 'components/inpText' %}
                ...
            {% endblock %}
        {% endembed %}
        {% embed 'components/frmRow' %}
            {% block main %}
                {% include 'components/inpText' %}
                ...
            {% endblock %}
        {% endembed %}
    {% endblock %}
{% endembed %}

如您所见,frmGroup(字段集)和 frmRow(行)组件都可以采用变量 id。第一个 frmRow 嵌入很好,因为它定义了自己的 id,第二个 frmRow 出现问题,它不需要特定的 id(因此不定义一个)。但是当我查看输出的 html 代码时,我看到 formrow 带有 #myFieldset,即在 frmGroup 嵌入上设置的 id。不是我想要完成的:)

我尝试过使用“only”关键字,但这给了我一些非常奇怪的结果。我可以使用不同的变量名(frmGroupId 和 frmRowId),但这感觉很糟糕(并且会造成混乱),我还可以在第二个 frmRow 上显式定义和清空 id,但是我必须记住要在嵌套嵌入上定义哪些变量,这也不好看。

那么我该如何解决这个问题(在 Twig 中可以解决)?

【问题讨论】:

  • 只需通过null id 并进行相应的测试? twigfiddle
  • 是的,但这意味着:1:你总是知道上下文......如果你把一组嵌入移动到不同的上下文中,可能会再次出现问题。 2:稍后将变量添加到最顶层的嵌入可能会破坏整个项目中的所有嵌套嵌入 3:大量额外代码(每个嵌套嵌入都需要变量重置)这是一个“可以使它工作”的解决方案,但我希望有更强大的东西:)
  • 评论这个策略对我来说有点困难。我通常将一个对象或一组对象传递给我的视图。在我的情况下,您的第一个 ID 可能属于具有产品的类别,使代码更易于维护,因为我几乎没有冲突变量{{ category.getId() }}{% for product in products %}{{ product.getId() }}{% endfor %}

标签: scope twig embed


【解决方案1】:

我试过你的例子,结果完全正常:

{% set id = "1" %}
{# id is 1 #}
{% embed "_test.html.twig" with { id: "2"} only %}
    {# id is 2 for the scope #}
    {% block main %}
        {% embed "_test.html.twig" with { id: "3"} %} 
           {# id is 3 for the scope #}
        {% endembed %}
        {% embed "_test.html.twig" %}
           {# id value is still 2 #}
        {% endembed %}
    {% endblock %}
{% endembed %}
{% embed "@_test.html.twig" %}
    {# id value is 1 #}
{% endembed %}

使用 _test.html.twig:

{% block main %}
 {{ id|default('null') }}
{% endblock %}

返回

3 2 1

我唯一想到的就是让你使用临时变量:

{% embed "@InddigoMain/_test.html.twig" with { id: "2"} %}
    {% block main %}
        {% embed "@InddigoMain/_test.html.twig" with { id: "3"}  %}
        {% endembed %}
        {% set temp = id %}
        {% set id = null %}
        {% embed "@InddigoMain/_test.html.twig" %}
        {% endembed %}
        {% set id = temp %}
    {% endblock %}
{% endembed %}
{% embed "@InddigoMain/_test.html.twig"  %}
{% endembed %}

返回

3 空 1

我已经检查了树枝包,但我认为它不存在。

【讨论】:

  • 关键字“only”定义了局部变量,对吧?
  • @vuquanghoang 不,它告诉 twig 只从父变量中获取这个变量。例如,在 PARENT.html.twig 中有 2 个变量:foobar。如果您仅将foo 传递给EMBEDED.html.twig,则此嵌入模板无法访问bar,只能访问foo
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多