You are here

public function TwigExtension::drupalRegion in Twig Tweak 8.2

Same name and namespace in other branches
  1. 8 src/TwigExtension.php \Drupal\twig_tweak\TwigExtension::drupalRegion()

Builds the render array of a given region.

Parameters

string $region: The region to build.

string $theme: (optional) The name of the theme to load the region. If it is not provided then default theme will be used.

Return value

array A render array to display the region content.

File

src/TwigExtension.php, line 522

Class

TwigExtension
Twig extension with some useful functions and filters.

Namespace

Drupal\twig_tweak

Code

public function drupalRegion($region, $theme = NULL) {
  $entity_type_manager = \Drupal::entityTypeManager();
  $blocks = $entity_type_manager
    ->getStorage('block')
    ->loadByProperties([
    'region' => $region,
    'theme' => $theme ?: \Drupal::config('system.theme')
      ->get('default'),
  ]);
  $view_builder = $entity_type_manager
    ->getViewBuilder('block');
  $build = [];
  $entity_type = $entity_type_manager
    ->getDefinition('block');
  $cache_metadata = (new CacheableMetadata())
    ->addCacheTags($entity_type
    ->getListCacheTags())
    ->addCacheContexts($entity_type
    ->getListCacheContexts());

  /** @var \Drupal\block\BlockInterface[] $blocks */
  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 = \Drupal::request();
        if ($route = $request->attributes
          ->get(RouteObjectInterface::ROUTE_OBJECT)) {
          $block_plugin
            ->setTitle(\Drupal::service('title_resolver')
            ->getTitle($request, $route));
        }
      }
      $build[$id] = $view_builder
        ->view($block);
    }
  }
  if ($build) {
    $build['#region'] = $region;
    $build['#theme_wrappers'] = [
      'region',
    ];
  }
  $cache_metadata
    ->applyTo($build);
  return $build;
}