function BlockLibraryController::listBlocks

Same name and namespace in other branches
  1. 8.9.x core/modules/block/src/Controller/BlockLibraryController.php \Drupal\block\Controller\BlockLibraryController::listBlocks()
  2. 10 core/modules/block/src/Controller/BlockLibraryController.php \Drupal\block\Controller\BlockLibraryController::listBlocks()
  3. 11.x core/modules/block/src/Controller/BlockLibraryController.php \Drupal\block\Controller\BlockLibraryController::listBlocks()

Shows a list of blocks that can be added to a theme's layout.

Parameters

\Symfony\Component\HttpFoundation\Request $request: The current request.

string $theme: Theme key of the block list.

Return value

array A render array as expected by the renderer.

1 string reference to 'BlockLibraryController::listBlocks'
block.routing.yml in core/modules/block/block.routing.yml
core/modules/block/block.routing.yml

File

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

Class

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

Namespace

Drupal\block\Controller

Code

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;
}

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