Коллекции
Jigsaw предоставляет мощные возможности для работы с группами связанных страниц или коллекциями. Коллекции дают Вам возможность получать доступ к Вашему контенту на агрегированном уровне, позволяя легко добавлять почти динамические функции, такие как меню, разбиение на страницы, категории и теги на Ваш статический сайт.
Коллекции можно использовать для создания страниц связанного контента - например, сообщений в блогах или статей, которые отсортированы по дате, с индексной страницей, отображающей сводку пяти самых последних сообщений, - или для встраивания связанных блоков содержимого в страницу, для содержимого например, биографии сотрудников, описания продуктов или портфолио проектов.
Определение коллекции
Чтобы определить коллекцию, добавьте в config.php массив с именем collections. Каждая коллекция должна обозначаться именем коллекции (обычно во множественном числе), за которым следует массив настроек. Например:
config.php
<?php
return [
'company' => 'Tighten',
'contact_email' => 'support@tighten.co',
'collections' => [
'people' => [
'path' => 'people',
'sort' => 'last_name',
],
'posts' => [
'path' => 'blog/{date|Y-m-d}/{filename}',
'author' => 'Tighten',
],
],
];
Jigsaw будет искать элементы коллекции в каталоге с тем же именем, что и Ваша коллекция, которому предшествует символ подчеркивания: в этом примере это _people и _posts. Элементы коллекции могут быть файлами Markdown или Blade или даже гибридными Blade/Markdown файлами.
В массивconfig.php, в котором Вы определяете свою коллекцию, может содержать параметры путь и сортировка для коллекции, а также переменные и вспомогательные функции. Однако ни один из этих элементов не требуется; если не указано, будут использоваться путь по умолчанию и настройки сортировки. Фактически, для простейшей конфигурации с использованием настроек по умолчанию и без переменных или функций Вы можете определить коллекцию просто по ее имени:
config.php
<?php
return [
'collections' => [ 'posts' ],
];
Создание страниц коллекции
Если Вы хотите создать отдельную страницу для каждого из элементов коллекции, например страницу для каждого сообщения в блоге, укажите файл родительский шаблон в файле ключ extends в YAML или директивой @extends в файле Blade, как если бы Вы использовали обычную страницу Jigsaw. Например:
my-first-post.md
---
extends: _layouts.post
title: Моя первая запись в блоге
author: Keith Damiani
date: 2021-02-28
section: content
---
Этот пост *глубоко* интересен.
__layouts/post.blade.php_
@extends('_layouts.master')
@section('body')
<h1>{{ $page->title }}</h1>
<p>By {{ $page->author }} • {{ date('F j, Y', $page->date) }}</p>
@yield('content')
@endsection
Доступ к элементам коллекции
В любом шаблоне Blade у Вас есть доступ к каждой из Ваших коллекций, используя переменную с именем коллекции. Эта переменная ссылается на объект, который содержит все элементы в Вашей коллекции, и может повторяться для доступа к отдельным элементам коллекции. Переменная коллекции также ведет себя так, как если бы она была Illuminate Collection в Laravel, что означает, что у Вас есть доступ ко всем стандартным методам сбора Laravel, таким как count(), filter() и where().
Например, чтобы создать список заголовков для всех Ваших сообщений в блоге, Вы можете перебрать объект $posts в цикле Blade @foreach и отобразить свойство title, которое Вы определили во вступительной части YAML каждого сообщения:
posts.blade.php
<p>Всего постов: {{ $posts->count() }}</p>
<ul>
@foreach ($posts as $post)
<li>{{ $post->title }}</li>
@endforeach
</ul>
Например, предполагая, что все сообщения имеют в своем YAML-фронте свойство author, чтобы отфильтровать все сообщения от определенного автора, Вы можете отфильтровать коллекцию $posts и создать новую коллекцию:
author_posts.blade.php
<?php
$authorPosts = $posts->filter(function ($value, $key) use ($page) {
return $value->author == $page->author;
});
?>
@if ($authorPosts->count() > 0)
<ul>
@foreach ($authorPosts as $post)
<li>{{ $post->title }}</li>
@endforeach
</ul>
@endif
Метаданные коллекции
Помимо метаданных, доступных для каждой страницы, таких как getPath(), getUrl() и getFilename(), элементы коллекции имеют доступ к нескольким дополнительным функции:
getContent()возвращает основное содержимое элемента коллекции, то есть тело файла Markdown (в настоящее времяgetContent()доступен только для файлов Markdown)getCollection()возвращает имя коллекцииgetPrevious()иgetNext()предоставляют вам соседние элементы в коллекции на основе порядка сортировки коллекции по умолчаниюgetFirst()возвращает первый элемент коллекции (как и метод коллекции Laravelfirst())getLast()возвращает последний элемент коллекции (как и метод коллекции Laravellast())
__layouts/post.blade.php_
@extends('_layouts.master')
@section('body')
<h1>{{ $page->title }}</h1>
@yield('content')
@if ($page->getNext())
<p>Прочтите мой следующий пост:
<a href="{{ $page->getNext()->getPath() }}">{{ $page->getNext()->title }}</a>
</p>
@endif
@endsection