Коллекции
Удаленные коллекции
Помимо использования файлов 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:
- Создайте каталог
_tmpв каталоге коллекции (например,source/_posts/_tmp) для хранения временных файлов Markdown для каждого удаленного элемента коллекции - Обработайте временные файлы, как если бы они были файлами
*.blade.md - Удалите временные файлы после завершения сборки
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) внутри замыкания.