Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
50.00% |
1 / 2 |
CRAP | |
78.95% |
15 / 19 |
BlockRepository | |
0.00% |
0 / 1 |
|
50.00% |
1 / 2 |
6.34 | |
78.95% |
15 / 19 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
getVisibleBlocksPerRegion | |
100.00% |
1 / 1 |
5 | |
100.00% |
15 / 15 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\block\BlockRepository. | |
*/ | |
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(), array()); | |
$full = array(); | |
foreach ($this->blockStorage->loadByProperties(array('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; | |
} | |
} |