1<?php
2
3namespace Drupal\layout_builder_element_test\EventSubscriber;
4
5use Drupal\Core\Messenger\MessengerInterface;
6use Drupal\Core\StringTranslation\StringTranslationTrait;
7use Drupal\layout_builder\Event\PrepareLayoutEvent;
8use Drupal\layout_builder\LayoutBuilderEvents;
9use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
10use Drupal\layout_builder\Section;
11use Drupal\layout_builder\SectionComponent;
12use Symfony\Component\EventDispatcher\EventSubscriberInterface;
13
14/**
15 * An event subscriber to test altering section storage via the
16 * \Drupal\layout_builder\Event\PrepareLayoutEvent.
17 *
18 * @see \Drupal\layout_builder\Event\PrepareLayoutEvent
19 * @see \Drupal\layout_builder\Element\LayoutBuilder::prepareLayout()
20 */
21class TestPrepareLayout implements EventSubscriberInterface {
22
23  use StringTranslationTrait;
24
25  /**
26   * The layout tempstore repository.
27   *
28   * @var \Drupal\layout_builder\LayoutTempstoreRepositoryInterface
29   */
30  protected $layoutTempstoreRepository;
31
32  /**
33   * The messenger service.
34   *
35   * @var \Drupal\Core\Messenger\MessengerInterface
36   */
37  protected $messenger;
38
39  /**
40   * Constructs a new TestPrepareLayout.
41   *
42   * @param \Drupal\layout_builder\LayoutTempstoreRepositoryInterface $layout_tempstore_repository
43   *   The tempstore repository.
44   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
45   *   The messenger service.
46   */
47  public function __construct(LayoutTempstoreRepositoryInterface $layout_tempstore_repository, MessengerInterface $messenger) {
48    $this->layoutTempstoreRepository = $layout_tempstore_repository;
49    $this->messenger = $messenger;
50  }
51
52  /**
53   * {@inheritdoc}
54   */
55  public static function getSubscribedEvents() {
56    // Act before core's layout builder subscriber.
57    $events[LayoutBuilderEvents::PREPARE_LAYOUT][] = ['onBeforePrepareLayout', 20];
58    // Act after core's layout builder subscriber.
59    $events[LayoutBuilderEvents::PREPARE_LAYOUT][] = ['onAfterPrepareLayout', -10];
60    return $events;
61  }
62
63  /**
64   * Subscriber to test acting before the LB subscriber.
65   *
66   * @param \Drupal\layout_builder\Event\PrepareLayoutEvent $event
67   *   The prepare layout event.
68   */
69  public function onBeforePrepareLayout(PrepareLayoutEvent $event) {
70    $section_storage = $event->getSectionStorage();
71    $context = $section_storage->getContextValues();
72
73    if (!empty($context['entity'])) {
74      /** @var \Drupal\Core\Entity\EntityInterface $entity */
75      $entity = $context['entity'];
76
77      // Node 1 or 2: Append a block to the layout.
78      if (in_array($entity->id(), ['1', '2'])) {
79        $section = new Section('layout_onecol');
80        $section->appendComponent(new SectionComponent('fake-uuid', 'content', [
81          'id' => 'static_block',
82          'label' => 'Test static block title',
83          'label_display' => 'visible',
84          'provider' => 'fake_provider',
85        ]));
86        $section_storage->appendSection($section);
87      }
88
89      // Node 2: Stop event propagation.
90      if ($entity->id() === '2') {
91        $event->stopPropagation();
92      }
93    }
94  }
95
96  /**
97   * Subscriber to test acting after the LB subscriber.
98   *
99   * @param \Drupal\layout_builder\Event\PrepareLayoutEvent $event
100   *   The prepare layout event.
101   */
102  public function onAfterPrepareLayout(PrepareLayoutEvent $event) {
103    $section_storage = $event->getSectionStorage();
104    $context = $section_storage->getContextValues();
105
106    if (!empty($context['entity'])) {
107      /** @var \Drupal\Core\Entity\EntityInterface $entity */
108      $entity = $context['entity'];
109
110      // Node 1, 2, or 3: Append a block to the layout.
111      if (in_array($entity->id(), ['1', '2', '3'])) {
112        $section = new Section('layout_onecol');
113        $section->appendComponent(new SectionComponent('fake-uuid', 'content', [
114          'id' => 'static_block_two',
115          'label' => 'Test second static block title',
116          'label_display' => 'visible',
117          'provider' => 'fake_provider',
118        ]));
119        $section_storage->appendSection($section);
120      }
121    }
122  }
123
124}
125