递归 html 调用未返回正确的值

问题描述 投票:0回答:1

在这里,我尝试递归调用一个 html 模板,它在类别中循环,其中包含附加到某些类别的某些自定义字段,一切正常,但计数器(

maxCategories
)将负责仅显示某个特定的内容。类别或子类别的数量。

代码:

{% block homepage_category_lister %}
    {% set navigationMaxDepth = 4 %}
    {% if not maxCategories %}
        {% set maxCategories = 0 %}
    {% endif %}

{% if not level %}
    {% set level = 0 %}
{% endif %}

    {% for treeItem in navigationTree %}
        {% if maxCategories < 6 %}

        {% set category = treeItem.category %}
        {% set name = treeItem.category.translated.name %}
        {% set link = category_url(treeItem.category) %}

        {% if treeItem.category.customFields['custom__test'] == 'yes' %}

            {% block home_categories_listing_box %}
                    <div class="category--box">
                        <a href="{{category_url(category)}}"
                           itemprop="url"
                           title="{{ name | striptags }}">
                            {% sw_thumbnails 'home--categories--teaser--images' with {
                                media: category.media,
                                sizes: {
                                    'default': '2500px'
                                },
                                attributes: {
                                    'class': 'home--categories--teaser--images',
                                    'alt': (category.media.translated.alt ?: ''),
                                    'title': (category.media.translated.title ?: ''),
                                    'data-object-fit': 'cover',
                                    'loading': 'lazy'
                                }
                            } %}
                            <span itemprop="name" class="category--box--name">
                        {{ name | striptags }}
                    </span>
                        </a>
                    </div>
            {% endblock %}

            {% set maxCategories = maxCategories + 1 %}
            {{ dump(maxCategories) }}

        {% endif %}


        {% block home_categories_listing_box_recrussive %}
            {% if level < navigationMaxDepth%}
                {% sw_include '@SynThemeTutorialTheme/storefront/page/content/custom-fields-listener.html.twig' with {
                    'navigationTree': treeItem.children,
                    'level': level + 1,
                    'maxCategories': maxCategories }
                    only %}

            {% endif %}
        {% endblock %}
        {% endif %}
    {% endfor %}
{% endblock %}

问题:

  • maxCategories
    返回的数字如下所示 1(类别),2(类别)2(子类别)3(子类别)4(最后一个子类别)类别元素)2(类别)3(类别)这意味着
    maxCategories
    没有正确传递,但我仍然无法在我的代码中找到错误,但它看起来合乎逻辑,我弄乱了什么吗?

我尝试过的解决方案:

  • 删除了子类别并仅使用父类别,它给了我相同的计数器结果:1,2,2...等。
  • 尝试将我的代码分解为多个
    for
    +
    if
    语句 + 模板,而不是一个递归模板(工作正常,但我想通过递归找到解决问题的方法)

图片:

php html recursion twig categories
1个回答
0
投票

在用于显示类别和子类别同时跟踪 maxCategories 计数器的递归模板中,可能会出现问题,因为 maxCategories 值并未有效地限定循环内每次迭代的范围。因此,无论深度如何,每个类别的计数都会全局递增。

为了确保 maxCategories 计数的范围适用于每个递归级别并且不会全局递增,您可以考虑传递一个数组或对象来存储每个递归级别的计数。这是调整后的方法:

调整:

  1. 传递 maxCategories Count 数组: 修改您的递归调用以传递一个数组,该数组保存每个递归级别的计数。

  2. 使用带有范围计数的递归: 调整 maxCategories 计数的处理,以维护每个递归级别的单独计数。

    {% block homepage_category_lister %}
        {% set navigationMaxDepth = 4 %}
    
        {% if not maxCategories %}
            {% set maxCategories = {} %}
        {% endif %}
    
        {% if not level %}
            {% set level = 0 %}
        {% endif %}
    
        {% for treeItem in navigationTree %}
            {% if maxCategories[level] is not defined %}
                {% set maxCategories = maxCategories|merge({(level): 0}) %}
            {% endif %}
    
            {% if maxCategories[level] < 6 %}
                {% set category = treeItem.category %}
                {% set name = treeItem.category.translated.name %}
                {% set link = category_url(treeItem.category) %}
    
                {% if treeItem.category.customFields['custom__test'] == 'yes' %}
                    {# Your category display block #}
    
                    {% set maxCategories = maxCategories|merge({(level): maxCategories[level] + 1}) %}
    
                    {{ dump(maxCategories[level]) }}
                {% endif %}
    
                {% block home_categories_listing_box_recrussive %}
                    {% if level < navigationMaxDepth %}
                        {% sw_include '@SynThemeTutorialTheme/storefront/page/content/custom-fields-listener.html.twig' with {
                        'navigationTree': treeItem.children,
                        'level': level + 1,
                        'maxCategories': maxCategories
                        } only %}
                    {% endif %}
                {% endblock %}
            {% endif %}
        {% endfor %}
    {% endblock %}
    

此调整应为每个递归级别维护单独的计数器,允许您独立限制显示类别和子类别的数量。根据需要调整逻辑,特别是在处理类别显示和递增计数器的代码部分。

© www.soinside.com 2019 - 2024. All rights reserved.