Коллекции страниц⚓︎
В Grav наиболее распространенным типом коллекции является список страниц, который может быть определён либо в блоке метаданных страницы, либо в самой Twig-разметке. Наиболее распространенным является определение коллекции в блоке метаданных. Если коллекция определена, она доступна в Twig страницы, чтобы делать с ней всё, что вы пожелаете. Используя методы коллекции страниц или циклически проходя через каждый объект страницы и используя методы или свойства страницы, вы можете делать мощные вещи. Распространенные примеры этого включают отображение списка записей в блоге или отображение модульных подстраниц для визуализации сложного дизайна страницы.
Объект коллекции⚓︎
Когда вы определяете коллекцию в заголовке страницы, вы динамически создаете коллекцию Grav, доступную в Twig страницы. Этот объект коллекции является итерабельным и может рассматриваться как массив, который позволяет вам делать такие вещи, как:
Пример определения коллекции⚓︎
Пример коллекции, определенной в блоке метаданных страницы:
Значение content.items в начале страницы указывает Grav собирать коллекцию элементов, и информация, передаваемая ей, определяет, как должна быть построена коллекция.
Это определение создает коллекцию для страницы, которая состоит из всех дочерних страниц, отсортированных по дате и по убыванию, отображаемых вместе с нумерацией страниц, по 10 элементов на странице.
Ссылки пагинации добавляются только в том случае, если установлен и включен плагин Pagination.
Доступ к коллекциям в Twig⚓︎
Когда эта коллекция определена в заголовке, Grav создает коллекцию page.collection, к которой можно получить доступ в шаблоне Twig:
Это просто перебирает страницы в коллекции с отображением заголовка и резюме.
Вы также можете включить параметр порядка, чтобы изменить порядок страниц по умолчанию:
{% for p in page.collection.order('folder','asc') %}
<h2>{{ p.title|e }}</h2>
{{ p.summary|raw }}
{% endfor %}
Заголовки коллекций⚓︎
Чтобы сообщить Grav, что определенная страница должна быть страницей списков и содержать дочерние страницы, есть ряд переменных, которые можно использовать:
Сводка параметров коллекции⚓︎
| Строка | Результат | 
|---|---|
| '@root.pages' | Получить страницы верхнего уровня | 
| '@root.descendants' | Получить все страницы сайта | 
| '@root.all' | Получить все страницы и модули сайта | 
| '@self.page' | Получить коллекцию только с текущей страницей | 
| '@self.parent' | Получить коллекцию только с родителем текущей страницы | 
| '@self.siblings' | Получить коллекцию всех страниц того же уровня, что и текущая | 
| '@self.children' | Получить коллекцию дочерних страниц текущей | 
| '@self.modules' | Получить коллекцию модулей текущей страницы | 
| '@self.all' | Получить коллекцию дочерних страниц и модулей текущей | 
| '@self.descendants' | Рекурсивно пройтись по всем дочерним страницам | 
| '@page.page': '/fruit' | Получить коллекцию только со страницей /fruit | 
| '@page.parent': '/fruit' | Получить коллекцию только с родительской страницей /fruit | 
| '@page.siblings': '/fruit' | Получить коллекцию всех страниц того же уровня, что и /fruit | 
| '@page.children': '/fruit' | Получить коллекцию дочерних страниц /fruit | 
| '@page.modules': '/fruit' | Получить коллекцию модулей страницы /fruit | 
| '@page.all': '/fruit' | Получить коллекцию дочерних страниц и модулей /fruit | 
| '@page.descendants': '/fruit' | Рекурсивно пройтись по всем дочерним страницам /fruit | 
| '@taxonomy.tag': photography | таксономия с tag= photography | 
| '@taxonomy': {tag: birds, category: blog} | таксономия с tag= birdsи category=blog | 
Этот документ описывает использование @page, @taxonomy.category и т. д., но для YAML безопасней использовать альтернативный формат page@, taxonomy@.category. Все команды @ могут быть записаны либо в префиксном, либо в постфиксном формате.
В версии Grav 1.6 параметры коллекций были улучшены и изменены. Старые версии будут работать, но их не рекомендуется использовать.
Мы рассмотрим их более подробно.
Корневые коллекции⚓︎
@root - Потомки верхнего уровня⚓︎
Это может быть использовано для извлечения верхнего/корневого уровня опубликованных страниц сайта. Особенно полезно для получения элементов, составляющих основную навигацию, например:
Также можно использовать псевдоним '@root.children'. Использование '@root' не рекомендуется, так как его значение может измениться в будущем.
@root.descendants - Все страницы⚓︎
Это позволит эффективно получить каждую страницу вашего сайта, поскольку метод рекурсивно перемещается по всем дочерним элементам от корневой страницы вниз и создает коллекцию всех опубликованных страниц сайта:
@root.all - Все страницы и модули⚓︎
Этот метод будет делать то же самое, что и выше, но результат включает все опубликованные страницы и модули сайта.
Самостоятельные коллекции⚓︎
@self.page - Только текущая страница⚓︎
Это вернет коллекцию, содержащую только текущую страницу.
Также можно использовать псевдоним '@self.self'.
Если страница не была опубликована, будет возвращена пустая коллекция.
@self.parent - Родительская страница текущей страницы⚓︎
Это особый случай коллекции, потому что он всегда будет возвращать только родителя текущей страницы:
Если страница находится на верхнем уровне, будет возвращена пустая коллекция.
@self.siblings - Страницы того же уровня, что и текущая⚓︎
Эта коллекция будет собирать все опубликованные страницы на том же уровне текущей страницы, за исключением текущей:
@self.children - Дочерние страницы текущей⚓︎
Используется для перечисления опубликованных дочерних элементов текущей страницы:
Также можно использовать псевдоним '@self.pages'. Использование '@self' не рекомендуется, так как его значение может измениться в будущем.
@self.modules - Модули текущей страницы⚓︎
Этот метод извлекает только опубликованные модули текущей страницы. (_features, _showcase и т. д.):
Использование псевдонима '@self.modular' устарело.
@self.all - Дочерние страницы и модули текущей страницы⚓︎
Этот метод извлекает только опубликованные дочерние элементы и модули текущей страницы:
@self.descendants - Дочерние страницы + все потомки текущей страницы⚓︎
Подобно .children, коллекция .descendants извлечет все опубликованные дочерние элементы, но вдобавок ещё и рекурсивно получит всех потомков:
Коллекции страниц⚓︎
@page.page - Коллекция с включением только указанной страницы⚓︎
Эта коллекция принимает в качестве аргумента служебный маршрут страницы и возвращает коллекцию, содержащую эту страницу (если это опубликованная страница):
Также можно использовать псевдоним '@page.self': '/blog'.
Если страница не была опубликована, будет возвращена пустая коллекция.
@page.parent - Родительская страница конкретной страницы⚓︎
Это особый случай коллекции, потому что он всегда будет возвращать только родителя текущей страницы:
Если страница находится на верхнем уровне, будет возвращена пустая коллекция.
@page.siblings - Страницы того же уровня, что и указанная⚓︎
Эта коллекция соберет все опубликованные страницы на том же уровне, что и текущая, исключая её саму:
@page.children - Дочерние элементы указанной страницы⚓︎
Эта коллекция принимает в качестве аргумента служебный маршрут страницы и возвращает все опубликованные дочерние элементы этой страницы:
Также можно использовать псевдоним '@page.pages': '/blog'. Использование '@page': '/blog' не рекомендуется, так как его значение может измениться в будущем.
@page.modules - Модули указанной страницы⚓︎
Эта коллекция принимает в качестве аргумента служебный маршрут страницы и возвращает все опубликованные модули этой страницы:
Использование псевдонима '@page.modular': '/blog' устарело.
@page.all - Дочерние элементы и модули указанной страницы⚓︎
Этот метод извлекает только опубликованные дочерние элементы и модули конкретной страницы:
@page.descendants - Коллекция дочерних элементов и всех потомков указанной страницы⚓︎
Эта коллекция принимает в качестве аргумента служебный маршрут страницы и возвращает все опубликованные дочерние элементы и всех потомков этой страницы:
Коллекции таксономии⚓︎
С опцией @taxonomy вы можете использовать мощную функциональность таксономии Grav. Именно здесь вступает в действие переменная taxonomy в файле конфигурации сайта. Должно быть определение для таксономии, определенной в этом файле конфигурации для Grav, чтобы интерпретировать ссылку на страницу как действительную.
Установив @taxonomy.tag: foo, Grav найдет все опубликованные страницы в папке /user/pages, имеющие tag: foo в своей переменной таксономии:
Переменная content.items может принимать массив таксономий и собирать все страницы, удовлетворяющие этим правилам. Будут собраны опубликованные страницы, которые имеют как тег foo, так и тег bar. В главе Таксономия эта концепция рассмотрена более подробно.
Если вы хотите поместить несколько переменных в строку, вам нужно отделить подэлементы от их родителей с помощью угловых скобок {}. Затем вы можете разделить отдельные переменные на этом уровне запятой. Например: '@taxonomy': {category: [blog, featured], tag: [foo, bar]}. В этом примере суб-переменные category и tag помещаются в @taxonomy в иерархии, каждая из которых содержит перечисленные значения в квадратных скобках []. Страницы должны соответствовать всем этим требованиям.
Если у вас есть несколько переменных в одном родителе для установки, вы можете сделать это с помощью встроенного метода, но для простоты мы рекомендуем использовать стандартный метод. Вот пример:
На каждом уровне иерархии перед переменной добавляются два пробела. YAML позволит вам использовать столько пробелов, сколько вы хотите, но два - стандартная практика. В приведенном выше примере переменные category и tag установлены в @taxonomy.
Коллекции страниц будут автоматически отфильтрованы по таксономии, если она была указана в URL (например, /archive/category:news). Это позволяет создать один шаблон архива блога, но динамически фильтровать коллекцию с помощью URL. Если ваша коллекция страниц должна игнорировать таксономию, установленную в URL, используйте флаг url_taxonomy_filters: false, чтобы отключить эту функцию.
Сложные коллекции⚓︎
Вы также можете предоставить несколько сложных определений коллекции, и результирующая коллекция будет суммой всех страниц, найденных из каждого из определений коллекции. Например:
Кроме того, можно фильтровать коллекцию, используя filter: type: value. Тип может быть любым из следующих: published, visible, page, module, routable. Они соответствуют специфичным для коллекций методам, и вы можете использовать несколько из них для фильтрации вашей коллекции. Каждый из них может иметь значение true или false. Кроме того, существует type, который принимает одно имя-шаблона, types, которое принимает массив имен-шаблонов, и access, который принимает массив уровней доступа. Например:
Тип также может быть отрицательным: non-published, non-visible, non-page (=module), non-module (=page) и non-routable, но лучше использовать положительную версию типа со значением false.
Начиная с Grav 1.6 фильтры коллекций были упрощены. Прежние варианты (modular и non-modular) всё ещё будут работать, но их использование не рекомендуется. Используйте module и page вместо них.
Варианты сортировки⚓︎
Порядок подстраниц соответствует тем же правилам, что и порядок папок. Доступные опции:
| Порядок | Подробности | 
|---|---|
| default | Порядок зависит от файловой системе, например 01.homeидет перед02.advark | 
| title | Порядок зависит от названии, определенном на каждой странице | 
| basename | Порядок зависит от алфавитном имени папки после того, как она была обработана PHP-функцией basename() | 
| date | Порядок зависит от дате, определенной на каждой странице | 
| modified | Порядок зависит от времени изменения страницы | 
| folder | Порядок зависит от имени папки с любым числовым префиксом, например: 01. | 
| header.x | Порядок зависит от конкретном поле headerстраницы. Например,header.taxonomy.year. Кроме того, значение по умолчанию может быть добавлено через вертикальную черту. Например,header.taxonomy.year|2015 | 
| random | Случайный порядок | 
| custom | Порядок зависит от переменной content.order.custom | 
| manual | Порядок зависит от переменной order_manual. УСТАРЕЛО | 
| sort_flags | Разрешить переопределение флагов сортировки для упорядочения на основе заголовка страницы или по умолчанию. Если загружено расширение PHP intl, то доступны только эти флаги. В противном случае вы можете использовать стандартные флаги сортировки PHP. | 
Переменнаяcontent.order.dir контролирует направление сортировки. Допустимые значения: desc или asc.
content:
    order:
        by: default
        custom:
            - _showcase
            - _highlights
            - _callout
            - _features
    limit: 5
    pagination: true
