class BlockLibraryController

Same name in other branches
  1. 8.9.x core/modules/block/src/Controller/BlockLibraryController.php \Drupal\block\Controller\BlockLibraryController
  2. 10 core/modules/block/src/Controller/BlockLibraryController.php \Drupal\block\Controller\BlockLibraryController
  3. 11.x core/modules/block/src/Controller/BlockLibraryController.php \Drupal\block\Controller\BlockLibraryController

Provides a list of block plugins to be added to the layout.

Hierarchy

Expanded class hierarchy of BlockLibraryController

File

core/modules/block/src/Controller/BlockLibraryController.php, line 19

Namespace

Drupal\block\Controller
View source
class BlockLibraryController extends ControllerBase {
    
    /**
     * The block manager.
     *
     * @var \Drupal\Core\Block\BlockManagerInterface
     */
    protected $blockManager;
    
    /**
     * The context repository.
     *
     * @var \Drupal\Core\Plugin\Context\LazyContextRepository
     */
    protected $contextRepository;
    
    /**
     * The route match.
     *
     * @var \Drupal\Core\Routing\RouteMatchInterface
     */
    protected $routeMatch;
    
    /**
     * The local action manager.
     *
     * @var \Drupal\Core\Menu\LocalActionManagerInterface
     */
    protected $localActionManager;
    
    /**
     * Constructs a BlockLibraryController object.
     *
     * @param \Drupal\Core\Block\BlockManagerInterface $block_manager
     *   The block manager.
     * @param \Drupal\Core\Plugin\Context\LazyContextRepository $context_repository
     *   The context repository.
     * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
     *   The current route match.
     * @param \Drupal\Core\Menu\LocalActionManagerInterface $local_action_manager
     *   The local action manager.
     */
    public function __construct(BlockManagerInterface $block_manager, LazyContextRepository $context_repository, RouteMatchInterface $route_match, LocalActionManagerInterface $local_action_manager) {
        $this->blockManager = $block_manager;
        $this->routeMatch = $route_match;
        $this->localActionManager = $local_action_manager;
        $this->contextRepository = $context_repository;
    }
    
    /**
     * {@inheritdoc}
     */
    public static function create(ContainerInterface $container) {
        return new static($container->get('plugin.manager.block'), $container->get('context.repository'), $container->get('current_route_match'), $container->get('plugin.manager.menu.local_action'));
    }
    
    /**
     * Shows a list of blocks that can be added to a theme's layout.
     *
     * @param \Symfony\Component\HttpFoundation\Request $request
     *   The current request.
     * @param string $theme
     *   Theme key of the block list.
     *
     * @return array
     *   A render array as expected by the renderer.
     */
    public function listBlocks(Request $request, $theme) {
        // Since modals do not render any other part of the page, we need to render
        // them manually as part of this listing.
        if ($request->query
            ->get(MainContentViewSubscriber::WRAPPER_FORMAT) === 'drupal_modal') {
            $build['local_actions'] = $this->buildLocalActions();
        }
        $headers = [
            [
                'data' => $this->t('Block'),
            ],
            [
                'data' => $this->t('Category'),
            ],
            [
                'data' => $this->t('Operations'),
            ],
        ];
        $region = $request->query
            ->get('region');
        $weight = $request->query
            ->get('weight');
        // Only add blocks which work without any available context.
        $definitions = $this->blockManager
            ->getFilteredDefinitions('block_ui', $this->contextRepository
            ->getAvailableContexts(), [
            'theme' => $theme,
            'region' => $region,
        ]);
        // Order by category, and then by admin label.
        $definitions = $this->blockManager
            ->getSortedDefinitions($definitions);
        // Filter out definitions that are not intended to be placed by the UI.
        $definitions = array_filter($definitions, function (array $definition) {
            return empty($definition['_block_ui_hidden']);
        });
        $rows = [];
        foreach ($definitions as $plugin_id => $plugin_definition) {
            $row = [];
            $row['title']['data'] = [
                '#type' => 'inline_template',
                '#template' => '<div class="block-filter-text-source">{{ label }}</div>',
                '#context' => [
                    'label' => $plugin_definition['admin_label'],
                ],
            ];
            $row['category']['data'] = $plugin_definition['category'];
            $links['add'] = [
                'title' => $this->t('Place block'),
                'url' => Url::fromRoute('block.admin_add', [
                    'plugin_id' => $plugin_id,
                    'theme' => $theme,
                ]),
                'attributes' => [
                    'class' => [
                        'use-ajax',
                    ],
                    'data-dialog-type' => 'modal',
                    'data-dialog-options' => Json::encode([
                        'width' => 700,
                    ]),
                ],
            ];
            if ($region) {
                $links['add']['query']['region'] = $region;
            }
            if (isset($weight)) {
                $links['add']['query']['weight'] = $weight;
            }
            $row['operations']['data'] = [
                '#type' => 'operations',
                '#links' => $links,
            ];
            $rows[] = $row;
        }
        $build['#attached']['library'][] = 'block/drupal.block.admin';
        $build['filter'] = [
            '#type' => 'search',
            '#title' => $this->t('Filter'),
            '#title_display' => 'invisible',
            '#size' => 30,
            '#placeholder' => $this->t('Filter by block name'),
            '#attributes' => [
                'class' => [
                    'block-filter-text',
                ],
                'data-element' => '.block-add-table',
                'title' => $this->t('Enter a part of the block name to filter by.'),
            ],
        ];
        $build['blocks'] = [
            '#type' => 'table',
            '#header' => $headers,
            '#rows' => $rows,
            '#empty' => $this->t('No blocks available.'),
            '#attributes' => [
                'class' => [
                    'block-add-table',
                ],
            ],
        ];
        return $build;
    }
    
