Twig indexpage 在一个类别中添加数字

Twig indexpage add numeric in one single category

在 SaaS 平台上,我尝试为一个包含很多类别的网站创建一个 indexpage/sitemap。 由于它是一个 SaaS 平台,我无法 use/create 自定义任何功能。 它必须在前端完成。

我尝试做的是将类别列表划分为按字母和数字划分的列表。 因此,以 A 开头的类别名称将归入类别 "A",以数字(例如 18 岁)开头的类别将归入名为“0-9”的类别。所以我会得到一个像这样的索引页:

[A]
- Alpha
- Anton
- etc..

[B]
- Beta
- Brave
- etc..

[C]
- Charlie
- Cooking
- etc..

[0-9]
- 1 year
- 20 years
- 99 years
- etc..  

我设法使它适用于所有字母。然而,它并不总是将数字放在 [0-9] 类别中。我的脚本有时会为例如 0 或 7 等创建一个单独的索引。所以像:

[0]
- 1 year
- 18 years
- etc..

[1]
- 2 years
- 22 years

索引号也错了。所以它在 0 下显示 1,在 1 下显示 2。而不是:

[0-9]
- 1 year
- 18 years
- 2 years
- 22 years

我只是不明白这是为什么。所以我的问题是如何将 [numeric] 类别放在一个名为 [0-9] 的类别中,而不是将它们放在单独的类别中?

我的代码现在看起来像(一些过滤器是特定平台过滤器):

