Как перенести блочный контент с разработчика на рабочий сайт?

24

Я наконец начал серьезно относиться к Drupal 8, и меня особенно интересует управление конфигурацией. Я столкнулся с чем-то, что может быть немного проблематично, и это касается пользовательского контента блока.

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

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

Как можно перенести пользовательские блоки с сервера разработки / размещения на рабочий сервер? Я понимаю, что блоки в Drupal 8 являются полевыми объектами, такими как узлы, и поэтому их нужно будет перенести аналогичным образом, и я понимаю, что в Drupal 8 есть API Migrate, но, похоже, он создан для переноса контента с сайтов Drupal 6 и 7 в Drupal 8 в отличие от Drupal 8 до сайтов Drupal 8.

Эта проблема касается, в частности, пользовательских блоков, поскольку блоки, сгенерированные другими модулями, такими как Views, очевидно, будут мигрировать в конфигурации.


источник
В работе есть несколько решений для размещения контента, включая модуль развертывания и entitypilot.com (заявление об отказе от ответственности, это мой продукт)
larowlan
1
Аналогично: ошибка блока на CMI
kenorb

Ответы:

7

Другой ответ, о котором я не упомянул, это использование модуля Simple Block , который в значительной степени идентичен настройке ядра «Custom Block», но вместо странного гибрида content + config у вас есть все настройки и контент Block. хранится в конфигурации, которая может быть чисто экспортирована и импортирована.

См. Для дальнейшего обсуждения в ядре Drupal 8: Пользовательские блоки не могут быть должным образом экспортированы и импортированы .

geerlingguy
источник
3

Я только что опубликовал готовый модуль, который решает эту проблему. По сути, модуль предоставляет тип блока на основе конфигурации (фиксированный блок), который обертывает пользовательский блок (блок контента). Если блок контента не существует, он создается с контентом по умолчанию или пустым, если контент по умолчанию не был установлен. Все делается через пользовательский интерфейс, никаких специальных файлов или пользовательских модулей не требуется.

Я назвал это Фиксированным содержимым блока, и он опубликован по адресу:

https://www.drupal.org/project/fixed_block_content

Мануэль Адан
источник
1

Еще один подход к сохранению контента, добавляемого как часть разработки, и его активизации - использование модуля контента по умолчанию для экспорта контента. Он создан для экспорта контента в папку «содержимого» профиля установки, а затем модуль, если он включен, автоматически переносит контент при установке сайта, но также возможно импортировать контент по одному элементу за раз например, в хуке обновления, с кодом ниже в вашем example.install или example.profile:

<?php
/**
* Import a piece of content exported by default content module.
*/
function example_import_default_content($path_to_content_json) {
  list($entity_type_id, $filename) = explode('/', $path_to_content_json);
  $p = drupal_get_path('profile', 'guts');
  $encoded_content = file_get_contents($p . '/content/' . $path_to_content_json);
  $serializer = \Drupal::service('serializer');
  $content = $serializer->decode($encoded_content, 'hal_json');
  global $base_url;
  $url = $base_url . base_path();
  $content['_links']['type']['href'] = str_replace('http://drupal.org/', $url, $content['_links']['type']['href']);
  $contents = $serializer->encode($content, 'hal_json');
  $class = 'Drupal\\' . $entity_type_id . '\Entity\\' . str_replace(' ', '', ucwords(str_replace('_', ' ', $entity_type_id)));
  $entity = $serializer->deserialize($contents, $class, 'hal_json', array('request_method' => 'POST'));
  $entity->enforceIsNew(TRUE);
  $entity->save();
}

Экспортируйте пользовательский блок с идентификатором 8:

drush dcer block_content 8

(Если вы не указали путь к профилю в настройках Drush, вам придется указать его выше.)

И используйте результирующий экспорт в вашем файле example.install следующим образом:

<?php
/**
* Add the footer block content.
*
* Implements hook_update_N().
*/
function example_update_8001() {
  example_import_default_content('block_content/136efd63-021e-42ea-8202-8b97305cc07f.json');
}

http://data.agaric.com/easily-add-content-update-hooks-use-default-content-module-exports-create-content-needs-be-sync-conf

mlncn
источник
0

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

Причина этого в том, что из yml-файлов создается новый блок, который не имеет заголовка / тела (содержимого) и поэтому выдает сообщение «сломан / отсутствует».

Вы можете попытаться сделать UUID (если вы хотите сделать блок в обоих местах - убедитесь, что имя машины совпадает ...) в вашей таблице разработки block_content, совпадают с тем, что у вас есть в производстве (другие отношения, кажется, используют сущность мне бы). Затем, когда вы выполняете синхронизацию конфигурации, вы можете увидеть «Просмотр различий» в файлах yml и, возможно, увидеть, что еще нужно изменить в dev, чтобы он соответствовал рабочим uuids и т. Д. Я заставил это работать, но все же подумал Проще всего игнорировать все ваши конфигурации блоков в коде, если вы не пройдете этот процесс или не создадите для себя некую синхронизацию блоков базы данных, используя block_content, block_content__body и block_content_field_data.

Это не очень элегантно, но может позволить вам сохранить ваши конфиги блоков в коде. В противном случае, если вы продолжите развертывать блоки с помощью config, они всегда будут «сломаны или отсутствуют».

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

ArchbishopLolly
источник
0

Имея ту же проблему, но не решение, а только дополнения: в совместной разработке мы используем промежуточный сервер, который извлекает данные из хранилища и сбрасывает все настройки. Это означает, что конфигурация блоков сбрасывается автоматически, вы просто не можете размещать блоки, которые вы рассматриваете как «контент», непосредственно на этом сервере.

Использовать синхронизацию drush config-export легко, зная точно, что вы сделали, и будучи уверенным, что любые изменения конфигурации предназначены для развертывания. Но Drupal решает для нас, что блоки - это конфигурация (хотя очевидно, что контент блоков обрабатывается как контент). Так что это кажется нарушенным по замыслу.

На данный момент, я считаю, наиболее практичным решением было бы добавить связанные с блоками файлы yml в .gitignore.

hexabinaer
источник
1
Config Ignore, вероятно, лучше, чем .gitignore: drupal.org/project/config_ignore
bdanin
0

Я тоже не уверен, однако, если вы не нашли никакого решения, вы можете посмотреть этот модуль https://www.drupal.org/project/deploy . Честно говоря, я не помню, можно ли развернуть push-блоки из DEV в PROD или нет.

Руслан П
источник
0

Я думаю, что лучший способ справиться с этим:

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

Jigarius
источник
Это может работать, если нет проблем с перезаписью базы данных. Теперь, если единственным желанием является перемещение нового пользовательского блока в существующую базу данных, этот метод будет трудно реализовать.
Каролус
Этот ответ имеет свое место в теории. Но на практике это не очень хорошее решение, особенно если проект использует разделение конфигурации или имеет какую-либо другую конфигурацию между средами (что весьма вероятно).
Комленик
0

Пожалуйста, возьмите руки на модуль синхронизации структуры .

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

шаги:

  1. Перейти к структуре синхронизации.
  2. Перейдите на вкладку Blocks.
  3. Экспорт.
  4. Ваши конфигурации и контент будут экспортированы в папку конфигурации.
  5. Перенесите настройки на другие сайты и импортируйте.
  6. Перейти к структуре синхронизации и нажмите на импорт.
  7. Выполнено
Праная Агарвал
источник