В приведенной выше конфигурации вы можете видеть, что content.order.custom определяет пользовательский порядок для указания того, что на странице сначала идет витрина, затем секция основных моментов и т. д. Обратите внимание, что если страница не указана в списке пользовательской сортировки, то Grav возвращается к content.order.by для неуказанных страниц.
Если на странице есть настраиваемый ярлык, вы должны использовать его в списке content.order.custom.
content.pagination — это простой логический флаг, который используется плагинами и т. д. Чтобы знать, следует ли инициализировать разбиение на страницы для этой коллекции. content.limit — количество элементов, отображаемых на странице при включенной нумерации страниц.
Диапазон дат⚓︎
Существует также возможность фильтрации страниц по диапазону дат:
Вы можете использовать любой строковый формат даты, поддерживаемый strtotime(), например 6 weeks или last Monday, а также более традиционные даты, такие как 01/23/2014 или 23 января 2014. DateRange отфильтрует любые страницы, у которых есть дата за пределами предоставленного диапазона. Даты начала и конца являются необязательными, но следует указать хотя бы одну.
Несколько коллекций⚓︎
Когда вы создаете коллекцию с content: items: в вашем YAML, вы определяете одну коллекцию на основе нескольких условий. Однако Grav позволяет создавать произвольный набор коллекций на странице, вам просто нужно создать ещё одну:
content:
    items: '@self.children'
    order:
        by: date
        dir: desc
    limit: 10
    pagination: true
