Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
40.91% covered (danger)
40.91%
9 / 22
66.67% covered (warning)
66.67%
2 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
EntityViewDisplay
40.91% covered (danger)
40.91%
9 / 22
66.67% covered (warning)
66.67%
2 / 3
10.16
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
1
 getDisplayInfos
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
12
 initialImport
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3declare(strict_types=1);
4
5namespace Drupal\display_builder_entity_view\Entity;
6
7use Drupal\Core\Entity\Entity\EntityViewDisplay as CoreEntityViewDisplay;
8use Drupal\Core\Entity\EntityTypeManagerInterface;
9use Drupal\Core\Extension\ModuleExtensionList;
10use Drupal\Core\Theme\Registry;
11use Drupal\display_builder\InstanceInterface;
12use Drupal\display_builder_entity_view\BuilderDataConverter;
13use Drupal\ui_patterns\Element\ComponentElementBuilder;
14use Drupal\ui_patterns\Entity\SampleEntityGeneratorInterface;
15use 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 */
26class 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}