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