fruit:
    items:
       '@taxonomy.tag': [fruit]
Это устанавливает 2 коллекции для этой страницы. Первая использует коллекцию по умолчанию content, а вторая определяет коллекцию на основе таксономии под названием fruit. Для доступа к этим двум коллекциям через Twig вы можете использовать следующий синтаксис:
{% set default_collection = page.collection %}
{% set fruit_collection = page.collection('fruit') %}
Методы объекта коллекции⚓︎
Доступные итерируемые методы:
| Параметр | Описание | 
|---|---|
| Collection::append($items) | Добавить другую коллекцию или массив | 
| Collection::first() | Полуить первый элемент коллекции | 
| Collection::last() | Получить последний элемент коллекции | 
| Collection::random($num) | Получить $numслучайных элементов коллекции | 
| Collection::reverse() | Обратный порядок коллекции | 
| Collection::shuffle() | Перемешать всю коллекцию | 
| Collection::slice($offset, $length) | Обрезать список | 
Также есть несколько полезных методов, специфичных для коллекции:
| Параметр | Описание | 
|---|---|
| Collection::addPage($page) | Можно добавить другую страницу в коллекцию | 
| Collection::copy() | Создать копию текущей коллекции | 
| Collection::current() | Получить текущий элемент коллекции | 
| Collection::key() | Получить слаг текущего элемента | 
| Collection::remove($path) | Удалить указанную страницу из коллекции, или текущую, если $path = null | 
| Collection::order($by, $dir, $manual) | Сортировка текущей коллекции | 
| Collection::intersect($collection2) | Объединить две коллекции, сохранив элементы, которые встречаются в обеих коллекциях (как условие "И") | 
| Collection::merge($collection2) | Объединить две коллекции, сохранив элементы, которые встречаются в любой коллекции (как условие "ИЛИ") | 
| Collection::isFirst($path) | Определить, является ли указанная страница первой | 
| Collection::isLast($path) | Определить, является ли указанная страница последней | 
| Collection::prevSibling($path) | Если возможно, возвращает предыдущую страницу того же уровня | 
| Collection::nextSibling($path) | Если возможно, возвращает следующую страницу того же уровня | 
| Collection::currentPosition($path) | Возвращает текущий индекс | 
| Collection::dateRange($startDate, $endDate, $field) | Фильтрует текущую коллекцию по датам | 
| Collection::visible() | Фильтрует текущую коллекцию, чтобы включить только видимые страницы | 
| Collection::nonVisible() | Фильтрует текущую коллекцию, чтобы включить только невидимые страницы | 
| Collection::pages() | Фильтрует текущую коллекцию, чтобы включить только страницы (но не модули) | 
| Collection::modules() | Фильтрует текущую коллекцию, чтобы включить только модули (но не страницы) | 
| Collection::published() | Фильтрует текущую коллекцию, чтобы включить только опубликованные страницы | 
| Collection::nonPublished() | Фильтрует текущую коллекцию для включения только неопубликованных страниц | 
| Collection::routable() | Фильтрует текущую коллекцию, чтобы включить только маршрутизируемые страницы | 
| Collection::nonRoutable() | Фильтрует текущую коллекцию, чтобы включить только немаршрутизируемые страницы | 
| Collection::ofType($type) | Отфильтровывает текущую коллекцию, чтобы включить только страницы с шаблоном = $type | 
| Collection::ofOneOfTheseTypes($types) | Фильтрует текущую коллекцию, чтобы включить только те страницы, где шаблон находится в массиве $types | 
| Collection::ofOneOfTheseAccessLevels($levels) | Фильтрует текущую коллекцию, чтобы включить только страницы, доступ к которым осуществляется в массиве $levels | 
Следующие методы устарели в Grav 1.7: Collection::modular() и Collection::nonModular(). Используйте Collection::modules() и Collection::pages() соответственно.
Вот пример из docs.html.twig темы Learn2, который определяет коллекцию на основе таксономии (и, возможно, тегов, если они существуют) и использует методы Collection::isFirst и Collection::isLast для навигации по страницам:
{% set tags = page.taxonomy.tag %}
{% if tags %}
    {% set progress = page.collection({'items':{'@taxonomy':{'category': 'docs', 'tag': tags}},'order': {'by': 'default', 'dir': 'asc'}}) %}
{% else %}
    {% set progress = page.collection({'items':{'@taxonomy':{'category': 'docs'}},'order': {'by': 'default', 'dir': 'asc'}}) %}
{% endif %}
{% block navigation %}
        <div id="navigation">
        {% if not progress.isFirst(page.path) %}
            <a class="nav nav-prev" href="{{ progress.nextSibling(page.path).url|e }}"> <i class="fa fa-chevron-left"></i></a>
        {% endif %}
        {% if not progress.isLast(page.path) %}
            <a class="nav nav-next" href="{{ progress.prevSibling(page.path).url|e }}"><i class="fa fa-chevron-right"></i></a>
        {% endif %}
        </div>
{% endblock %}
nextSibling() — вверх по списку, prevSibling() — вниз по списку, вот как это работает:
Предположим, что у вас есть страницы:
Вы находитесь на странице «Проект A», предыдущая страница - это «Проект B». При переходе на страницу «Проект B» предыдущей станет «Проект C», а следующей — «Проект A».
Программные коллекции⚓︎
Вы можете получить полный контроль над коллекциями прямо из PHP в плагинах, темах Grav или даже из Twig. Это более жестко запрограммированный подход по сравнению с определением их во внешнем оформлении страницы, но он также позволяет использовать более сложную и гибкую логику коллекций.
PHP-коллекции⚓︎
Вы можете выполнить расширенную логику сбора с помощью PHP, например:
<?php
$collection = new Collection($pages);
$collection->setParams(['taxonomies' => ['tag' => ['dog', 'cat']]])->dateRange('01/01/2016', '12/31/2016')->published()->ofType('blog-item')->order('date', 'desc');
$titles = [];
foreach ($collection as $page) {
    $titles[] = $page->title();
}
Функция order() может также, в дополнение к параметрам by и dir, принимать параметры manual и sort_flags. Это задокументировано выше. Вы также можете использовать тот же метод evaluate(), который используют коллекции страниц на основе блока метаданных:
<?php
$page = Grav::instance()['page'];
$collection = $page->evaluate(['@page.children' => '/blog', '@taxonomy.tag' => 'photography']);
$ordered_collection = $collection->order('date', 'desc');
И ещё один пример индивидуальной сортировки:
Вы также можете сделать то же самое непосредственно в шаблонах Twig:
{% set collection = page.evaluate([{'@page.children':'/blog', '@taxonomy.tag':'photography'}]) %}
{% set ordered_collection = collection.order('date','desc') %}
Расширенные коллекции⚓︎
По умолчанию, когда вы вызываете page.collection() в Twig страницы, имеющей коллекцию, определенную в заголовке, Grav ищет коллекцию с названием content. Это позволяет определять несколько коллекций, но вы можете пойти дальше.
Если вам нужно программно сгенерировать коллекцию, вы можете сделать это, вызвав page.collection() и передав массив в том же формате, что и определение коллекции заголовков страницы. Например:
{% set options = { items: {'@page.children': '/my/pages'}, 'limit': 5, 'order': {'by': 'date', 'dir': 'desc'}, 'pagination': true } %}
{% set my_collection = page.collection(options) %}
<ul>
    {% for p in my_collection %}
        <li>{{ p.title|e }}</li>
    {% endfor %}
