在这里,我尝试递归调用一个 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
没有正确传递,但我仍然无法在我的代码中找到错误,但它看起来合乎逻辑,我弄乱了什么吗?我尝试过的解决方案:
for
+ if
语句 + 模板,而不是一个递归模板(工作正常,但我想通过递归找到解决问题的方法)图片:
在用于显示类别和子类别同时跟踪 maxCategories 计数器的递归模板中,可能会出现问题,因为 maxCategories 值并未有效地限定循环内每次迭代的范围。因此,无论深度如何,每个类别的计数都会全局递增。
为了确保 maxCategories 计数的范围适用于每个递归级别并且不会全局递增,您可以考虑传递一个数组或对象来存储每个递归级别的计数。这是调整后的方法:
调整:
传递 maxCategories Count 数组: 修改您的递归调用以传递一个数组,该数组保存每个递归级别的计数。
使用带有范围计数的递归: 调整 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 %}
此调整应为每个递归级别维护单独的计数器,允许您独立限制显示类别和子类别的数量。根据需要调整逻辑,特别是在处理类别显示和递增计数器的代码部分。