Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 26 |
|
0.00% |
0 / 5 |
CRAP | |
0.00% |
0 / 1 |
LayoutBuilderEntityViewDisplay | |
0.00% |
0 / 26 |
|
0.00% |
0 / 5 |
110 | |
0.00% |
0 / 1 |
__construct | |
0.00% |
0 / 9 |
|
0.00% |
0 / 1 |
2 | |||
preSave | |
0.00% |
0 / 4 |
|
0.00% |
0 / 1 |
20 | |||
getDisplayBuilderOverrideField | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
initialImport | |
0.00% |
0 / 4 |
|
0.00% |
0 / 1 |
6 | |||
importFromLayoutBuilder | |
0.00% |
0 / 8 |
|
0.00% |
0 / 1 |
6 |
1 | <?php |
2 | |
3 | declare(strict_types=1); |
4 | |
5 | namespace Drupal\display_builder_entity_view\Entity; |
6 | |
7 | use Drupal\Core\Entity\EntityStorageInterface; |
8 | use Drupal\Core\Entity\EntityTypeManagerInterface; |
9 | use Drupal\Core\Extension\ModuleExtensionList; |
10 | use Drupal\Core\Theme\Registry; |
11 | use Drupal\display_builder\ConfigFormBuilderInterface; |
12 | use Drupal\display_builder\InstanceInterface; |
13 | use Drupal\display_builder_entity_view\BuilderDataConverter; |
14 | use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay as CoreLayoutBuilderEntityViewDisplay; |
15 | use Drupal\ui_patterns\Element\ComponentElementBuilder; |
16 | use Drupal\ui_patterns\Entity\SampleEntityGeneratorInterface; |
17 | use 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 | */ |
27 | class 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 | } |