Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
LayoutBuilderEntityViewDisplay
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 5
110
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
2
 preSave
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
20
 getDisplayBuilderOverrideField
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 initialImport
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 importFromLayoutBuilder
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3declare(strict_types=1);
4
5namespace Drupal\display_builder_entity_view\Entity;
6
7use Drupal\Core\Entity\EntityStorageInterface;
8use Drupal\Core\Entity\EntityTypeManagerInterface;
9use Drupal\Core\Extension\ModuleExtensionList;
10use Drupal\Core\Theme\Registry;
11use Drupal\display_builder\ConfigFormBuilderInterface;
12use Drupal\display_builder\InstanceInterface;
13use Drupal\display_builder_entity_view\BuilderDataConverter;
14use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay as CoreLayoutBuilderEntityViewDisplay;
15use Drupal\ui_patterns\Element\ComponentElementBuilder;
16use Drupal\ui_patterns\Entity\SampleEntityGeneratorInterface;
17use Drupal\ui_patterns\SourcePluginManager;
18
19/**
20 * Provides an entity view display entity that has a display builder.
21 *
22 * When Layout Builder is activated, extends Layout Builder.
23 *
24 * @see \Drupal\display_builder_entity_view\Hook\DisplayBuilderEntityViewHook::entityTypeAlter()
25 * @see \Drupal\display_builder_entity_view\Entity\EntityViewDisplay
26 */
27class LayoutBuilderEntityViewDisplay extends CoreLayoutBuilderEntityViewDisplay implements DisplayBuilderEntityDisplayInterface, DisplayBuilderOverridableInterface {
28
29  use EntityViewDisplayTrait;
30
31  /**
32   * The source plugin manager.
33   */
34  protected SourcePluginManager $sourcePluginManager;
35
36  /**
37   * The entity type manager.
38   */
39  protected EntityTypeManagerInterface $entityTypeManager;
40
41  /**
42   * The component element builder service.
43   */
44  protected ComponentElementBuilder $componentElementBuilder;
45
46  /**
47   * The sample entity generator.
48   */
49  protected SampleEntityGeneratorInterface $sampleEntityGenerator;
50
51  /**
52   * The theme registry.
53   */
54  protected Registry $themeRegistry;
55
56  /**
57   * The list of modules.
58   */
59  protected ModuleExtensionList $modules;
60
61  /**
62   * The data converter from Manage Display and Layout Builder.
63   */
64  protected BuilderDataConverter $dataConverter;
65
66  /**
67   * The loaded display builder instance.
68   */
69  protected ?InstanceInterface $instance;
70
71  /**
72   * Constructs the LayoutBuilderEntityViewDisplay.
73   *
74   * @param array $values
75   *   The values to initialize the entity with.
76   * @param string $entity_type
77   *   The entity type ID.
78   */
79  public function __construct(array $values, $entity_type) {
80    $this->entityFieldManager = \Drupal::service('entity_field.manager');
81    parent::__construct($values, $entity_type);
82    $this->sourcePluginManager = \Drupal::service('plugin.manager.ui_patterns_source');
83    $this->entityTypeManager = \Drupal::service('entity_type.manager');
84    $this->componentElementBuilder = \Drupal::service('ui_patterns.component_element_builder');
85    $this->sampleEntityGenerator = \Drupal::service('ui_patterns.sample_entity_generator');
86    $this->themeRegistry = \Drupal::service('theme.registry');
87    $this->modules = \Drupal::service('extension.list.module');
88    $this->dataConverter = \Drupal::service('display_builder_entity_view.builder_data_converter');
89  }
90
91  /**
92   * {@inheritdoc}
93   */
94  public function preSave(EntityStorageInterface $storage): void {
95    // If the update is made from Layout Builder, convert the data and copy
96    // to Display Builder's third party settings storage.
97    if (isset($this->form_id) && $this->form_id === 'entity_view_display_layout_builder_form') {
98      if ($this->getProfile()) {
99        $this->importFromLayoutBuilder();
100      }
101    }
102    parent::preSave($storage);
103  }
104
105  /**
106   * Returns the field name used to store overridden displays.
107   *
108   * @return string|null
109   *   The field name used to store overridden displays, or NULL if not set.
110   *
111   * @see Drupal\display_builder_entity_view\Entity\DisplayBuilderOverridableInterface
112   */
113  public function getDisplayBuilderOverrideField(): ?string {
114    return $this->getThirdPartySetting('display_builder', ConfigFormBuilderInterface::OVERRIDE_FIELD_PROPERTY);
115  }
116
117  /**
118   * Initial import from existing data.
119   *
120   * @return array
121   *   List of UI Patterns sources.
122   *
123   * @see EntityViewDisplayTrait::initInstanceIfMissing()
124   * @see EntityViewDisplay::initialImport()
125   */
126  protected function initialImport(): array {
127    if ($this->getThirdPartySetting('layout_builder', 'enabled')) {
128      $sections = $this->getThirdPartySetting('layout_builder', 'sections');
129
130      return $this->dataConverter->convertFromLayoutBuilder($sections);
131    }
132
133    // If Layout Builder is not used, import from Manage Display data.
134    return $this->dataConverter->convertFromManageDisplay($this->getTargetEntityTypeId(), $this->getTargetBundle(), $this->content);
135  }
136
137  /**
138   * Import and convert data from layout builder.
139   *
140   * This is not used for the first import but for the following saves.
141   *
142   * @see LayoutBuilderEntityViewDisplay::preSave()
143   */
144  protected function importFromLayoutBuilder(): void {
145    if (!$this->getInstanceId()) {
146      return;
147    }
148    $sections = $this->getThirdPartySetting('layout_builder', 'sections');
149    $sources = $this->dataConverter->convertFromLayoutBuilder($sections);
150
151    /** @var \Drupal\display_builder\InstanceStorage $storage */
152    $storage = $this->entityTypeManager->getStorage('display_builder_instance');
153    /** @var \Drupal\display_builder\InstanceInterface $instance */
154    $instance = $storage->load($this->getInstanceId());
155    $instance->setNewPresent($sources, 'Import from Layout Builder');
156    $instance->save();
157  }
158
159}