Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll

12.9.1. Работа с конфигурациями в Drupal 8. Импорт контента и конфигурации.

19/11/2019, by Ivan

Когда вы импортируете конфигурацию с одного сайта на другой, то некоторые конфиги нужны для вывода контента, но сам контент конфиги не содержат. В этом уроке мы разберем как переносить блоки, ноды и термины таксономии с одного сайта на другой.

Давайте создадим блок на одном сайте и перенесем конфигурации на другой сайт, о том как переносить конфиги с одного сайта на другой, вы можете посмотреть в прошлой статье 12.9. Работа с конфигурациями в Drupal 8. Active, Sync конфиги, перенос конфигов с DEV на LIVE. 

admin

Вы увидете такую вот ошибку "This block is broken or missing. You may be missing content or you might need to enable the original module.":

Test lessions

Дело в том, что для блока необходима entity блока с определенным uuid. UUID это уникальный идентификатор сущности, даже если мы на новом сайте создадим такой же блок с тем же контентом, то этот блок не подхватится конфигом, потому что UUID у нового блока будет другой. Вы можете посмотреть нужный UUID в конфиге для блока:

block content

Не перепутайте UUID блока с UUID конфига. Дело в том, что конфиги тоже являются entity в друпале, только в отличии от блоков и нод которые являются content entity, конфиги являются config entity, в одном из следующих уроках мы рассмотрим классы ContentEntity и ConfigEntity.

Итак, теперь вы знаете какой вам нужен UUID для блока и вам нужно создать этот блок через код, чтобы при деплои ваш блок с нужным UUID создался. Для этого мы будем использовать hook_update_n():

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Extension%21module.api.php/function/hook_update_N/8.2.x

Hook_update_n() нужно добалять .install файл кастомного модуля, чтобы апдейт подхватился модуль уже должен быть заранее добавлен на сайт и включен. Каждый новый hook_update_n() будет выполняться при запуске update.php или обновления БД через drush или drupal console. В отличии от остальных хуков, где нужно менять только слово hook_ вначале, в hook_update_n() нужно еще менять и n на конце, чтобы каждый апдейт имел свою версию, обычно используют числа 8000 и больше для Drupal 8.x, 7000 и больше для Drupal 7.x, то есть первая цифра это версия ядра друпала.

/modules/custom/drupalbook/drupalbook.install:

/**
 * Add simple block with text and image.
 */
function drupalbook_update_8001(&$sandbox) {
  $uuid = 'dc0876cf-a242-4f4c-af0e-8a27fbe9e142';
  $block = \Drupal::entityManager()->loadEntityByUuid('block_content', $uuid);
 
  if (empty($block)) {
    $block = \Drupal\block_content\Entity\BlockContent::create([
      // Block title.
      'info' => 'Simple text block with image',
      // Block bundle.
      'type' => 'basic',
      'uuid' => 'dc0876cf-a242-4f4c-af0e-8a27fbe9e142'
    ]);
    $block->body->value = 'Hello, World!';
    $block->save();
  }
}

Теперь нужно перенести этот код и на второй сайт и потом запустить там update.php файл:

drupal database

Drupal найдет этот апдейт и после его выполнения у вас появится ваш блок.

Если вы посмотрите на код, который создает блок, то перед тем создать блок, мы проверяем, что блок существует, это нужно для того чтобы при выполнении апдейта на вашем исходном сайте, где блок уже существует, не возникла ошибка о невозможности создания блока с уже существующим UUID.

Также обратите внимание, что переносится только текст блока, картинки, которые загруженны инлайн в текст, через image browser CKEditor не перенесутся, потому что файлы придется переносить отдельно. Возможно залить через drush, ssh, ftp или положить в git (если это 1 или два файла, если больше, то лучше не засорять git файлами изображений). Процесс деплоя на разных проектах устроен по разному и везде использует разные походы, поэтому для проекта важно иметь  хотя бы минимальную документацию с описанием процесса деплоя.

Тоже самое касается и создания терминов таксономии, мы переносим в конфигах только настройки словаря и полей терминов таксономии, но сами термины таксономии нужно создавать отдельно, например так:

\taxonomy\Entity\Term;
...
 
/**
 * Create taxonomy term programmatically.
 */
function drupalbook_update_8002(&$sandbox) {
  $term = Term::create([
    'name' => 'Drupal 8',
    'vid' => 'tags',
  ])->save();
}

В поле vid нужно указать машинное имя словаря таксономии (Vocabulary ID).

Для создания нод нужно использовать примерно такой код:

/**
 * Create node programmatically.
 */
function drupalbook_update_8003(&$sandbox) {
  $node = Node::create(['type' => 'page']);
  $node->set('title', 'About us');
  $body = [
    'value' => 'Text about us',
    'format' => 'basic_html',
  ];
  $node->set('body', $body);
  $node->status = 1;
  $node->enforceIsNew();
  $node->save();
}

Примерно, потому что можно писать также вместо set() просто равно:

= [
    'value' => 'Text about us',
    'format' => 'basic_html',
  ];
  $node->set('body', $body);
 
// Или
 $node->body->format =  'basic_html';
 $node->body->value =  'Text about us',

Каждый раз, когда вы добавляете новый hook_update_n(), вам нужно запускать update.php. Если вы используете Acquia или другой хостинг с автодеплоем, то этот процесс автоматизированн и вам нужно уточнить каким образом будет происходить деплой.

Примеры кода можно посмотреть на github:
https://github.com/levmyshkin/drupalbook8