Блоки редактора

Текст записи в 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 в плагине «Отзывы».