For more information about this repository, visit the project page at https://www.drupal.org/project/twig_tweak
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.0 KiB
111 lines
3.0 KiB
<?php |
|
|
|
namespace Drupal\twig_tweak\View; |
|
|
|
use Drupal\Core\Block\TitleBlockPluginInterface; |
|
use Drupal\Core\Cache\CacheableMetadata; |
|
use Drupal\Core\Config\ConfigFactoryInterface; |
|
use Drupal\Core\Controller\TitleResolverInterface; |
|
use Drupal\Core\Entity\EntityTypeManagerInterface; |
|
use Symfony\Cmf\Component\Routing\RouteObjectInterface; |
|
use Symfony\Component\HttpFoundation\RequestStack; |
|
|
|
/** |
|
* RegionViewBuilder service. |
|
*/ |
|
class RegionViewBuilder { |
|
|
|
/** |
|
* The entity type manager. |
|
* |
|
* @var \Drupal\Core\Entity\EntityTypeManagerInterface |
|
*/ |
|
protected $entityTypeManager; |
|
|
|
/** |
|
* The config factory. |
|
* |
|
* @var \Drupal\Core\Config\ConfigFactoryInterface |
|
*/ |
|
protected $configFactory; |
|
|
|
/** |
|
* The request stack. |
|
* |
|
* @var \Symfony\Component\HttpFoundation\RequestStack |
|
*/ |
|
protected $requestStack; |
|
|
|
/** |
|
* The title resolver. |
|
* |
|
* @var \Drupal\Core\Controller\TitleResolverInterface |
|
*/ |
|
protected $titleResolver; |
|
|
|
/** |
|
* Constructs a RegionViewBuilder object. |
|
*/ |
|
public function __construct( |
|
EntityTypeManagerInterface $entity_type_manager, |
|
ConfigFactoryInterface $config_factory, |
|
RequestStack $request_stack, |
|
TitleResolverInterface $title_resolver |
|
) { |
|
$this->entityTypeManager = $entity_type_manager; |
|
$this->configFactory = $config_factory; |
|
$this->requestStack = $request_stack; |
|
$this->titleResolver = $title_resolver; |
|
} |
|
|
|
/** |
|
* Builds the render array of a given region. |
|
* |
|
* @param string $region |
|
* The region to build. |
|
* @param string $theme |
|
* (optional) The name of the theme to load the region. If it is not |
|
* provided then default theme will be used. |
|
* |
|
* @return array |
|
* A render array to display the region content. |
|
*/ |
|
public function build(string $region, string $theme = NULL): array { |
|
|
|
$blocks = $this->entityTypeManager->getStorage('block')->loadByProperties([ |
|
'region' => $region, |
|
'theme' => $theme ?: $this->configFactory->get('system.theme')->get('default'), |
|
]); |
|
|
|
$view_builder = $this->entityTypeManager->getViewBuilder('block'); |
|
|
|
$build = []; |
|
|
|
$cache_metadata = new CacheableMetadata(); |
|
|
|
/* @var $blocks \Drupal\block\BlockInterface[] */ |
|
foreach ($blocks as $id => $block) { |
|
$access = $block->access('view', NULL, TRUE); |
|
$cache_metadata = $cache_metadata->merge(CacheableMetadata::createFromObject($access)); |
|
if ($access->isAllowed()) { |
|
$block_plugin = $block->getPlugin(); |
|
if ($block_plugin instanceof TitleBlockPluginInterface) { |
|
$request = $this->requestStack->getCurrentRequest(); |
|
if ($route = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT)) { |
|
$block_plugin->setTitle($this->titleResolver->getTitle($request, $route)); |
|
} |
|
} |
|
$build[$id] = $view_builder->view($block); |
|
} |
|
} |
|
|
|
if ($build) { |
|
$build['#region'] = $region; |
|
$build['#theme_wrappers'] = ['region']; |
|
$cache_metadata->applyTo($build); |
|
} |
|
|
|
return $build; |
|
} |
|
|
|
}
|
|
|