{# ---------------- BEGINING ------------------- #}
{% set all_categories = [] %}
{% for category in shop.categories  %}
  {% set all_categories = all_categories | merge({ (0): category }) %}
    {% for sub in category.subs  %}
        {% set all_categories = all_categories | merge({ (0): sub }) %}
    {% for sub_sub in sub.subs  %}
        {% set all_categories = all_categories | merge({ (0): sub_sub }) %}
                {% for sub_sub_sub in sub_sub.subs  %}
            {% set all_categories = all_categories | merge({ (0): sub_sub_sub }) %}
        {% endfor %}
    {% endfor %}
    {% endfor %}
{% endfor %}


{% set categories = all_categories %}

{# ---------------- SORT LOGIC ------------------- #}
{# 'categories' array will be sorted and saved as 'grouped_categories' variable #}

{% set sorted_categories = [] %}
{% for key in categories | keys %}
  {% set sorted_categories = sorted_categories | merge({ (key): categories[key].title }) %}
{% endfor %}
{% set sorted_categories = sorted_categories | sort %}

{% set first_letter = '' %}
{% set grouped_categories = [] %}
{% set new_group = [] %}

{% for i in sorted_categories  | keys %}
    {% if(categories[i].title) %}
        {% set currect_first_letter = categories[i].title | first | upper %}
        {% if(currect_first_letter != first_letter) %}
            {% if(new_group) %}
                {% set grouped_categories = grouped_categories | merge({ (first_letter): new_group }) %}
            {% endif %}
            {% set first_letter = currect_first_letter %}
            {% set new_group = [categories[i]] %}
        {% else %}
            {% set new_group = new_group | merge({ (0): categories[i] }) %}
        {% endif %}
    {% endif %}
{% endfor %}
{% set grouped_categories = grouped_categories | merge({ (first_letter): new_group }) %}

{# ---------------- USING ------------------- #}

    <div class="single-letter">
      <span class="custom-title">{{ "All themes"  }}:</span>
      <ul>
      {% for letter in grouped_categories[1:] | keys %}
        <li><a href="#letter-{{ letter}}">{{ letter }}</a></li>
      {% endfor %}
      {% for letter in grouped_categories[:1] | keys %}
        <li><a href="#letter-{{ letter}}">{{ '0-9' }}</a></li>
      {% endfor %}
      </ul>
    </div>

    {% for letter in grouped_categories[1:] | keys %}
    <div id="letter-{{letter}}" class="letter-wrap">
      <h3 class="title">{{ letter }}</h3>
      <div class="group">
        <ul>
        {% for category in grouped_categories[letter] %}
          <li><a href="{{ category.url }}">{{ category.title }}</a></li>
        {% endfor %}
        </ul>
      </div>
    </div>
    {% endfor %}

        {% for letter in grouped_categories[:1] | keys %}
    <div id="letter-{{letter}}" class="letter-wrap">
      <h3 class="title">{{ '0-9' }}</h3>
      <div class="group">
        <ul>
        {% for category in grouped_categories[letter] %}
          <li><a href="{{ category.url }}">{{ category.title }}</a></li>
        {% endfor %}
        </ul>
      </div>
    </div>
    {% endfor %}


{# ---------------- THE END ------------------- #}

根据要求更新

更新代码

    {% for category in categories %}
        {% set currect_first_letter = category | first | upper %}
        {% if currect_first_letter in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] %}
            {% set currect_first_letter = '0-9' %}
        {% endif %}

        {% if not (currect_first_letter in (grouped_categories | keys)) %}
            {% set grouped_categories = grouped_categories | merge({ (currect_first_letter): [], }) %}
        {% endif %}
        {% set grouped_categories = grouped_categories | merge({ (currect_first_letter) : grouped_categories[currect_first_letter] | merge([ category, ]), }) %}
    {% endfor %}

{#{% set sorted_categories = [] %}
{% for key in categories | keys %}
  {% set sorted_categories = sorted_categories | merge({ (key): categories[key].title }) %}
{% endfor %}
{% set sorted_categories = sorted_categories | sort %}

{% set first_letter = '' %}
{% set grouped_categories = [] %}
{% set new_group = [] %}
{% for i in sorted_categories  | keys %}
    {% if(categories[i].title) %}
        {% set currect_first_letter = categories[i].title | first | upper %}

        {% if(currect_first_letter != first_letter) %}
            {% if(new_group) %}
                {% set grouped_categories = grouped_categories | merge({ (first_letter): new_group }) %}
            {% endif %}
            {% set first_letter = currect_first_letter %}
            {% set new_group = [categories[i]] %}

        {% else %}
            {% set new_group = new_group | merge({ (0): categories[i] }) %}
        {% endif %}
    {% endif %}
{% endfor %}
{% set grouped_categories = grouped_categories | merge({ (first_letter): new_group }) %}#}

结果是:

The merge filter only works with arrays or hashes; NULL and array given in....

如果您重写 currect_first_letter.

,您应该能够解决这个问题
{% set currect_first_letter = categories[i].title | first | upper %}
{% if currect_first_letter in [0, 1, 2, 3, 4, 5, 6, 7, 8 , 9, ] %}
    {% set currect_first_letter = '0-9' %} {# change to same group #}
{% endif %}

demo


好的,我已经检查了您的代码并稍微简化了分组过程。 这是我用来在 twig

中组合数组的代码
{% set grouped_categories = [] %}

{% for category in categories %}
        {% set currect_first_letter = category | first | upper %}

        {# ----- ADDED THIS LINE ------- #}
        {% if currect_first_letter in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] %}
            {% set currect_first_letter = '0-9' %}
        {% endif %}
        {# ----------------------------- #}
        {% if not (currect_first_letter in (grouped_categories | keys)) %}
            {% set grouped_categories = grouped_categories | merge({ (currect_first_letter): [], }) %}
        {% endif %}
        {% set grouped_categories = grouped_categories | merge({ (currect_first_letter) : grouped_categories[currect_first_letter] | merge([ category, ]), }) %}
{% endfor %}

验证目的:

{% for key in grouped_categories|keys %}
    Key: {{ key }}
    Values: 
            {% for value in grouped_categories[key] %}
                - {{ value }}

            {% endfor %}

{% endfor %}

demo


似乎如果您使用 var in [0, 1, ...],在 twig 3.X 之前 0 将 return 误报。

尝试使用您的原始代码,即所有内容都分组在 [0-9] 中的代码,但使用以下语句

{% if currect_first_letter in [1, 2, 3, 4, 5, 6, 7, 8, 9] or currect_first_letter == '0' %}