You are here

class SimpleBlockAddControllerSubscriber in Simple Block 8

Alters the render array of Layout Builder ChooseBlockController::build().

The Layout Builder module considers the Drupal core 'block_content' module, the only block factory in this universe and hardcodes the 'Add custom block' link, without giving a chance to a 3rd-party to add their own 'Add block' link. For this reason we're listening to KernelEvents::VIEW event, intercept the render array produced by ChooseBlockController::build() and add our link.

Hierarchy

Expanded class hierarchy of SimpleBlockAddControllerSubscriber

See also

https://www.drupal.org/project/drupal/issues/3206770

\Drupal\layout_builder\Controller\ChooseBlockController::build()

1 string reference to 'SimpleBlockAddControllerSubscriber'
simple_block_layout_builder.services.yml in modules/simple_block_layout_builder/simple_block_layout_builder.services.yml
modules/simple_block_layout_builder/simple_block_layout_builder.services.yml
1 service uses SimpleBlockAddControllerSubscriber
simple_block_layout_builder.controller_alter in modules/simple_block_layout_builder/simple_block_layout_builder.services.yml
Drupal\simple_block_layout_builder\Event\Subscriber\SimpleBlockAddControllerSubscriber

File

modules/simple_block_layout_builder/src/Event/Subscriber/SimpleBlockAddControllerSubscriber.php, line 28

Namespace

Drupal\simple_block_layout_builder\Event\Subscriber
View source
class SimpleBlockAddControllerSubscriber implements EventSubscriberInterface {
  use AjaxHelperTrait;
  use StringTranslationTrait;

  /**
   * Current route match service.
   *
   * @var \Drupal\Core\Routing\ResettableStackedRouteMatchInterface
   */
  protected $routeMatch;

  /**
   * The current user.
   *
   * @var \Drupal\Core\Session\AccountInterface
   */
  protected $currentUser;

  /**
   * Constructs a new event subscriber service instance.
   *
   * @param \Drupal\Core\Routing\ResettableStackedRouteMatchInterface $route_match
   *   Current route match service.
   * @param \Drupal\Core\Session\AccountInterface $current_user
   *   The current user.
   */
  public function __construct(ResettableStackedRouteMatchInterface $route_match, AccountInterface $current_user) {
    $this->routeMatch = $route_match;
    $this->currentUser = $current_user;
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() : array {
    return [
      KernelEvents::VIEW => [
        [
          'alterBuild',
          50,
        ],
      ],
    ];
  }

  /**
   * Alters the build produced by ChooseBlockController::build().
   *
   * @param \Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent $event
   *   The kernel view event.
   */
  public function alterBuild(GetResponseForControllerResultEvent $event) : void {
    $route_name = $event
      ->getRequest()->attributes
      ->get('_route');
    if ($route_name !== 'layout_builder.choose_block') {
      return;
    }
    $original_build = $event
      ->getControllerResult();
    if (is_array($original_build)) {
      $section_storage = $this->routeMatch
        ->getParameter('section_storage');
      if (!$section_storage instanceof SectionStorageInterface) {
        throw new \InvalidArgumentException("Parameter 'section_storage' should implement \\Drupal\\layout_builder\\SectionStorageInterface");
      }
      $build = [];

      // Always keep 'add_block' on top, if exists.
      if (isset($original_build['add_block'])) {
        $build['add_block'] = $original_build['add_block'];
        unset($original_build['add_block']);
      }
      $build['add_simple_block'] = [
        '#type' => 'link',
        '#title' => $this
          ->t('Create simple block'),
        '#url' => Url::fromRoute('simple_block_layout_builder.edit_block', [
          'section_storage_type' => $section_storage
            ->getStorageType(),
          'section_storage' => $section_storage
            ->getStorageId(),
          'delta' => $this->routeMatch
            ->getParameter('delta'),
          'region' => $this->routeMatch
            ->getParameter('region'),
          'uuid' => NULL,
          'simple_block' => NULL,
        ]),
        '#attributes' => $this
          ->getAttributes(),
        '#access' => $this->currentUser
          ->hasPermission('administer blocks'),
      ];
      $event
        ->setControllerResult($build + $original_build);
    }
  }

  /**
   * Get links attributes.
   *
   * @return array
   *   The attributes array.
   */
  protected function getAttributes() : array {
    $attributes = [
      'class' => [
        'inline-block-create-button',
      ],
    ];
    if ($this
      ->isAjax()) {
      $attributes = NestedArray::mergeDeep($attributes, [
        'class' => [
          'use-ajax',
        ],
        'data-dialog-type' => 'dialog',
        'data-dialog-renderer' => 'off_canvas',
      ]);
    }
    return $attributes;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
AjaxHelperTrait::getRequestWrapperFormat protected function Gets the wrapper format of the current request.
AjaxHelperTrait::isAjax protected function Determines if the current request is via AJAX.
SimpleBlockAddControllerSubscriber::$currentUser protected property The current user.
SimpleBlockAddControllerSubscriber::$routeMatch protected property Current route match service.
SimpleBlockAddControllerSubscriber::alterBuild public function Alters the build produced by ChooseBlockController::build().
SimpleBlockAddControllerSubscriber::getAttributes protected function Get links attributes.
SimpleBlockAddControllerSubscriber::getSubscribedEvents public static function Returns an array of event names this subscriber wants to listen to.
SimpleBlockAddControllerSubscriber::__construct public function Constructs a new event subscriber service instance.
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
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.