display_builder-1.0.x-dev/modules/display_builder_views/src/EventSubscriber/DisplayBuilderViewsLayoutEventsSubscriber.php

modules/display_builder_views/src/EventSubscriber/DisplayBuilderViewsLayoutEventsSubscriber.php
<?php

declare(strict_types=1);

namespace Drupal\display_builder_views\EventSubscriber;

use Drupal\display_builder\Event\DisplayBuilderEvent;
use Drupal\display_builder\Event\DisplayBuilderEvents;
use Drupal\display_builder\StateManager\StateManagerInterface;
use Drupal\display_builder_views\DisplayBuilderViewsManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * The event subscriber for display builder views.
 */
class DisplayBuilderViewsLayoutEventsSubscriber implements EventSubscriberInterface {

  public function __construct(
    private StateManagerInterface $stateManager,
  ) {}

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents(): array {
    return [
      DisplayBuilderEvents::ON_SAVE => 'onSave',
    ];
  }

  /**
   * Event handler for when a display builder is saved.
   *
   * @param \Drupal\display_builder\Event\DisplayBuilderEvent $event
   *   The event object.
   */
  public function onSave(DisplayBuilderEvent $event): void {
    $builder_id = $event->getBuilderId();
    $contexts = $event->getData();

    if (!$this->stateManager->hasSaveContextsRequirement($builder_id, DisplayBuilderViewsManager::VIEWS_CONTEXT_REQUIREMENT, $contexts)) {
      return;
    }

    /** @var \Drupal\views\Entity\View $view */
    $view = $contexts['ui_patterns_views:view_entity']->getContextValue() ?? NULL;

    if (!$view) {
      return;
    }

    $builder_data = $this->stateManager->getCurrentState($builder_id);

    foreach ($view->get('display') as $display_id => $display) {
      if (!isset($display['display_options']['display_extenders']['display_builder']['display_builder_id'])) {
        continue;
      }

      $display_builder_id = $display['display_options']['display_extenders']['display_builder']['display_builder_id'];

      if ($display_builder_id !== $builder_id) {
        continue;
      }

      $display = &$view->getDisplay($display_id);
      $display['display_options']['display_extenders']['display_builder']['sources'] = $builder_data;
      $view->save();

      $view->invalidateCaches();

      // Seems invalidate is not enough, clear views cache, but again seems not
      // enough as we have a Page not found.
      // @todo find a way to clear only views cache.
      // views_invalidate_cache();
      drupal_flush_all_caches();

      continue;
    }
  }

}

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

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