Как использовать Jekyll для сортировки сообщений по пользовательской переменной YAML?

Я пытаюсь создать страницу на своем сайте Jekyll, которая будет отображать настраиваемую переменную и перечислять сообщения, содержащие эту настраиваемую переменную.

Я создал блог с обзором фильмов, используя шаблон, созданный Тиаго Россенером: Шаблон Тьяго: https://github.com/thiagorossener/jekflix-template Мой сайт: https://www.howdareyoureview.com/

в каждом посте я определил пользовательские переменные во вступительной части YAML, которые относятся к деталям фильма (например, актер, оценка режиссера и т. д.)

Например:

---
layout: post
title: "Baby Driver"
image: 'https://res.cloudinary.com/how-dare-you-review/image/upload/c_fill,h_399,w_760/v1529865791/baby-driver.png'
tags:
- action
score: 72
director: Edgar Wright
written-by: Edgar Wright
staring: 
- Ansel Elgort
- Lily James
- Eiza González
- Jon Hamm
- Jamie Foxx
---

Я хочу создавать страницы точно так же, как страница тегов, которая уже существует в этом шаблоне: https://www.howdareyoureview.com/tags/

за исключением того, что я хотел бы сортировать по режиссеру, ролям и т. д., а не по тегам. страница тегов создается с использованием следующего кода в файле tags.html:

---
layout: minimal
title: "#Tags"
permalink: /tags/index.html
description: "Procure por sua #tag favorita."
---

<div class="tags">
{% assign tags_list = site.tags %}
  {% if tags_list.first[0] == null %}
    {% for tag in tags_list %}
        <a href="#{{ tag | slugify }}">{{ tag }}</a>
    {% endfor %}
  {% else %}
    {% for tag in tags_list %}
        <a href="#{{ tag[0] | slugify }}">{{ tag[0] }}</a>
    {% endfor %}
  {% endif %}
{% assign tags_list = nil %}
</div>

{% for tag in site.tags  %}
    <div class="tag-wrapper">
    <span class="tag-title" id="{{ tag[0] | slugify }}">{{ tag[0] }}</span>
    <ul class="post-list">
        {% assign pages_list = tag[1] %}
        {% for post in pages_list reversed %}
            {% if post.title != null %}
            {% if group == null or group == post.group %}
            <li><a href="{{ site.url }}{{ post.url }}">{{ post.title }}<span class="entry-date"><time datetime="{{ post.date | date_to_xmlschema }}" itemprop="datePublished">{{ post.date | date: "%m/%d/%Y" }}</time></a></li>
            {% endif %}
            {% endif %}
        {% endfor %}
        {% assign pages_list = nil %}
        {% assign group = nil %}
    </ul>
</span>
</div>
{% endfor %}

Чтобы добиться этого для созданных мною пользовательских переменных, я попытался заменить «tag / tags» директором и сохранить файл в корневом каталоге как «directors.html», но страница пуста.

---
layout: minimal
title: "#Directors"
permalink: /directors/index.html
description: "Procure por sua director favorita."
---
<div class="directors">
{% assign directors_list = site.director %}
  {% if directors_list.first[0] == null %}
    {% for director in directors_list %}
        <a href="#{{ tag | slugify }}">{{ director }}</a>
    {% endfor %}
  {% else %}
    {% for director in directors_list %}
        <a href="#{{ director[0] | slugify }}">{{ director[0] }}</a>
    {% endfor %}
  {% endif %}
{% assign directors_list = nil %}
</div>

{% for director in site.director  %}
    <div class="director-wrapper">
    <span class="director-title" id="{{ tag[0] | slugify }}">{{ director[0] }}</span>
    <ul class="post-list">
        {% assign pages_list = director[1] %}
        {% for post in pages_list reversed %}
            {% if post.title != null %}
            {% if group == null or group == post.group %}
            <li><a href="{{ site.url }}{{ post.url }}">{{ post.title }}<span class="entry-date"><time datetime="{{ post.date | date_to_xmlschema }}" itemprop="datePublished">{{ post.date | date: "%m/%d/%Y" }}</time></a></li>
            {% endif %}
            {% endif %}
        {% endfor %}
        {% assign pages_list = nil %}
        {% assign group = nil %}
    </ul>
</span>
</div>
{% endfor %}

Поскольку код и концепция точно такие же, как и способ заполнения тегов - я не могу понять, почему это не работает - я надеюсь, что кто-то может помочь!

Вот весь мой каталог для справки: https://github.com/howdareyoureview/howdareyoureview.github.io


person zachsaul    schedule 30.06.2018    source источник


Ответы (1)


Страница тегов использует site.tags, который представляет собой массив site.posts, сгруппированных по тегам, созданный Jekyll во время генерации.

Вы пытаетесь выполнить репликацию, нацеливая site.directors, но этого ожидаемого массива не существует. Но вы можете использовать фильтр group_by для достижения своей цели.

<div class="directors">
  {% assign directors = site.posts | group_by: 'director' | sort: "name" %}
  {% for director in directors %}
    {% if director.name == "" %}
      {% assign name = "Anonymous" %}
    {% else %}
      {% assign name = director.name %}
    {% endif %}
    <a href="#{{ name | slugify }}">{{ name }}</a>
  {% endfor %}
</div>

{% for director in directors %}
<div class="director-wrapper">
  {% if director.name == "" %}
    {% assign name = "Anonymous" %}
  {% else %}
    {% assign name = director.name %}
  {% endif %}
  <span class="director-title" id="{{ name | slugify }}">{{ name | debug }}</span>
    <ul class="post-list">
      {% assign pages_list = director.items %}
      {% for post in pages_list reversed %}
        <li><a href="{{ site.url }}{{ post.url }}">{{ post.title }}<span class="entry-date"><time datetime="{{ post.date | date_to_xmlschema }}" itemprop="datePublished">{{ post.date | date: "%m/%d/%Y" }}</time></a></li>
      {% endfor %}
    </ul>
  </span>
</div>
{% endfor %}

Совет: вы можете использовать фильтр проверки для отладки ваших варов. {{ myvar | inspect }}

person David Jacquel    schedule 01.07.2018
comment
lКак я могу использовать это, если моя основная переменная - это массив, разделенный пробелами? Например, у меня есть переменная words: hello world sun в некоторых сообщениях, и я хочу получать сообщения по этим словам (все сообщения с hello, world или sun). - person Filip Š; 17.11.2018
comment
@ FilipŠ, задайте настоящий ТАК вопрос. Больше шансов получить помощь. - person David Jacquel; 18.11.2018