来自一个循环的 Twig 变量在另一个循环中不起作用

Twig variable from one loop in another doesn't work

我在 Twig 中有两个循环。一种是查看产品的库存水平,另一种是显示一些产品选项。我正在尝试从一个循环创建一个变量,我可以在另一个循环中使用它来将 class 名称添加到列表中。

我无法让它工作。欢迎任何帮助...

我的是这样的:

          {% set stockLevel = '' %}
          {% for variant in product.variants %}
          {% set stockLevel = variant.stock.level %}
          {{ stockLevel }} // gives 1 0 1 1 (So all sizes except the second one are available)
         {% endfor %}

            {% for option in product.options %}
                <ul class="optionslist">
                  {% if option.values %}
                  {% for value in option.values %}


        <li class=" {% if stockLevel == 0 %}not_on_stock {% endif %}" >
          <a class="item">etc...</a>
        </li>             

                {% endfor %}
                {% endif %}
               </ul>
            {% endfor %}

我认为您处理数据的方式有问题。现在,如果你的变量在你的第二个 for 循环中是可访问的,它的值将是最后一组,你的脚本无论如何都会失败。

我可以建议一些 hacky 方法,随意即兴创作或使用它背后的想法。

比如说,我们分配一个空数组:

{% set variantsArray = [] %}

然后,我们将使用过滤器 merge 用一些虚拟数据填充它(这就是您的第一个循环发挥作用的地方)

{% for number in 1..5 %}
    {% set variantsArray = variantsArray | merge([number]) %}
{% endfor %}

然后可以肯定的是,我们可以访问那里的所有值,我们将把它转储出来(这就是你的第二个循环的来源)

{% for index in 1..3 %}
    {{ dump(variantsArray) }}
{% endfor %}

生成了以下转储:

array:5 [▼
   0 => 1
   1 => 2
   2 => 3
   3 => 4
   4 => 5
]

希望你明白了。欢迎任何建议。

我不确定您要做什么,您如何从变体中获得库存水平?我认为最好有一个服务功能来帮助您按产品获得库存水平,代码会更清晰:

控制器动作

$stock_helper = $this->container->get('stockhelper_service');
$stocklevel = $stock_helper->getStockLevelByProduct($product); //getstocklevelbyproduct handle your logic and return the stock level integer.

将此变量传递给树枝。

你的树枝中有一个变量,那里没有循环,视图清晰,视图和操作中的代码易于理解。

好的,我找到了解决方案。诀窍是 "connect" 这两个值。像这样:

{% for option in product.options %}
    {% if option.values %}

        <ul id="product_configure_option2_{{ option.id }}" data-id="{{ option.id }}">
            {% for value in option.values %}

                {% set stock = null %}
                {% for variant in product.variants **if variant.title == (option.title ~ ': ' ~ value.title)** %}
                    {% set stock = variant.stock %}
                {% endfor %}

                <li value="{{ value.id }}"{% if not stock.available %} class="not_on_stock"{% endif %}>{{ value.title }}</li>
            {% endfor %}
        </ul>
    {% endif %}
{% endfor %}