Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 59
0.00% covered (danger)
0.00%
0 / 24
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
DisplayBuilderEntityViewHook
0.00% covered (danger)
0.00%
0 / 59
0.00% covered (danger)
0.00%
0 / 24
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 4
182
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 entityTypeAlter
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
6
 entityOperationAlter
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
20
 entityDelete
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
42
1<?php
2
3declare(strict_types=1);
4
5namespace Drupal\display_builder_entity_view\Hook;
6
7use Drupal\Core\Entity\EntityInterface;
8use Drupal\Core\Entity\EntityTypeManagerInterface;
9use Drupal\Core\Extension\ModuleHandlerInterface;
10use Drupal\Core\Hook\Attribute\Hook;
11use Drupal\Core\Hook\Order\OrderAfter;
12use Drupal\Core\StringTranslation\TranslatableMarkup;
13use Drupal\display_builder\DisplayBuildableInterface;
14use Drupal\display_builder\DisplayBuilderHelpers;
15use Drupal\display_builder\InstanceInterface;
16use Drupal\display_builder_entity_view\Entity\EntityViewDisplay;
17use Drupal\display_builder_entity_view\Entity\LayoutBuilderEntityViewDisplay;
18use Drupal\display_builder_entity_view\Form\EntityViewDisplayForm;
19use Drupal\display_builder_entity_view\Form\LayoutBuilderEntityViewDisplayForm;
20use Drupal\display_builder_entity_view\Plugin\display_builder\Buildable\EntityView;
21use Drupal\display_builder_entity_view\Plugin\display_builder\Buildable\EntityViewOverride;
22
23/**
24 * Hook implementations for display_builder_entity_view.
25 */
26class DisplayBuilderEntityViewHook {
27
28  public function __construct(
29    protected ModuleHandlerInterface $moduleHandler,
30    protected EntityTypeManagerInterface $entityTypeManager,
31  ) {}
32
33  /**
34   * Implements hook_entity_type_alter().
35   *
36   * @param array $entity_types
37   *   An associative array of entity type definitions.
38   */
39  #[Hook('entity_type_alter', order: new OrderAfter(['layout_builder']))]
40  public function entityTypeAlter(array &$entity_types): void {
41    /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */
42    if ($this->moduleHandler->moduleExists('layout_builder')) {
43      $entity_types['entity_view_display']
44        ->setClass(LayoutBuilderEntityViewDisplay::class)
45        ->setFormClass('edit', LayoutBuilderEntityViewDisplayForm::class);
46    }
47    else {
48      $entity_types['entity_view_display']
49        ->setClass(EntityViewDisplay::class)
50        ->setFormClass('edit', EntityViewDisplayForm::class);
51    }
52  }
53
54  /**
55   * Implements hook_entity_operation_alter().
56   *
57   * @param array $operations
58   *   An associative array of operations.
59   * @param \Drupal\Core\Entity\EntityInterface $entity
60   *   The entity for which the operations are being altered.
61   */
62  #[Hook('entity_operation_alter')]
63  public function entityOperationAlter(array &$operations, EntityInterface $entity): void {
64    if (!$entity instanceof InstanceInterface) {
65      return;
66    }
67
68    $id = (string) $entity->id();
69
70    if (\str_starts_with($id, EntityView::getPrefix())) {
71      $operations['build'] = [
72        'title' => new TranslatableMarkup('Build display'),
73        'url' => EntityView::getUrlFromInstanceId($id),
74        'weight' => -1,
75      ];
76      $operations['edit'] = [
77        'title' => new TranslatableMarkup('Edit display'),
78        'url' => EntityView::getDisplayUrlFromInstanceId($id),
79        'weight' => 10,
80      ];
81    }
82    elseif (\str_starts_with($id, EntityViewOverride::getPrefix())) {
83      $operations['build'] = [
84        'title' => new TranslatableMarkup('Build display'),
85        'url' => EntityViewOverride::getUrlFromInstanceId($id),
86        'weight' => -1,
87      ];
88      $operations['edit'] = [
89        'title' => new TranslatableMarkup('Edit display'),
90        'url' => EntityViewOverride::getUrlFromInstanceId($id),
91        'weight' => 10,
92      ];
93    }
94  }
95
96  /**
97   * Implements hook_entity_delete().
98   *
99   * If the entity deleted has a display override, need to be deleted as well.
100   */
101  #[Hook('entity_delete')]
102  public function entityDelete(EntityInterface $entity): void {
103    $entity_type_id = $entity->getEntityTypeId();
104
105    if ($entity_type_id === 'display_builder_instance') {
106      return;
107    }
108    $entity_type = $this->entityTypeManager->getDefinition($entity_type_id);
109
110    // Only entities with display are concerned.
111    if (!DisplayBuilderHelpers::isDisplayBuilderEntityType($entity_type)) {
112      return;
113    }
114
115    $displays = $this->entityTypeManager->getStorage('entity_view_display')->loadByProperties([
116      'targetEntityType' => $entity_type_id,
117      'bundle' => $entity->bundle(),
118    ]);
119
120    $storage = $this->entityTypeManager->getStorage('display_builder_instance');
121
122    foreach ($displays as $display) {
123      // @phpstan-ignore-next-line
124      if (!$display->getDisplayBuilderOverrideField()) {
125        continue;
126      }
127      $field_name = $display->getThirdPartySetting('display_builder', DisplayBuildableInterface::OVERRIDE_FIELD_PROPERTY);
128
129      $instance_id = \sprintf(
130        '%s%s__%s__%s',
131        EntityViewOverride::getPrefix(),
132        $entity_type_id,
133        $entity->id(),
134        $field_name,
135      );
136
137      $instance = $storage->load($instance_id);
138
139      if (!$instance) {
140        return;
141      }
142      $storage->delete([$instance]);
143    }
144  }
145
146}