Как вы получаете случайные результаты по весу с Twig? - PullRequest
0 голосов
/ 07 января 2020

В настоящее время используется OctoberCMS и Twig для получения динамических c данных из файла json. Основная идея c заключается в следующем:

  • Имеет боковую панель с 3 ссылками
  • Ссылки боковой панели генерируются случайным образом при загрузке
  • Существуют определенные ссылки которые должны показываться чаще других, а некоторые с более низким приоритетом

Вот пример кода, с которого нужно начать, чтобы вы имели представление о том, чего я пытаюсь достичь:

"wiki": {
    "resources": {
      "items": [
          {
            "href": "[link]",
            "h3": "[Title]",
            "p": "[Description]",
            "tier": 1
          },
          {
            "href": "[link]",
            "h3": "[Title]",
            "p": "[Description]",
            "tier": 3
          },
          {
            "href": "[link]",
            "h3": "[Title]",
            "p": "[Description]",
            "tier": 2
          },
          {
            "href": "[link]",
            "h3": "[Title]",
            "p": "[Description]",
            "tier": 2
          },
          {
            "href": "[link]",
            "h3": "[Title]",
            "p": "[Description]",
            "tier": 2
          },
          {
            "href": "[link]",
            "h3": "[Title]",
            "p": "[Description]",
            "tier": 1
          },
          {
            "href": "[link]",
            "h3": "[Title]",
            "p": "[Description]",
            "tier": 3
          },
          {
            "href": "[link]",
            "h3": "[Title]",
            "p": "[Description]",
            "tier": 1
          },
          {
            "href": "[link]",
            "h3": "[Title]",
            "p": "[Description]",
            "tier": 2
          },
          {
            "href": "[link]",
            "h3": "[Title]",
            "p": "[Description]",
            "tier": 3
          }
        ]
    }
  }
 {% for item in 'wiki.resources.items'|translations %}
            <div class="ressources__item col-12 col-md-4 col-lg-12">
                <a href="{{ item.href }}">
                    <h3 class="ressources__sub">{{ item.h3 }} </h3>
                </a>
                <p>{{ item.p }}</p>
            </div>
        {% endfor %}

Мне, очевидно, нужно рандомизировать результаты массива и каким-то образом чаще всего показывать элементы Tier1, чаще всего - Tier2, а наименее часто - Tier3. Фильтр |translations просто помогает указать на файл json с соответствующими переводами - на всякий случай, если он вас смущает.

Пока я пытался преобразовать ответы из здесь и здесь , но без удачи.

У меня такое чувство, что я не могу переводить код для Twig самым идеальным способом, но я изо всех сил пытаюсь это выяснить. Любая помощь будет оценена!

1 Ответ

0 голосов
/ 08 января 2020

Решил это с помощью этого:

{% set linkWeight = 0 %}
        {% for item in 'wiki.resources.items'|translations %}
            {% set linkWeight = linkWeight + item.weight %}
        {% endfor %}
        {% set randomWeight = random(1,linkWeight) %}
        {% set linkArr = [] %}
        {% for item in 'wiki.resources.items'|translations %}
            {% set randomWeight = randomWeight - item.weight %}
            {% if randomWeight <= 0 %}
               {% set linkArr = linkArr|merge([item]) %}
            {% endif %}
        {% endfor %}
        {% for item in linkArr[:3] %}
            <div class="ressources__item col-12 col-md-4 col-lg-12">
                <a href="{{ item.href }}">
                    <h3 class="ressources__sub">{{ item.h3 }} </h3>
                </a>
                <p>{{ item.p }}</p>
            </div>
        {% endfor %}

По сути, я изменил ключи «уровня» в файле JSON на «вес» и добавил большее число для того, что было ранее Tier1, и наоборот для Tier3.

Если вам интересно, как это работает, вот статья , которая помогла мне логически понять, чего мне нужно было достичь. Единственное отличие состоит в том, что я создал другой массив с взвешенным случайным выбором, чтобы я мог отображать только 3 из выбора за один раз (как можно увидеть здесь: {% for item in linkArr[:3] %})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...