130 lines
5.5 KiB
Diff
130 lines
5.5 KiB
Diff
From 09cf17028ae510e99e0430ce735536bc37d0d3ea Mon Sep 17 00:00:00 2001
|
|
From: Emil Johnsson <emil@kodamera.se>
|
|
Date: Tue, 1 Feb 2022 13:09:02 +0100
|
|
Subject: [PATCH 1/2] Applied patch from #37 by heddn
|
|
|
|
---
|
|
src/Normalizer/ContentEntityNormalizer.php | 38 ++++++++++++++++++++++
|
|
1 file changed, 38 insertions(+)
|
|
|
|
diff --git a/src/Normalizer/ContentEntityNormalizer.php b/src/Normalizer/ContentEntityNormalizer.php
|
|
index 08d68ee..3ece0fa 100644
|
|
--- a/src/Normalizer/ContentEntityNormalizer.php
|
|
+++ b/src/Normalizer/ContentEntityNormalizer.php
|
|
@@ -22,6 +22,8 @@ use Drupal\pathauto\PathautoState;
|
|
use Drupal\serialization\Normalizer\SerializedColumnNormalizerTrait;
|
|
use Drupal\user\UserInterface;
|
|
use Symfony\Component\Serializer\Exception\UnexpectedValueException;
|
|
+use Drupal\layout_builder\Section;
|
|
+use Drupal\layout_builder\Plugin\DataType\SectionData;
|
|
|
|
/**
|
|
* Normalizes and denormalizes content entities.
|
|
@@ -253,6 +255,22 @@ class ContentEntityNormalizer implements ContentEntityNormalizerInterface {
|
|
}
|
|
$property->setValue($target_entity);
|
|
}
|
|
+ elseif ($property instanceof SectionData) {
|
|
+ // Rebuild references on layout_builder.
|
|
+ foreach ($value['components'] as $key => $component) {
|
|
+ if (isset($component['configuration']['id'])) {
|
|
+ [$component_type] = explode(PluginBase::DERIVATIVE_SEPARATOR, $component['configuration']['id']);
|
|
+ if ($component_type == 'inline_block') {
|
|
+ $target_uuid = $component['additional']['target_uuid'] ?? NULL;
|
|
+ if ($target_uuid && $block_content = $this->entityRepository->loadEntityByUuid('block_content', $target_uuid)) {
|
|
+ $value['components'][$key]['configuration']['block_revision_id'] = $block_content->getRevisionId();
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ $section_value = Section::fromArray($value);
|
|
+ $property->setValue($section_value);
|
|
+ }
|
|
else {
|
|
$property->setValue($value);
|
|
}
|
|
@@ -419,6 +437,26 @@ class ContentEntityNormalizer implements ContentEntityNormalizerInterface {
|
|
$value = $target->uuid();
|
|
}
|
|
}
|
|
+ elseif ($property instanceof SectionData && $property->getValue() instanceof Section) {
|
|
+ $value = $property->getValue()->toArray();
|
|
+
|
|
+ // Layout Sections reference inline blocks by id, we need to reference by
|
|
+ // UUID and make sure the section has a dependency on the inline_block.
|
|
+ foreach ($value['components'] as $key => $component) {
|
|
+ if (isset($component['configuration']['id'])) {
|
|
+ // This is only valid for inline_block.
|
|
+ [$component_type, $component_bundle] = explode(PluginBase::DERIVATIVE_SEPARATOR, $component['configuration']['id']);
|
|
+ if ($component_type == 'inline_block') {
|
|
+ $block_revision_id = $component['configuration']['block_revision_id'];
|
|
+ $block_content = $this->entityTypeManager->getStorage('block_content')->loadRevision($block_revision_id);
|
|
+ if ($block_content) {
|
|
+ $value['components'][$key]['additional']['target_uuid'] = $block_content->uuid();
|
|
+ $this->addDependency($block_content);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
elseif ($property instanceof Uri) {
|
|
$value = $property->getValue();
|
|
$scheme = parse_url($value, PHP_URL_SCHEME);
|
|
--
|
|
GitLab
|
|
|
|
|
|
From 3cd0c7f52f9dff759518fa5d940cb000abfdd37f Mon Sep 17 00:00:00 2001
|
|
From: Emil Johnsson <emil@kodamera.se>
|
|
Date: Tue, 1 Feb 2022 13:09:10 +0100
|
|
Subject: [PATCH 2/2] Applied patch from #41 by S3b0uN3t (with code cleanup)
|
|
|
|
---
|
|
src/Exporter.php | 23 +++++++++++++++++++++++
|
|
1 file changed, 23 insertions(+)
|
|
|
|
diff --git a/src/Exporter.php b/src/Exporter.php
|
|
index e0df909..3443118 100644
|
|
--- a/src/Exporter.php
|
|
+++ b/src/Exporter.php
|
|
@@ -11,6 +11,7 @@ use Drupal\Core\Serialization\Yaml;
|
|
use Drupal\default_content\Event\DefaultContentEvents;
|
|
use Drupal\default_content\Event\ExportEvent;
|
|
use Drupal\default_content\Normalizer\ContentEntityNormalizerInterface;
|
|
+use Drupal\layout_builder\Plugin\Block\InlineBlock;
|
|
use Drupal\user\UserInterface;
|
|
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
|
|
|
@@ -199,6 +200,28 @@ class Exporter implements ExporterInterface {
|
|
protected function getEntityReferencesRecursive(ContentEntityInterface $entity, $depth = 0, array &$indexed_dependencies = []) {
|
|
$entity_dependencies = $entity->referencedEntities();
|
|
|
|
+ // Get dependencies from layout builder.
|
|
+ if ($entity->hasField('layout_builder__layout')) {
|
|
+ $section_data = $entity->get('layout_builder__layout');
|
|
+ foreach ($section_data->getSections() as $section) {
|
|
+ $components = $section->getComponents();
|
|
+ foreach ($components as $component) {
|
|
+ $plugin = $component->getPlugin();
|
|
+ if ($plugin instanceof InlineBlock) {
|
|
+ $configuration = $component->get('configuration');
|
|
+ if (!empty($block_revision_id = $configuration['block_revision_id'])) {
|
|
+ $block_content = $this->entityTypeManager
|
|
+ ->getStorage('block_content')
|
|
+ ->loadRevision($block_revision_id);
|
|
+ if ($block_content) {
|
|
+ $entity_dependencies[] = $block_content;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
foreach ($entity_dependencies as $dependent_entity) {
|
|
// Config entities should not be exported but rather provided by default
|
|
// config.
|
|
--
|
|
GitLab
|
|
|