    /**
     * Builds the local actions for this listing.
     *
     * @return array
     *   An array of local actions for this listing.
     */
    protected function buildLocalActions() {
        $build = $this->localActionManager
            ->getActionsForRoute($this->routeMatch
            ->getRouteName());
        // Without this workaround, the action links will be rendered as <li> with
        // no wrapping <ul> element.
        if (!empty($build)) {
            $build['#prefix'] = '<ul class="action-links">';
            $build['#suffix'] = '</ul>';
        }
        return $build;
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title Overrides
BlockLibraryController::$blockManager protected property The block manager.
BlockLibraryController::$contextRepository protected property The context repository.
BlockLibraryController::$localActionManager protected property The local action manager.
BlockLibraryController::$routeMatch protected property The route match.
BlockLibraryController::buildLocalActions protected function Builds the local actions for this listing.
BlockLibraryController::create public static function Instantiates a new instance of this class. Overrides ControllerBase::create
BlockLibraryController::listBlocks public function Shows a list of blocks that can be added to a theme&#039;s layout.
BlockLibraryController::__construct public function Constructs a BlockLibraryController object.
ControllerBase::$configFactory protected property The configuration factory.
ControllerBase::$currentUser protected property The current user service. 3
ControllerBase::$entityFormBuilder protected property The entity form builder.
ControllerBase::$entityTypeManager protected property The entity type manager.
ControllerBase::$formBuilder protected property The form builder. 1
ControllerBase::$keyValue protected property The key-value storage. 1
ControllerBase::$languageManager protected property The language manager. 1
ControllerBase::$moduleHandler protected property The module handler. 1
ControllerBase::$stateService protected property The state service.
ControllerBase::cache protected function Returns the requested cache bin.
ControllerBase::config protected function Retrieves a configuration object.
ControllerBase::container private function Returns the service container.
ControllerBase::currentUser protected function Returns the current user. 3
ControllerBase::entityFormBuilder protected function Retrieves the entity form builder.
ControllerBase::entityTypeManager protected function Retrieves the entity type manager.
ControllerBase::formBuilder protected function Returns the form builder service. 1
ControllerBase::keyValue protected function Returns a key/value storage collection. 1
ControllerBase::languageManager protected function Returns the language manager service. 1
ControllerBase::moduleHandler protected function Returns the module handler. 1
ControllerBase::redirect protected function Returns a redirect response object for the specified route.
ControllerBase::state protected function Returns the state storage service.
LoggerChannelTrait::$loggerFactory protected property The logger channel factory service.
LoggerChannelTrait::getLogger protected function Gets the logger for a specific channel.
LoggerChannelTrait::setLoggerFactory public function Injects the logger channel factory.
MessengerTrait::$messenger protected property The messenger. 17
MessengerTrait::messenger public function Gets the messenger. 17
MessengerTrait::setMessenger public function Sets the messenger.
RedirectDestinationTrait::$redirectDestination protected property The redirect destination service. 1
RedirectDestinationTrait::getDestinationArray protected function Prepares a &#039;destination&#039; URL query parameter for use with \Drupal\Core\Url.
RedirectDestinationTrait::getRedirectDestination protected function Returns the redirect destination service.
RedirectDestinationTrait::setRedirectDestination public function Sets the redirect destination service.
StringTranslationTrait::$stringTranslation protected property The string translation service. 3
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.