Як я програматично розміщую блок?


10

З інтерфейсу користувача ви можете додати блок у регіоні таким чином:

  1. Перейдіть до Адміністратора -> Структура -> Макет блоку (/ адміністратор / структура / блок).
  2. Натисніть кнопку "Розмістити блок" крім назви регіону.

Я хочу зробити те саме, але програмно. Як додати існуючий блок до регіону та зберегти його? Потім цей блок повинен відображатися в цьому регіоні та бути доступним на сторінці макета блоку .


Після створення блоку ви можете змінити розташування блоку з: site_name / admin / structure / block
Crazyrubixfan

Я припускаю, що ви помилково ввели "призначити блок регіону".
cilefen

@IcecreamJelly, що я намагаюся зробити, це зробити це програмно. cilefen, так, це саме те, що я маю на увазі% -)
jmzea

@ShawnConn дякую, це схоже, але не зовсім те саме. Я знайшов відповідь десь в іншому місці.
jmzea

Відповіді:


9

Щоб забезпечити блок плагінів, ви можете створити масив налаштувань і передавати його \Drupal\block\Entity\Block::create()для створення об’єкта Block та збереження екземпляра.

Наприклад, якщо ви хочете додати PHP- блок Devel Execute до семи теми:

$values = array(
  // A unique ID for the block instance.
  'id' => 'devel_execute_php_1',
  // The plugin block id as defined in the class.
  'plugin' => 'devel_execute_php',
  // The machine name of the theme region.
  'region' => 'content',
  'settings' => array(
    'label' => 'Execute PHP',
  ),
  // The machine name of the theme.  
  'theme' => 'seven',
  'visibility' => array(),
  'weight' => 100,
);
$block = \Drupal\block\Entity\Block::create($values);
$block->save();

Привіт, мені потрібна допомога. Я створив користувацький блок за допомогою інтерфейсу і хочу розмістити його в регіоні колонтитулу програмно для тестування. Я не знаю, як отримати плагін із користувацьких блоків, створених користувальницьким інтерфейсом .. дякую
Mudassar Ali

Задайте це як інше питання. Коментарі не для запитань.
Шон Конн


Що тут за ідентифікатор ? це те саме, що ім'я блоку?
Crazyrubixfan

@RubberDuckIsKing Я вважаю, що ви можете назвати idвсе, що завгодно, доки воно унікальне. Наприклад, ви можете запустити його з назви модуля його.
Параг,

7

Ви можете використовувати модуль Twig tweak :

Модуль Twig Tweak пропонує розширення Twig з деякими корисними функціями та фільтрами, які можуть покращити досвід розробника.

А потім у регіоні вашого шаблону гілочок:

{{ drupal_block('block_id') }}

Проблема цього рішення полягає в тому, що виправлення гілочок все ще вимагає розмістити блок, а потім "відключити" його.
лексикант

6

Кожен екземпляр блоку (який «блок типу», конфігурації і розміщення) є конфігурація обличчя: \Drupal\block\Entity\Block. Отже, все, що вам потрібно зробити, - це створити новий екземпляр цього об'єкта з правильними деталями, і ви все готові.

Це можна зробити, але це божевільно складно, вам потрібно зрозуміти систему плагінів, систему блоків плагінів та багато іншого.

Ви можете поглянути, \Drupal\block\BlockForm::submitFormщоб відчути це або \Drupal\simpletest\BlockCreationTrait::placeBlock. Можливо, ви захочете задуматися, чи справді це вам потрібно, то видимість блоку є досить складною.


4
Окрім можливо умов видимості, я не думаю, що це так складно. \ Drupal \ simpletest \ BlockCreationTrait :: placeBlock (), мабуть, кращий приклад для перегляду, ви також можете просто імпортувати деякі експортовані файли конфігурації.
Бердір

@Berdir Дякую за посилання на тестову ознаку, додав її. Оскільки Drupal 8 ще такий молодий, багато людей не знають багато про систему плагінів, а документація може використати більше випадків використання тощо, що може принести чимало розробників для роботи з нею.
googletorp

Фелікс Єва має найкращу відповідь. Це не шалено складний.
kratos

@kratos Відповідь, яку надав Фелікс, насправді не вирішує питання про те, як розмістити блок "програмно", а натомість використовує конфігураційні файли. Конфігурацію можна імпортувати лише за допомогою друку, конфігураційного інтерфейсу синхронізації або встановлення модуля. Якщо це має відбутися під час виконання, збереження
файлу

4

Я просто вивчаю D8, але, здається, я знайшов набагато простіший спосіб розмістити блок програмно (це здавалося досить заляканим після прочитання відповіді googletorp!)

Коли я включив власний модуль, який визначав блок, я хотів, щоб блок автоматично розміщувався у правильній області. Кроки, які я використав для цього:

  1. Увімкніть модуль і розмістіть блок за допомогою інтерфейсу на /admin/structure/block
  2. Перейдіть на сторінку експорту конфігурації єдиного елемента за адресою admin/config/development/configuration/single/export
  3. Виберіть блок Тип конфігурації та для імені Конфігурації виберіть блок, який ви щойно розмістили за допомогою інтерфейсу користувача, та скопіюйте створений код.
  4. У своєму модулі створіть папку /config/install/
  5. Під згенерованим кодом textarea він повідомляє вам ім'я файлу, яке потрібно використовувати. Створіть цей файл у /config/installкаталозі та скопіюйте його туди.
  6. Тепер, коли ви видалите модуль та повторно ввімкнете його, блок буде автоматично розміщений.

чи не доведеться вам видаляти UUID, щоб це працювало для інших розробників чи середовищ?
powpow12

Так - видалення UUID було б хорошою ідеєю.
Фелікс Єва

Ви також можете використовувати консоль Drupal, яка піклується про автоматизацію деяких із цих завдань: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/…
Beau


2

Наведений вище приклад є досить близьким, але все ще не правильним. Ідея полягає в тому, що ви повинні придумати свій власний ідентифікатор екземпляра блоку (у моєму випадку devel_execute_php_1112 (можливо, тому, що я намагався змусити його працювати 1112 разів, це залишиться загадкою)), а потім власне ідентифікатор блоку (той, що оголошено для користувацьких блоків в анотації) та теми. Тоді просто встановіть регіон, і ви добре їхати. Створено екземпляр блоку під потрібним регіоном.

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'devel_execute_php_1112',
      'plugin' => 'devel_execute_php',
      'theme' => 'seven'
  )
);
$block->setRegion('content');
$block->save();

edit1: Я фактично пізніше перевірив коментар вище - і це правильно. Просто не ясно, що ідентифікатор - це те, що вам потрібно придумати. Як викуп мого коментаря з кульгавим коментарем я опублікую рішення про те, як створити блок-екземпляр спеціальної сутності блоку:

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'ggggggggsssssss',
      'plugin' => 'block_content:79d53b4e-9e60-4f97-befc-101da919bb7a',
      'theme' => 'visitb_he_theme'
  )
);
$block->setRegion('content');

в основному те саме, але для плагіна ви пишете block_content: uuid_of_custom_block_entity_instance

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.