You are here

public function ContextReactionBlocksController::blocksLibrary in Context 8

Same name and namespace in other branches
  1. 8.4 src/Reaction/Blocks/Controller/ContextReactionBlocksController.php \Drupal\context\Reaction\Blocks\Controller\ContextReactionBlocksController::blocksLibrary()
  2. 8.0 src/Reaction/Blocks/Controller/ContextReactionBlocksController.php \Drupal\context\Reaction\Blocks\Controller\ContextReactionBlocksController::blocksLibrary()

Display a library of blocks that can be added to the context reaction.

Parameters

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

\Drupal\context\ContextInterface $context: The context the blocks reaction belongs to.

string $reaction_id: The ID of the blocks reaction that the selected block should be added to.

Return value

array

1 string reference to 'ContextReactionBlocksController::blocksLibrary'
context_ui.routing.yml in modules/context_ui/context_ui.routing.yml
modules/context_ui/context_ui.routing.yml

File

src/Reaction/Blocks/Controller/ContextReactionBlocksController.php, line 88

Class

ContextReactionBlocksController

Namespace

Drupal\context\Reaction\Blocks\Controller

Code

public function blocksLibrary(Request $request, ContextInterface $context, $reaction_id) {

  // If a theme has been defined in the query string then use this for
  // the add block link, default back to the default theme.
  $theme = $request->query
    ->get('theme', $this->themeHandler
    ->getDefault());

  // Only add blocks which work without any available context.
  $blocks = $this->blockManager
    ->getDefinitionsForContexts($this->contextRepository
    ->getAvailableContexts());

  // Order by category, and then by admin label.
  $blocks = $this->blockManager
    ->getSortedDefinitions($blocks);
  $build['filter'] = [
    '#type' => 'search',
    '#title' => $this
      ->t('Filter'),
    '#title_display' => 'invisible',
    '#size' => 30,
    '#placeholder' => $this
      ->t('Filter by block name'),
    '#attributes' => [
      'class' => [
        'context-table-filter',
      ],
      'data-element' => '.block-add-table',
      'title' => $this
        ->t('Enter a part of the block name to filter by.'),
    ],
  ];
  $headers = [
    $this
      ->t('Block'),
    $this
      ->t('Category'),
    $this
      ->t('Operations'),
  ];
  $build['blocks'] = [
    '#type' => 'table',
    '#header' => $headers,
    '#rows' => [],
    '#empty' => $this
      ->t('No blocks available.'),
    '#attributes' => [
      'class' => [
        'block-add-table',
      ],
    ],
  ];

  // Add each block definition to the table.
  foreach ($blocks as $block_id => $block) {
    $links = [
      'add' => [
        'title' => $this
          ->t('Place block'),
        'url' => Url::fromRoute('context.reaction.blocks.block_add', [
          'context' => $context
            ->id(),
          'reaction_id' => $reaction_id,
          'block_id' => $block_id,
        ], [
          'query' => [
            'theme' => $theme,
          ],
        ]),
        'attributes' => [
          'class' => [
            'use-ajax',
          ],
          'data-dialog-type' => 'modal',
          'data-dialog-options' => Json::encode([
            'width' => 700,
          ]),
        ],
      ],
    ];
    $build['blocks']['#rows'][] = [
      'title' => [
        'data' => [
          '#type' => 'inline_template',
          '#template' => '<div class="context-table-filter-text-source">{{ label }}</div>',
          '#context' => [
            'label' => $block['admin_label'],
          ],
        ],
      ],
      'category' => [
        'data' => $block['category'],
      ],
      'operations' => [
        'data' => [
          '#type' => 'operations',
          '#links' => $links,
        ],
      ],
    ];
  }
  $build['#attached']['library'][] = 'context_ui/admin';
  return $build;
}