Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
40.91% |
9 / 22 |
|
66.67% |
2 / 3 |
CRAP | |
0.00% |
0 / 1 |
EntityViewDisplay | |
40.91% |
9 / 22 |
|
66.67% |
2 / 3 |
10.16 | |
0.00% |
0 / 1 |
__construct | |
100.00% |
8 / 8 |
|
100.00% |
1 / 1 |
1 | |||
getDisplayInfos | |
0.00% |
0 / 13 |
|
0.00% |
0 / 1 |
12 | |||
initialImport | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 |
1 | <?php |
2 | |
3 | declare(strict_types=1); |
4 | |
5 | namespace Drupal\display_builder_entity_view\Entity; |
6 | |
7 | use Drupal\Core\Entity\Entity\EntityViewDisplay as CoreEntityViewDisplay; |
8 | use Drupal\Core\Entity\EntityTypeManagerInterface; |
9 | use Drupal\Core\Extension\ModuleExtensionList; |
10 | use Drupal\Core\Theme\Registry; |
11 | use Drupal\display_builder\InstanceInterface; |
12 | use Drupal\display_builder_entity_view\BuilderDataConverter; |
13 | use Drupal\ui_patterns\Element\ComponentElementBuilder; |
14 | use Drupal\ui_patterns\Entity\SampleEntityGeneratorInterface; |
15 | use Drupal\ui_patterns\SourcePluginManager; |
16 | |
17 | /** |
18 | * Provides an entity view display entity that has a display builder. |
19 | * |
20 | * When Layout Builder is not activated, extends the default entity view |
21 | * display ("Manage display"). |
22 | * |
23 | * @see \Drupal\display_builder_entity_view\Hook\DisplayBuilderEntityViewHook::entityTypeAlter() |
24 | * @see \Drupal\display_builder_entity_view\Entity\LayoutBuilderEntityViewDisplay |
25 | */ |
26 | class EntityViewDisplay extends CoreEntityViewDisplay implements DisplayBuilderEntityDisplayInterface, DisplayBuilderOverridableInterface { |
27 | |
28 | use EntityViewDisplayTrait; |
29 | |
30 | /** |
31 | * The source plugin manager. |
32 | */ |
33 | protected SourcePluginManager $sourcePluginManager; |
34 | |
35 | /** |
36 | * The entity type manager. |
37 | */ |
38 | protected EntityTypeManagerInterface $entityTypeManager; |
39 | |
40 | /** |
41 | * The component element builder service. |
42 | */ |
43 | protected ComponentElementBuilder $componentElementBuilder; |
44 | |
45 | /** |
46 | * The sample entity generator. |
47 | */ |
48 | protected SampleEntityGeneratorInterface $sampleEntityGenerator; |
49 | |
50 | /** |
51 | * The theme registry. |
52 | */ |
53 | protected Registry $themeRegistry; |
54 | |
55 | /** |
56 | * The list of modules. |
57 | */ |
58 | protected ModuleExtensionList $modules; |
59 | |
60 | /** |
61 | * The data converter from Manage Display and Layout Builder. |
62 | */ |
63 | protected BuilderDataConverter $dataConverter; |
64 | |
65 | /** |
66 | * The loaded display builder instance. |
67 | */ |
68 | protected ?InstanceInterface $instance; |
69 | |
70 | /** |
71 | * Constructs the EntityViewDisplay. |
72 | * |
73 | * @param array $values |
74 | * The values to initialize the entity with. |
75 | * @param string $entity_type |
76 | * The entity type ID. |
77 | */ |
78 | public function __construct(array $values, $entity_type) { |
79 | parent::__construct($values, $entity_type); |
80 | $this->sourcePluginManager = \Drupal::service('plugin.manager.ui_patterns_source'); |
81 | $this->entityTypeManager = \Drupal::service('entity_type.manager'); |
82 | $this->componentElementBuilder = \Drupal::service('ui_patterns.component_element_builder'); |
83 | $this->sampleEntityGenerator = \Drupal::service('ui_patterns.sample_entity_generator'); |
84 | $this->themeRegistry = \Drupal::service('theme.registry'); |
85 | $this->modules = \Drupal::service('extension.list.module'); |
86 | $this->dataConverter = \Drupal::service('display_builder_entity_view.builder_data_converter'); |
87 | } |
88 | |
89 | /** |
90 | * Gets entity_view_display information grouped by entity type. |
91 | * |
92 | * @todo To remove. |
93 | * https://www.drupal.org/project/display_builder/issues/3542273 |
94 | * |
95 | * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager |
96 | * The entity type manager service. |
97 | * |
98 | * @return array |
99 | * An array of display information keyed with 'node', then 'modes' and |
100 | * 'bundles': |
101 | * |
102 | * @code |
103 | * [ |
104 | * 'node' => [ |
105 | * 'modes' => [ |
106 | * 'teaser' => 'Teaser', |
107 | * ], |
108 | * 'bundles' => [ |
109 | * 'article' => [ |
110 | * 'teaser' => 'Teaser', |
111 | * ], |
112 | * ], |
113 | * ], |
114 | * ]; |
115 | * |
116 | * @endcode |
117 | */ |
118 | public static function getDisplayInfos(EntityTypeManagerInterface $entityTypeManager): array { |
119 | /** @var \Drupal\display_builder_entity_view\Entity\EntityViewDisplay[] $displays */ |
120 | $displays = $entityTypeManager |
121 | ->getStorage('entity_view_display') |
122 | ->loadMultiple(); |
123 | $view_mode_storage = $entityTypeManager->getStorage('entity_view_mode'); |
124 | $tabs_info = []; |
125 | |
126 | foreach ($displays as $display) { |
127 | if (!$display->getDisplayBuilderOverrideField()) { |
128 | continue; |
129 | } |
130 | |
131 | $entity_type_id = $display->getTargetEntityTypeId(); |
132 | $view_mode = $view_mode_storage->load(\sprintf('%s.%s', $entity_type_id, $display->getMode())); |
133 | $tabs_info[$entity_type_id]['modes'][$display->getMode()] = $view_mode?->label() ?? t('Default'); |
134 | $tabs_info[$entity_type_id]['bundles'][$display->getTargetBundle()][$display->getMode()] = $view_mode?->label() ?? t('Default'); |
135 | } |
136 | |
137 | return $tabs_info; |
138 | } |
139 | |
140 | /** |
141 | * Initial import from existing data. |
142 | * |
143 | * @return array |
144 | * List of UI Patterns sources. |
145 | * |
146 | * @see EntityViewDisplayTrait::initInstanceIfMissing() |
147 | * @see LayoutBuilderEntityViewDisplay::initialImport() |
148 | */ |
149 | protected function initialImport(): array { |
150 | return $this->dataConverter->convertFromManageDisplay($this->getTargetEntityTypeId(), $this->getTargetBundle(), $this->content); |
151 | } |
152 | |
153 | } |