component_library-1.0.x-dev/src/EventSubscriber/VariablesPlaceholderView.php

src/EventSubscriber/VariablesPlaceholderView.php
<?php

declare(strict_types=1);

namespace Drupal\component_library\EventSubscriber;

use Drupal\component_library\Event\AddVariablesPlaceholderEvent;
use Drupal\component_library\Event\ReplaceVariablesPlaceholderEvent;
use Drupal\views\ViewExecutable;
use Drupal\views\Views;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Override Mode View variable placeholders.
 */
final class VariablesPlaceholderView implements EventSubscriberInterface {

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents(): array {
    $events = [];
    $events[AddVariablesPlaceholderEvent::class][] = ['onAddVariablesPlaceholder'];
    $events[ReplaceVariablesPlaceholderEvent::class][] = ['onReplaceVariablesPlaceholderEvent'];
    return $events;
  }

  public function onAddVariablesPlaceholder(AddVariablesPlaceholderEvent $event): void {
    $item = $event->getItem();
    // View objects.
    if ($item instanceof ViewExecutable) {
      $event->setPlaceholder([
        '#override_mode' => [
          '#type' => 'override_view_executable',
          '#name' => $item->id(),
          '#display_id' => $item->current_display,
          '#args' => $item->args,
        ],
      ]);
    }
    // View render arrays.
    if (\is_array($item) && isset($item['#type']) && $item['#type'] === 'view') {
      $name = $item['#name'] ?? NULL;
      $display_id = $item['#display_id'] ?? NULL;
      if ($name !== NULL && $display_id !== NULL) {
        $event->setPlaceholder([
          '#override_mode' => [
            '#type' => 'override_view_array',
            '#name' => $name,
            '#display_id' => $display_id,
            '#args' => $item['#arguments'] ?? [],
          ],
        ]);
      }
    }
  }

  public function onReplaceVariablesPlaceholderEvent(ReplaceVariablesPlaceholderEvent $event): void {
    $config = $event->getConfig();
    // View objects.
    if (isset($config['#type']) && $config['#type'] === 'override_view_executable') {
      $view = Views::getView($config['#name']);
      $view->setArguments($config['#args']);
      $view->setDisplay($config['#display_id']);
      $view->initDisplay();
      $view->preExecute();
      $view->execute();
      $event->setReplacement($view);
    }

    // View render arrays.
    if (isset($config['#type']) && $config['#type'] === 'override_view_array') {
      $view = \views_embed_view($config['#name'], $config['#display_id'], ...$config['#args']);
      $event->setReplacement($view);
    }
  }

}

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

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