Индексная страница Twig добавляет число c в одну категорию - PullRequest
0 голосов
/ 07 мая 2020

На платформе SaaS я пытаюсь создать страницу индекса / карту сайта для веб-сайта с большим количеством категорий. Поскольку это платформа SaaS, я не могу использовать / создавать какие-либо пользовательские функции. Это должно быть сделано во внешнем интерфейсе.

Я пытаюсь разделить список категорий на список, разделенный буквами и цифрами. Таким образом, название категории, начинающееся с A, будет go в категории «A», категория, начинающаяся с числа (например, 18 лет), будет go в категории под названием «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 и c. Например:

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

[1]
- 2 years
- 22 years

Также неправильный порядковый номер. Таким образом, он показывает 1 под 0 и 2 под 1. Вместо:

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

Я просто не могу понять, почему это так. Итак, мой вопрос: как я могу поместить [числовые] категории в одну категорию ie с именем [0-9] вместо того, чтобы помещать их в отдельную категорию ie?

Мой код до сих пор выглядит как ( некоторые фильтры указаны c фильтры платформы):

{# ---------------- 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....

1 Ответ

2 голосов
/ 11 мая 2020

Вы сможете решить эту проблему, если переопределите 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 %}

демо


Хорошо, я просмотрел ваш кода и немного упростили процесс группировки. Вот код, который я бы использовал для объединения массивов в 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


It кажется, если вы используете var in [0, 1, ...], до twig 3.X 0 вернет ложное срабатывание.

Попробуйте использовать свой исходный код, тот, где все было сгруппировано в [0-9], но с следующий оператор

{% if currect_first_letter in [1, 2, 3, 4, 5, 6, 7, 8, 9] or currect_first_letter == '0' %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...