docker-example-drupal-comme.../patches/default_content/3160146-layout-builder.patch
2023-10-18 19:30:45 +02:00

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