Коллекции

Удаленные коллекции

Помимо использования файлов Markdown или Blade для элементов Вашей коллекции, Вы можете возвращать элементы коллекции непосредственно из массива collections в config.php. Это позволяет Вам создавать элементы программно - например, Вы можете получать элементы из удаленного источника, например, внешнего API или систем управления контентом на основе API, таких как Contentful, GraphCMS или DatoCMS.


Сборка элементов коллекции в config.php

Для любой коллекции элементы могут быть созданы путем возврата массива или коллекции элементов items из массива конфигурации коллекции в config.php. Каждый элемент должен быть массивом; ключи элемента будут преобразованы в переменные страницы (например, те, которые обычно появляются в заголовке YAML файла Markdown), в то время как значение ключа content будет служить содержимым элемента коллекции. Этот контент будет проанализирован как Markdown и, следовательно, может содержать контент Markdown или HTML; он будет доступен в Ваших шаблонах Blade с помощью @yield('content') или повторением {!! $page->getContent() !!}:

config.php

return [
    'collections' => [
        'posts' => [
            'extends' => '_layouts.post',
            'items' => [
                [
                    'title' => 'Заголовок моего первого поста',
                    'content' => '## Содержание первого поста',
                ],
                [
                    'title' => 'Заголовок моего второго поста',
                    'content' => '## Содержание второго поста',
                ],
            ],
        ],
    ],
];

__layouts/post.blade.php_

@extends('_layouts.master')

@section('body')
    <h1>{{ $page->title }}</h1>

    @yield('content')
@endsection

Под капотом Jigsaw:

  1. Создайте каталог _tmp в каталоге коллекции (например, source/_posts/_tmp) для хранения временных файлов Markdown для каждого удаленного элемента коллекции
  2. Обработайте временные файлы, как если бы они были файлами *.blade.md
  3. Удалите временные файлы после завершения сборки jigsaw build

В дополнение к content, каждый элемент может указывать ключ filename, который будет использоваться как имя временного файла Markdown. Если опущено, в качестве имени файла по умолчанию будет использоваться имя коллекции, за которым следует индекс, таким образом, post-1.blade.md, post-2.blade.md, и т.д. Результирующий path выходного файла будут обрабатываться в соответствии с обычными правилами для коллекций.

В качестве альтернативы, массив items может содержать простые строковые значения, которые будут обрабатываться как содержимое Markdown элемента без переменных страницы:

config.php

return [
    'collections' => [
        'posts' => [
            'extends' => '_layouts.post',
            'items' => [
                '## Контент для поста 1',
                '## Контент для поста 2',
                '## Контент для поста 3',
            ],
        ],
    ],
];

Получение элементов коллекции из удаленного API

Ключ items в config.php также может ссылаться на замыкание, которое возвращает массив или коллекцию элементов. Используя замыкание, элементы коллекции могут быть получены из любого места - из удаленного API, из других мест файловой системы или созданы программно. Полученные данные затем можно преобразовать до создания элементов коллекции. Например:

config.php

return [
    'collections' => [
        'posts' => [
            'extends' => '_layouts.post',
            'items' => function ($config) {
                $posts = json_decode(file_get_contents('https://jsonplaceholder.typicode.com/posts'));

                return collect($posts)->map(function ($post) {
                    return [
                        'title' => $post->title,
                        'content' => $post->body,
                    ];
                });
            },
        ],
    ],
];

Если Вы хотите, чтобы удаленный API вызывался только при сборке для определенных сред, Вы можете поместить замыкание items в соответствующий файл config.{environment}.php. Например, чтобы получить доступ к Вашему удаленному API только при запуске build production, создайте файл config.production.php и включите туда Ваше замыкание items. Это предотвратит потенциально долгое время сборки при запуске build local в разработке.

Замыкание items получает в качестве параметра массив config поэтому Вы также можете ссылаться на другие значения конфигурации (например, URL-адрес API) внутри замыкания.