我正在努力在 Twig 中选择一个以前的 for 循环。如果某个类别具有子类别,我正在尝试在该类别中显示一些类别标题。如果类别没有子类别,则它会显示上一个循环中的标题。通常,如果任何类别具有相同的深度,这将不是问题。不幸的是,这些类别具有不同的深度。
所以我试图做的是创建某种函数来为我做到这一点。
所以例如:
Category A -> Category A.sub -> Category A.subsub
Title1 Title1.1 Title1.2
Title1 Title1.1 Title1.2
Category B -> Category B.sub -> Category A.subsub
Title1 Title1.1 Title1.1
Title1 Title1.1 Title1.1
如您所见Category B.sub.sub
没有任何子类别。如果是这种情况,它应该显示Category B.sub
的子类别。通常我会做这样的事情:
{% for category in shop.categories %}
{{ category.title }}
{% if category.subs %}
{% for category in category.subs %}
{{ category.title }}
{% if category.subs %}
{% for category in category.subs %}
{{ category.title }}
{% endfor %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
有没有办法创建某种函数来检查类别是否具有子类别。如果不是这种情况,则访问上一个循环并显示这些类别名称。
我认为这很简单:
{% elseif not category.subs %}
{# Do this #}
但事实并非如此:(
我的建议是使 php 代码中的数组结构相似,不要在模板中放置这种逻辑。
所以在 php 中你会有这样的东西:
if (!isset($categoryB['sub']['subsub']) {
$categoryB['sub']['subsub'] = $categoryA['sub']['subsub'];
}
然后你的模板你只是迭代:
{% for category in shop.categories %}
{{ category.title }}
{% for category in category.subs %}
{{ category.title }}
{% for category in category.subs.subsub %}
{{ category.title }}
我还建议让它递归,这样你就会得到这样的东西:
{% itarerateCategoryes categories %}
同意 Fyntasia 我在模板中不会有很多逻辑,我会将控制器中的数据解析为我想要的形式。
但是,假设您的数据数组类似于(无法理解您的符号(;
$categories = [
0 => [
'top' => ['Atop1', 'Atop2'],
'middle' => ['Amiddle1', 'Amiddle2'],
'bottom' => ['Abottom1', 'Abottom2'],
],
1 => [
'top' => ['Btop1', 'Btop2'],
'middle' => ['Bmiddle1', 'Bmiddle2'],
],
];
类似的东西;
{% for main_index, category in categories %}
{% if category.top is defined and category.top|length > 0 %}
{{ loop.index0 }} has top values
{% endif %}
{% if category.middle is defined and category.middle|length > 0 %}
{{ loop.index0 }} has middle values
{% endif %}
{% if category.bottom is defined and category.bottom|length > 0 %}
{{ loop.index0 }} has bottom values
{% else %}
{{ loop.index0 }} has no value so using {{ categories[loop.index0 - 1].bottom|join(', ') }}
{% endif %}
<br />
{% endfor %}
输出类似的东西;
0 has top values 0 has middle values 0 has bottom values
1 has top values 1 has middle values 1 has no value so using Abottom1, Abottom2