</ul>
Генерация меню для всего сайта (вам необходимо установить свойство menu в блоке метаданных страницы):
{% set options = { items: {'@root.descendants':''}, 'order': {'by': 'folder', 'dir': 'asc'}} %}
{% set my_collection = page.collection(options) %}
{% for p in my_collection %}
{% if p.header.menu %}
    <ul>
    {% if page.slug == p.slug %}
        <li class="{{ p.slug|e }} active"><span>{{ p.menu|e }}</span></li>
    {% else %}
        <li class="{{ p.slug|e }}"><a href="{{ p.url|e }}">{{ p.menu|e }}</a></li>
    {% endif %}
    </ul>
{% endif %}
{% endfor %}
Пагинация с расширенными коллекциями⚓︎
Часто мы слышим вопрос о том, как включить разбиение на страницы для пользовательских коллекций. Пагинация - это плагин pagination, который можно установить через GPM. После установки он работает «из коробки» с коллекциями, настроенными на странице, но ничего не знает о пользовательских коллекциях, созданных в Twig. Чтобы упростить этот процесс, разбиение на страницы поставляется с собственной функцией Twig, называемой paginate(), которая обеспечит необходимую функциональность разбивки на страницы.
После того, как мы передаем коллекцию и ограничение функции paginate(), нам также необходимо передать информацию о разбиении на страницы непосредственно в шаблон partials/pagination.html.twig для правильного отображения.
{% set options = { items: {'@root.descendants':''}, 'order': {'by': 'folder', 'dir': 'asc'}} %}
{% set my_collection = page.collection(options) %}
{% do paginate( my_collection, 5 ) %}
{% for p in my_collection %}
    <ul>
        {% if page.slug == p.slug %}
            <li class="{{ p.slug|e }} active"><span>{{ p.menu|e }}</span></li>
        {% else %}
            <li class="{{ p.slug|e }}"><a href="{{ p.url|e }}">{{ p.menu|e }}</a></li>
        {% endif %}
    </ul>
{% endfor %}
{% include 'partials/pagination.html.twig' with {'base_url':page.url, 'pagination':my_collection.params.pagination} %}
Пользовательская обработка коллекции с событием onCollectionProcessed()⚓︎
 Бывают случаи, когда вариантов событий просто недостаточно. Когда вы хотите получить коллекцию, но затем продолжите манипулировать коллекцией на основе чего-то очень нестандартного. Представьте себе, если хотите, вариант использования, в котором у вас есть то, что кажется довольно стандартным списком блогов, но ваш клиент хочет иметь точный контроль над тем, что отображается в списке. Они хотят иметь настраиваемый переключатель для каждого элемента блога, который позволяет им удалить его из списка, но при этом опубликовать его и получить по прямой ссылке.
