comparison core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php @ 14:1fec387a4317

Update Drupal core to 8.5.2 via Composer
author Chris Cannam
date Mon, 23 Apr 2018 09:46:53 +0100
parents
children 129ea1e6d783
comparison
equal deleted inserted replaced
13:5fb285c0d0e3 14:1fec387a4317
1 <?php
2
3 namespace Drupal\layout_builder\EventSubscriber;
4
5 use Drupal\Core\Access\AccessResult;
6 use Drupal\Core\Block\BlockPluginInterface;
7 use Drupal\Core\Session\AccountInterface;
8 use Drupal\layout_builder\Event\SectionComponentBuildRenderArrayEvent;
9 use Drupal\layout_builder\LayoutBuilderEvents;
10 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
11
12 /**
13 * Builds render arrays and handles access for all block components.
14 *
15 * @internal
16 * Layout Builder is currently experimental and should only be leveraged by
17 * experimental modules and development releases of contributed modules.
18 * See https://www.drupal.org/core/experimental for more information.
19 */
20 class BlockComponentRenderArray implements EventSubscriberInterface {
21
22 /**
23 * The current user.
24 *
25 * @var \Drupal\Core\Session\AccountInterface
26 */
27 protected $currentUser;
28
29 /**
30 * Creates a BlockComponentRenderArray object.
31 *
32 * @param \Drupal\Core\Session\AccountInterface $current_user
33 * The current user.
34 */
35 public function __construct(AccountInterface $current_user) {
36 $this->currentUser = $current_user;
37 }
38
39 /**
40 * {@inheritdoc}
41 */
42 public static function getSubscribedEvents() {
43 $events[LayoutBuilderEvents::SECTION_COMPONENT_BUILD_RENDER_ARRAY] = ['onBuildRender', 100];
44 return $events;
45 }
46
47 /**
48 * Builds render arrays for block plugins and sets it on the event.
49 *
50 * @param \Drupal\layout_builder\Event\SectionComponentBuildRenderArrayEvent $event
51 * The section component render event.
52 */
53 public function onBuildRender(SectionComponentBuildRenderArrayEvent $event) {
54 $block = $event->getPlugin();
55 if (!$block instanceof BlockPluginInterface) {
56 return;
57 }
58
59 // Only check access if the component is not being previewed.
60 if ($event->inPreview()) {
61 $access = AccessResult::allowed()->setCacheMaxAge(0);
62 }
63 else {
64 $access = $block->access($this->currentUser, TRUE);
65 }
66
67 $event->addCacheableDependency($access);
68 if ($access->isAllowed()) {
69 $event->addCacheableDependency($block);
70
71 $build = [
72 // @todo Move this to BlockBase in https://www.drupal.org/node/2931040.
73 '#theme' => 'block',
74 '#configuration' => $block->getConfiguration(),
75 '#plugin_id' => $block->getPluginId(),
76 '#base_plugin_id' => $block->getBaseId(),
77 '#derivative_plugin_id' => $block->getDerivativeId(),
78 '#weight' => $event->getComponent()->getWeight(),
79 'content' => $block->build(),
80 ];
81 $event->setBuild($build);
82 }
83 }
84
85 }