Commit e725bb52 authored by Luhur Abdi Rizal's avatar Luhur Abdi Rizal
Browse files

Issue #3254473 by el7cosmos: Implements hook_display_variant_plugin_alter

parent f8da4596
Loading
Loading
Loading
Loading
+14 −4
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ use Drupal\core_event_dispatcher\Event\Block\BlockViewAlterEvent;
use Drupal\core_event_dispatcher\Event\Core\CountriesAlterEvent;
use Drupal\core_event_dispatcher\Event\Core\CronEvent;
use Drupal\core_event_dispatcher\Event\Core\DataTypeInfoAlterEvent;
use Drupal\core_event_dispatcher\Event\Core\DisplayVariantPluginAlterEvent;
use Drupal\core_event_dispatcher\Event\Core\MailAlterEvent;
use Drupal\core_event_dispatcher\Event\Core\MailBackendInfoAlterEvent;
use Drupal\core_event_dispatcher\Event\Core\QueueInfoAlterEvent;
@@ -71,7 +72,6 @@ use Drupal\core_event_dispatcher\Event\Language\LanguageSwitchLinksAlterEvent;

// Core.
// @todo hook_mail()
// @todo hook_display_variant_plugin_alter()
// @todo hook_layout_alter()
// @todo hook_cache_flush()
// @todo hook_rebuild()
@@ -209,6 +209,16 @@ function core_event_dispatcher_mail_alter(&$message) {
  $manager->register($event);
}

/**
 * Implements hook_mail_backend_info_alter().
 */
function core_event_dispatcher_mail_backend_info_alter(&$info) {
  /** @var \Drupal\hook_event_dispatcher\Manager\HookEventDispatcherManagerInterface $manager */
  $manager = Drupal::service('hook_event_dispatcher.manager');
  $event = new MailBackendInfoAlterEvent($info);
  $manager->register($event);
}

/**
 * Implements hook_countries_alter().
 */
@@ -220,12 +230,12 @@ function core_event_dispatcher_countries_alter(&$countries) {
}

/**
 * Implements hook_mail_backend_info_alter().
 * Implements hook_display_variant_plugin_alter().
 */
function core_event_dispatcher_mail_backend_info_alter(&$info) {
function core_event_dispatcher_display_variant_plugin_alter(array &$definitions) {
  /** @var \Drupal\hook_event_dispatcher\Manager\HookEventDispatcherManagerInterface $manager */
  $manager = Drupal::service('hook_event_dispatcher.manager');
  $event = new MailBackendInfoAlterEvent($info);
  $event = new DisplayVariantPluginAlterEvent($definitions);
  $manager->register($event);
}

+48 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\core_event_dispatcher\Event\Core;

use Drupal\Component\EventDispatcher\Event;
use Drupal\hook_event_dispatcher\Event\EventInterface;
use Drupal\hook_event_dispatcher\HookEventDispatcherInterface;

/**
 * Class DisplayVariantPluginAlterEvent.
 */
class DisplayVariantPluginAlterEvent extends Event implements EventInterface {

  /**
   * The display variant definitions.
   *
   * @var array
   */
  protected $definitions;

  /**
   * DisplayVariantPluginAlterEvent constructor.
   *
   * @param array $definitions
   *   The array of display variant definitions, keyed by plugin ID.
   */
  public function __construct(array &$definitions) {
    $this->definitions = &$definitions;
  }

  /**
   * Gets the display variant definitions.
   *
   * @return array
   *   The array of display variant definitions, keyed by plugin ID.
   */
  public function &getDefinitions(): array {
    return $this->definitions;
  }

  /**
   * {@inheritdoc}
   */
  public function getDispatcherType(): string {
    return HookEventDispatcherInterface::DISPLAY_VARIANT_PLUGIN_ALTER;
  }

}
+57 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\Tests\core_event_dispatcher\Kernel\Core;

use Drupal\core_event_dispatcher\Event\Core\DisplayVariantPluginAlterEvent;
use Drupal\hook_event_dispatcher\HookEventDispatcherInterface;
use Drupal\KernelTests\KernelTestBase;
use Drupal\Tests\hook_event_dispatcher\Kernel\ListenerTrait;

/**
 * Class DisplayVariantPluginAlterEventTest.
 *
 * @group hook_event_dispatcher
 * @group core_event_dispatcher
 *
 * @see core_event_dispatcher_display_variant_plugin_alter()
 */
class DisplayVariantPluginAlterEventTest extends KernelTestBase {

  use ListenerTrait;

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'hook_event_dispatcher',
    'core_event_dispatcher',
  ];

  /**
   * Tests the DisplayVariantPluginAlterEvent.
   *
   * @throws \Exception
   */
  public function testDisplayVariantPluginAlter(): void {
    $this->listen(HookEventDispatcherInterface::DISPLAY_VARIANT_PLUGIN_ALTER, 'onDisplayVariantPluginAlter');

    $definitions = $this->container->get('plugin.manager.display_variant')->getDefinitions();
    $this->assertEquals('Altered', $definitions['simple_page']['admin_label']);
  }

  /**
   * Callback for DisplayVariantPluginAlterEvent.
   *
   * @param \Drupal\core_event_dispatcher\Event\Core\DisplayVariantPluginAlterEvent $event
   *   The event.
   */
  public function onDisplayVariantPluginAlter(DisplayVariantPluginAlterEvent $event): void {
    $definitions = &$event->getDefinitions();
    $this->assertArrayHasKey('simple_page', $definitions);
    $this->assertArrayHasKey('admin_label', $definitions['simple_page']);
    $this->assertEquals('Simple page', $definitions['simple_page']['admin_label']);

    $definitions['simple_page']['admin_label'] = 'Altered';
  }

}
+14 −0
Original line number Diff line number Diff line
@@ -942,9 +942,23 @@ interface HookEventDispatcherInterface {
   *
   * @see core_event_dispatcher_countries_alter()
   * @see hook_countries_alter()
   *
   * @var string
   */
  public const COUNTRIES_ALTER = self::PREFIX . 'countries.alter';

  /**
   * Alter display variant plugin definitions.
   *
   * @Event
   *
   * @see core_event_dispatcher_display_variant_plugin_alter()
   * @see hook_display_variant_plugin_alter()
   *
   * @var string
   */
  public const DISPLAY_VARIANT_PLUGIN_ALTER = self::PREFIX . 'display_variant.plugin_alter';

  // LANGUAGE EVENTS.
  /**
   * Alter the links generated to switch languages.