Предотвратить изменение блоков внутри определённых родительских блоков

Вопрос или проблема

Существует ли способ предотвратить использование определенного варианта блока внутри определенного родительского блока?

У меня есть блок “внутренние блоки”, который по сути является групповым блоком, но без каких-либо настроек, это просто контейнер для внутренних блоков. У меня есть другой блок, который почти такой же, кроме того, что у него есть один атрибут. Я хотел бы использовать только первый блок и добавить второй в качестве варианта, но разрешить использование этого варианта только внутри одного конкретного родительского блока.

Это возможно?

Вариант — это представление оригинального блока.


Если блок-1 позволяет вставку блока-2, то блок-1 будет принимать все варианты блока-2.


core/columns позволяет вставлять только core/column.

  • Если я создам вариант core/column, я бы ожидал, что core/column примет мой вариант.
  • Соответственно, обратное также должно иметь место.

Но… block.json предлагает ключ blockHook, который может предложить некое решение.

"blockHooks": {
        "acme/dialog": "firstChild"
    }

П.С. Этот ответ от Tom J Nowell освещает дополнительные аспекты и весьма познавателен.

Ответ или решение

Для предотвращения использования определённой вариации блока внутри конкретного родительского блока в системе Gutenberg, необходимо рассмотреть несколько ключевых аспектов.

Понимание блоков и их вариаций

Для начала, важно отметить, что вариация блока представляет собой модифицированную версию оригинального блока с возможностью использования некоторых изменений или дополнительных атрибутов. Однако, если родительский блок может принимать все вариации дочернего блока, то это может упрощать управление ими в пределах определённых контекстов.

Подход через block.json

В файле block.json можно использовать ключ blockHooks, который может помочь настроить логику разрешения добавления дочерних блоков. Например, используя следующий код, можно наладить процесс встраивания блоков:

"blockHooks": {
    "acme/dialog": "firstChild"
}

Этот код позволяет определять, как будут обрабатываться дочерние блоки. Но, к сожалению, это решение не является полноценным ответом на ваш вопрос, так как оно не позволяет ограничить вариации, которые могут быть использованы лишь в определённых родительских блоках.

Контроль за разрешёнными внутренними блоками

Для того чтобы более точно контролировать, какие блоки могут быть вложены в определённые родительские блоки, можно использовать фильтры WordPress. Применяя этот подход, вы можете указать, какие именно блоки могут использоваться как внутренние блоки для конкретного родительского блока. Это можно сделать, добавив фильтр в файл вашей темы или плагина:

add_filter('allowed_block_types', 'custom_allowed_block_types', 10, 2);

function custom_allowed_block_types($allowed_blocks, $post) {
    if ($post->post_type === 'your_custom_post_type') {
        return array(
            'your/block-one',
            // Разрешите варианты, которые хотите видеть
        );
    }

    return $allowed_blocks;
}

Реализация ограничения на уровень вариаций

К сожалению, на данный момент не существует встроенной возможности в Gutenberg, чтобы ограничить использование вариаций блоков в зависимости от родительского блока. Для этого может потребоваться разработка пользовательского решения, которое позволит:

  1. Обнаружить родительский блок.
  2. Проверить, какие дочерние блоки добавляются.
  3. Исполнить логику проверки, чтобы запрещать или разрешать определённые вариации в зависимости от контекста.

Таким образом, для решения данной задачи вам потребуется разработать пользовательскую обработку, которая будет динамически управлять доступом к вариациям блоков в зависимости от их родительского контекста. Это может быть критически важным аспектом вашей разработки в мире Gutenberg.

Заключение

Хотя на данный момент нет прямой поддержки ограничения вариаций блоков, использование фильтров и разработка пользовательских решений может помочь достичь желаемого результата. Постоянно следите за обновлениями Gutenberg, так как новые функции и улучшения могут предложить более простые решения в будущем.

Оцените материал
Добавить комментарий

Капча загружается...