Чтобы это произошло, мы можем просто добавить настраиваемую опцию display_in_listing: false в заголовок страницы для элемента:
---
title: 'My Story'
date: '13:34 04/14/2020'
taxonomy:
    tag:
        - journal
display_in_listing: false
---
...
Проблема в том, что нет способа определить или включить этот фильтр при определении коллекции на странице листинга. Вероятно, это определяется примерно так:
---
menu: News
title: 'My Blog'
content:
    items:
        - self@.children
    order:
        by: date
        dir: desc
    limit: 8
    pagination: true
    url_taxonomy_filters: true
---
...
Таким образом, коллекция просто определяется директивой self@.chidren для получения всех опубликованных дочерних элементов текущей страницы. Так что насчет тех страниц, у которых установлен параметр display_in_listing: false? Нам нужно проделать дополнительную работу с этой коллекцией, прежде чем она будет возвращена, чтобы убедиться, что мы удалим все элементы, которые мы не хотим видеть. Для этого мы можем использовать событие onCollectionProcessed() в настраиваемом плагине. Нам нужно добавить слушателя:
<?php
    public static function getSubscribedEvents(): array
    {
        return [
            ['autoload', 100000],
            'onPluginsInitialized' => ['onPluginsInitialized', 0],
            'onCollectionProcessed' => ['onCollectionProcessed', 10]
        ];
    }
Затем нам нужно определить метод и перебрать элементы коллекции, ища любые страницы с этим набором полей display_in_listing:, а затем удалить его, если он равен false:
<?php
    /**
     * Remove any page from collection with display_in_listing: false|0
     *
     * @param Event $event
     */
    public function onCollectionProcessed(Event $event): void
    {
        /** @var Collection $collection */
        $collection = $event['collection'];
        foreach ($collection as $item) {
            $display_in_listing = $item->header()->display_in_listing ?? true;
            if ((bool) $display_in_listing === false) {
                $collection->remove($item->path());
            }
        }
    }
Теперь в вашей коллекции есть правильные элементы, и все другие плагины или шаблоны Twig, которые полагаются на эту коллекцию, будут видеть эту измененную коллекцию, поэтому такие вещи, как разбиение на страницы, будут работать должным образом.