display_builder-1.0.x-dev/modules/display_builder_page_layout/src/EventSubscriber/DisplayBuilderPageDisplayVariantSubscriber.php

modules/display_builder_page_layout/src/EventSubscriber/DisplayBuilderPageDisplayVariantSubscriber.php
<?php

declare(strict_types=1);

namespace Drupal\display_builder_page_layout\EventSubscriber;

use Drupal\Core\Render\PageDisplayVariantSelectionEvent;
use Drupal\Core\Render\RenderEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Drupal should return a display builder page for any non admin route.
 *
 * @code
 * route.name:
 *  ...
 *  options:
 *    _admin_route: true
 *    _display_builder_route: true
 *
 * @endcode
 */
class DisplayBuilderPageDisplayVariantSubscriber implements EventSubscriberInterface {

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents(): array {
    $events = [];
    // @todo check if we need to be sooner.
    $events[RenderEvents::SELECT_PAGE_DISPLAY_VARIANT][] = ['onSelectPageDisplayVariant', -100];

    return $events;
  }

  /**
   * Selects the simple page display variant.
   *
   * @param \Drupal\Core\Render\PageDisplayVariantSelectionEvent $event
   *   The event to process.
   */
  public function onSelectPageDisplayVariant(PageDisplayVariantSelectionEvent $event): void {
    $routeMatch = $event->getRouteMatch();
    $routeObject = $routeMatch->getRouteObject();
    $routeOptions = $routeObject->getOptions();

    // If we are on a display builder page, replace everything with a simple
    // page. Keep compatibility with layout builder.
    $isDisplayBuilderRoute = $routeOptions['_display_builder_route'] ?? FALSE;
    $isLayoutBuilder = $routeOptions['_layout_builder'] ?? FALSE;

    if ($isDisplayBuilderRoute || $isLayoutBuilder) {
      $event->setPluginId('simple_page');

      return;
    }

    $isAdminRoute = $routeOptions['_admin_route'] ?? FALSE;

    if ($isAdminRoute) {
      return;
    }

    // Detect if on a page manager page with display of type full page.
    $isPageDisplayContent = str_contains($routeObject->getDefault('_page_manager_page_variant') ?? '', '-display_builder_page-');

    if ($isPageDisplayContent) {
      $event->setPluginId('simple_page');

      return;
    }

    // Set default to display builder.
    $event->setPluginId('display_builder_page');
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc