Version 1
[yaffs-website] / web / core / modules / block / src / BlockRepository.php
diff --git a/web/core/modules/block/src/BlockRepository.php b/web/core/modules/block/src/BlockRepository.php
new file mode 100644 (file)
index 0000000..4cdd710
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+
+namespace Drupal\block;
+
+use Drupal\Core\Cache\CacheableMetadata;
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Plugin\Context\ContextHandlerInterface;
+use Drupal\Core\Theme\ThemeManagerInterface;
+
+/**
+ * Provides a repository for Block config entities.
+ */
+class BlockRepository implements BlockRepositoryInterface {
+
+  /**
+   * The block storage.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $blockStorage;
+
+  /**
+   * The theme manager.
+   *
+   * @var \Drupal\Core\Theme\ThemeManagerInterface
+   */
+  protected $themeManager;
+
+  /**
+   * Constructs a new BlockRepository.
+   *
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager.
+   * @param \Drupal\Core\Theme\ThemeManagerInterface $theme_manager
+   *   The theme manager.
+   * @param \Drupal\Core\Plugin\Context\ContextHandlerInterface $context_handler
+   *   The plugin context handler.
+   */
+  public function __construct(EntityManagerInterface $entity_manager, ThemeManagerInterface $theme_manager, ContextHandlerInterface $context_handler) {
+    $this->blockStorage = $entity_manager->getStorage('block');
+    $this->themeManager = $theme_manager;
+    $this->contextHandler = $context_handler;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getVisibleBlocksPerRegion(array &$cacheable_metadata = []) {
+    $active_theme = $this->themeManager->getActiveTheme();
+    // Build an array of the region names in the right order.
+    $empty = array_fill_keys($active_theme->getRegions(), []);
+
+    $full = [];
+    foreach ($this->blockStorage->loadByProperties(['theme' => $active_theme->getName()]) as $block_id => $block) {
+      /** @var \Drupal\block\BlockInterface $block */
+      $access = $block->access('view', NULL, TRUE);
+      $region = $block->getRegion();
+      if (!isset($cacheable_metadata[$region])) {
+        $cacheable_metadata[$region] = CacheableMetadata::createFromObject($access);
+      }
+      else {
+        $cacheable_metadata[$region] = $cacheable_metadata[$region]->merge(CacheableMetadata::createFromObject($access));
+      }
+
+      // Set the contexts on the block before checking access.
+      if ($access->isAllowed()) {
+        $full[$region][$block_id] = $block;
+      }
+    }
+
+    // Merge it with the actual values to maintain the region ordering.
+    $assignments = array_intersect_key(array_merge($empty, $full), $empty);
+    foreach ($assignments as &$assignment) {
+      // Suppress errors because PHPUnit will indirectly modify the contents,
+      // triggering https://bugs.php.net/bug.php?id=50688.
+      @uasort($assignment, 'Drupal\block\Entity\Block::sort');
+    }
+    return $assignments;
+  }
+
+}