Блоки редактора
Текст записи в CMS ARGELIT собирается из блоков: абзац, заголовок, картинка, кнопка, обложка, форма… Плагин или тема могут добавить свой блок: вы описываете его поля — редактор сам строит для них форму, а на сайте блок выводится вашим шаблоном Blade.
Свой блок
add_action('init', function () {
register_block_type('price-card', [
'title' => 'Карточка цены',
'icon' => 'star',
'category' => 'design',
'description' => 'Название, цена и кнопка.',
'keywords' => ['цена', 'тариф'],
'fields' => [
'name' => ['type' => 'text', 'label' => 'Название', 'placeholder' => 'Базовый'],
'price' => ['type' => 'number', 'label' => 'Цена, ₽', 'min' => 0, 'default' => 1000],
'features' => ['type' => 'list', 'label' => 'Что входит'],
'button_url' => ['type' => 'url', 'label' => 'Ссылка кнопки'],
'highlight' => ['type' => 'checkbox', 'label' => 'Выделить'],
],
'view' => 'myplugin::blocks.price-card',
]);
});
| Параметр | По умолчанию | Что значит |
|---|---|---|
title |
имя блока | название в списке блоков |
icon |
circle |
значок (см. список значков в Контенте) |
category |
text |
группа в списке: text, media, design, other |
description, keywords |
— | подсказка и слова для поиска блока |
fields |
— | поля блока (ниже) |
view |
theme::blocks.{имя}, иначе cms::blocks.{имя} |
шаблон Blade для сайта |
capability |
— | право, без которого блок нельзя добавить (например, unfiltered_html) |
Имя блока — латиницей, с префиксом плагина, чтобы не столкнуться с чужими (otzyvy-list, а не list).
Поля
| Тип | Что в редакторе | Значение | Особые параметры |
|---|---|---|---|
text |
строка | текст без HTML | placeholder |
textarea |
несколько строк | текст без HTML | rows |
richtext |
текст с оформлением | HTML: только b, i, u, s, a, br, code, mark |
placeholder |
code |
HTML-код | HTML (без права unfiltered_html — очищенный) |
rows |
select |
список | ключ выбранного варианта | options: ['ключ' => 'подпись'] или функция, возвращающая такой массив |
number |
число | целое | min, max |
checkbox |
галочка | true / false |
— |
url |
ссылка | https://…, /путь, #якорь, mailto:, tel: (остальное отбрасывается) |
— |
image |
картинка из медиатеки | id файла | — |
images |
несколько картинок | список id | — |
list |
список пунктов | список строк (как richtext) |
— |
repeater |
повторяющиеся элементы | список массивов | fields (вложенные поля), add_label, item_label |
У любого поля есть label, help (подсказка под полем) и default. Всё, что приходит из редактора, CMS проверяет и чистит
по типу поля (Cms\Blocks\BlockSanitizer) — в шаблоне можно доверять типу значения.
Шаблон блока
Шаблон получает:
| Переменная | Что это |
|---|---|
$block |
значения полей (недостающие — по умолчанию) |
$post |
запись, в которой стоит блок (может быть null, если блоки выводятся не из записи) |
$blockId |
id блока (для якорей) |
$type, $index |
описание блока и его номер в записи |
{{-- views/blocks/price-card.blade.php --}}
<div class="price-card @if ($block['highlight']) price-card--highlight @endif">
<h3>{{ $block['name'] }}</h3>
<p class="price-card__price">{{ number_format($block['price'], 0, ',', ' ') }} ₽</p>
<ul>
@foreach (array_filter($block['features']) as $feature)
<li>{!! $feature !!}</li>
@endforeach
</ul>
@if ($block['button_url'])
<a class="button" href="{{ $block['button_url'] }}">Заказать</a>
@endif
</div>
richtext и list — уже очищенный HTML, их выводят через {!! !!}; всё остальное — через {{ }}.
Картинка: media_url($block['image'], 'large').
Тема рисует блоки по-своему
Шаблон blocks/{имя}.blade.php в теме заменяет стандартный шаблон блока (например, themes/pekarnya/blocks/quote.blade.php).
Стандартные стили блоков на сайте — файл public/cms/front/blocks.css; если тема рисует всё сама, отключите его:
add_filter('load_block_styles', fn () => false);.
Фильтры и функции
render_block($html, $block, $post)— поменять готовый HTML любого блока;embed_resolve($embed, $url)— свой видеосервис для блока «Видео» (по умолчанию YouTube, Rutube, VK Видео, Vimeo);render_blocks($blocks)— вывести блоки, сохранённые не в записи (например, в настройке плагина);unregister_block_type('имя')— убрать блок из редактора.
Пример блока целиком — otzyvy-list в плагине «Отзывы».