Перечисление связанных записей в Bolt CMS
У меня есть типы контента Темы и брошюры. Брошюры связаны с темами (например, брошюра "Месса си минор" может быть связана с темой "музыка") с использованием типа поля "отношения":
pamphlet:
...
relations:
topics:
multiple: false
...
Я хочу перечислить все брошюры о музыке. Точнее, я хочу иметь возможность отображать каждую тему со списком брошюр, связанных с этой темой.
Есть функция record.related()
но он работает по-другому, то есть я могу использовать его, когда отображаю брошюру, чтобы показать, что брошюра связана с музыкой; но я не могу использовать его при отображении темы "Музыка" для перечисления всех брошюр, связанных с музыкой.
(В документации сказано, что отношения всегда двунаправлены, но я не понимаю, как это сделать.)
Предложения приветствуются.
3 ответа
Я был просто неправ, когда сказал, что related records()
функция не делает работу. Вот мы (по прозвищу из коробки) record.twig template
):
{% set relatedrecords = record.related() %}
{% if relatedrecords is not empty %}
<p> Examples:</p>
<ul>
{% for related in relatedrecords %}
<li><a href="{{ related.link }}">
{{ related.title }}</a></li>
{% endfor %}
</ul>
{% endif %}
В общем случае кажется, что если A (брошюра) относится к B (теме), точно такой же метод можно использовать для отображения либо темы, к которой принадлежит данная брошюра, либо брошюр, принадлежащих данной теме.
Приносим извинения за неправильное понимание и поздравляю разработчиков Bolt за аккуратную работу.
Теперь у меня есть неэффективное решение. Может быть, кто-то может улучшить это.
Чтобы отобразить все брошюры, относящиеся к данной теме, я создал шаблон topic.twig
, В этом шаблоне record.title
содержит название темы (например, "Музыка") и record.id
содержит идентификатор темы. Нам нужно выбрать брошюры, которые помечены как связанные с темой с этим идентификатором. Следующий код извлекает все брошюры в pamphletlist
затем рассматривает каждый. Используя ценные dump()
функция, я обнаружил, что структура данных для брошюры включает в себя массив relation
который включает в себя массив topics
, Приведенный ниже код работает, потому что в моих данных одна брошюра может относиться только к одной теме. Код:
{# to get a list of all pamphlets related to this topic #}
{% setcontent pamphletlist = 'pamphlets' %}
{% for p in pamphletlist %}
{{ dump(p) }}
{% for t in p.relation.topics %}
{% if record.id == t %}
<p><a href = " {{ p.link }} "> {{ p.title }} </a></p>
{% endif %}
{% endfor %}
{% endfor %}
Конечно, было бы более эффективно использовать where
оговорка, как то так:
{% setcontent pamphletlist = 'pamphlets' where { relation.topics: ... } %}
Предполагается, что это позволит провести выборы на уровне базы данных, а не просматривать каждую запись по очереди. Но мои эксперименты только выявили синтаксические ошибки веток. У кого-нибудь есть более эффективный метод?
Вы смотрели на расширение "Связанный контент по тегам"? Это дает вам список связанного контента по тегам: http://extensions.bolt.cm/view/45073af0-8585-4d5b-b978-fd6405858e0e