google_tag-8.x-1.x-dev/src/EventCollector.php

src/EventCollector.php
<?php

declare(strict_types=1);

namespace Drupal\google_tag;

use Drupal\google_tag\Plugin\GoogleTag\Event\GoogleTagEventInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;

/**
 * Event collector service.
 */
final class EventCollector implements EventCollectorInterface {

  /**
   * Events list.
   *
   * @phpstan-var array<int, \Drupal\google_tag\Plugin\GoogleTag\Event\GoogleTagEventInterface>
   */
  private array $events = [];

  /**
   * Google Tag Event Service.
   *
   * @var \Drupal\google_tag\GoogleTagEventManager
   */
  private GoogleTagEventManager $googleTagEventManager;

  /**
   * The Tag Container Resolver.
   *
   * @var \Drupal\google_tag\TagContainerResolver
   */
  private TagContainerResolver $tagResolver;

  /**
   * Session service.
   *
   * @var \Symfony\Component\HttpFoundation\Session\SessionInterface
   */
  private SessionInterface $session;

  /**
   * Collector constructor.
   *
   * @param \Drupal\google_tag\GoogleTagEventManager $googleTagEventManager
   *   Event plugin manager.
   * @param \Drupal\google_tag\TagContainerResolver $tagResolver
   *   Tag resolver service.
   * @param \Symfony\Component\HttpFoundation\Session\SessionInterface $session
   *   Session service.
   */
  public function __construct(GoogleTagEventManager $googleTagEventManager, TagContainerResolver $tagResolver, SessionInterface $session) {
    $this->googleTagEventManager = $googleTagEventManager;
    $this->tagResolver = $tagResolver;
    $this->session = $session;
  }

  /**
   * {@inheritDoc}
   *
   * @throws \Drupal\Component\Plugin\Exception\ContextException
   * @throws \Drupal\Component\Plugin\Exception\PluginException
   */
  public function addEvent(string $name, array $contexts = []): void {
    $event = $this->createEventInstance($name, $contexts);
    if ($event === NULL) {
      return;
    }

    $this->events[] = $event;
  }

  /**
   * {@inheritDoc}
   *
   * @throws \Drupal\Component\Plugin\Exception\ContextException
   * @throws \Drupal\Component\Plugin\Exception\PluginException
   */
  public function addDelayedEvent(string $name, array $contexts = []): void {
    $event = $this->createEventInstance($name, $contexts);
    if ($event === NULL) {
      return;
    }

    $delayed_events = $this->session->get('google_tag_events', []);
    $delayed_events[] = $event;
    $this->session->set('google_tag_events', $delayed_events);
  }

  /**
   * {@inheritDoc}
   */
  public function getEvents(): array {
    $events = $this->events;
    $this->events = [];
    $delayed_events = $this->session->get('google_tag_events', []);
    if ($delayed_events !== []) {
      $this->session->set('google_tag_events', []);
    }
    return array_merge($delayed_events, $events);
  }

  /**
   * Instantiates an event plugin.
   *
   * @param string $name
   *   Event name.
   * @param array $contexts
   *   Event plugin context.
   *
   * @return \Drupal\google_tag\Plugin\GoogleTag\Event\GoogleTagEventInterface|null
   *   Event plugin if configured, otherwise null.
   *
   * @throws \Drupal\Component\Plugin\Exception\ContextException
   * @throws \Drupal\Component\Plugin\Exception\PluginException
   */
  private function createEventInstance(string $name, array $contexts = []): ?GoogleTagEventInterface {
    $config = $this->tagResolver->resolve();
    if ($config === NULL || !$config->hasEvent($name)) {
      return NULL;
    }

    $event = $this->googleTagEventManager->createInstance(
      $name,
      $config->getEventConfiguration($name),
    );
    assert($event instanceof GoogleTagEventInterface);
    foreach ($contexts as $id => $context) {
      $event->setContextValue($id, $context);
    }
    return $event;
  }

}

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

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