Из пользовательского интерфейса вы можете добавить блок в регион следующим образом:
- Зайдите в Админ -> Структура -> Блок макета (/ admin / структура / блок).
- Нажмите на кнопку «Поместить блок» рядом с названием региона.
Я хочу сделать то же самое, но программно. Как добавить существующий блок в регион и сохранить его? Затем этот блок должен отображаться в этом регионе и быть доступным на странице макета блока .
Ответы:
Чтобы предоставить блок плагина, вы можете создать массив настроек и передать его
\Drupal\block\Entity\Block::create()
для создания объекта Block и сохранения экземпляра.Например, если вы хотите добавить PHP- блок Devel Execute в тему Seven:
источник
id
все, что вы хотите, если оно уникально. Например, вы можете запустить его с именем модуля его в.Вы можете использовать модуль настройки Twig :
И затем на вашей области шаблона ветки:
источник
Каждый экземпляр блока (который «блок типа», конфигурации и размещения) является конфигурация лицо:
\Drupal\block\Entity\Block
. Поэтому все, что вам нужно сделать, это создать новый экземпляр этой сущности с правильными деталями, и все готово.Это можно сделать, но это безумно сложно, вам нужно понять систему плагинов, систему блоков плагинов и многое другое.
Вы можете посмотреть,
\Drupal\block\BlockForm::submitForm
чтобы почувствовать это или\Drupal\simpletest\BlockCreationTrait::placeBlock
. Вы можете подумать, если это то, что вам действительно нужно, видимость блока довольно сложна.источник
Я только изучаю D8, но мне кажется, что я нашел гораздо более простой способ программно разместить блок (это показалось довольно пугающим после прочтения ответа googletorp!)
Когда я включил свой пользовательский модуль, который определил блок, я хотел, чтобы блок автоматически помещался в правильную область. Шаги, которые я использовал для достижения этой цели:
/admin/structure/block
admin/config/development/configuration/single/export
/config/install/
/config/install
каталоге и скопируйте туда код.источник
Я нашел ответ благодаря тому, как программно управлять Entity: Block в Drupal 8 .
источник
Приведенный выше пример достаточно близок, но все еще не верен. Идея состоит в том, что вы должны придумать свой собственный идентификатор экземпляра блока (в моем случае devel_execute_php_1112 (возможно, потому что я пытался заставить его работать 1112 раз, он останется загадкой)), а затем фактический идентификатор блока (тот, который объявляется для пользовательских блоков в аннотации) и темы. Тогда просто установите регион, и все готово. Создан экземпляр блока в нужном регионе.
edit1: я на самом деле позже проверил комментарий выше - и это правильно. Просто не ясно, что id - это то, что вы должны придумать. В качестве погашения за мой отстойный комментарий я опубликую решение о том, как создать экземпляр блока пользовательской сущности блока:
в основном то же самое, но для плагина вы пишете block_content: uuid_of_custom_block_entity_instance
источник