google_tag-8.x-1.x-dev/src/Entity/TagContainer.php
src/Entity/TagContainer.php
<?php namespace Drupal\google_tag\Entity; use Drupal\Core\Cache\Cache; use Drupal\Core\Condition\ConditionInterface; use Drupal\Core\Condition\ConditionPluginCollection; use Drupal\Core\Config\Entity\ConfigEntityBase; use Drupal\Core\Entity\EntityWithPluginCollectionInterface; use Drupal\Core\Messenger\MessengerTrait; use Drupal\Core\StringTranslation\StringTranslationTrait; /** * Defines the Google Tag configuration entity. * * @ConfigEntityType( * id = "google_tag_container", * label = @Translation("Google Tag Container"), * label_singular = @Translation("container"), * label_plural = @Translation("containers"), * label_collection = @Translation("Google Tag containers"), * handlers = { * "list_builder" = "Drupal\google_tag\TagContainerListBuilder", * "form" = { * "default" = "Drupal\google_tag\Form\TagContainerForm", * "delete" = "Drupal\Core\Entity\EntityDeleteForm" * }, * }, * admin_permission = "administer google_tag_container", * config_prefix = "container", * entity_keys = { * "id" = "id", * "label" = "label", * "status" = "status" * }, * config_export = { * "id", * "label", * "status", * "weight", * "tag_container_ids", * "advanced_settings", * "dimensions_metrics", * "conditions", * "events", * }, * links = { * "add-form" = "/admin/config/services/google-tag/add", * "edit-form" = "/admin/config/services/google-tag/manage/{google_tag_container}", * "delete-form" = "/admin/config/services/google-tag/manage/{google_tag_container}/delete", * "enable" = "/admin/config/services/google-tag/manage/{google_tag_container}/enable", * "disable" = "/admin/config/services/google-tag/manage/{google_tag_container}/disable", * "collection" = "/admin/config/services/google-tag/containers", * } * ) */ class TagContainer extends ConfigEntityBase implements EntityWithPluginCollectionInterface { use StringTranslationTrait; use MessengerTrait; /** * Define the Acceptable Google Tag and GTM ID Patterns. */ const GOOGLE_TAG_MATCH = '(?:GT|UA|G|AW|DC|GTM)-[0-9a-zA-Z]{4,}(?:-[0-9]{1,})?'; /** * Define the Acceptable Measurement ID patterns. */ const MEASUREMENT_ID_MATCH = '/(?:UA|G|GT|AW|DC)-[0-9a-zA-Z]{5,}(?:-[0-9]{1,})?/'; /** * Define the pattern matching legacy universal analytics account. */ const GOOGLE_ANALYTICS_UA_MATCH = '/(?:UA)-[0-9a-zA-Z]{5,}(?:-[0-9]{1,})?/'; /** * Define the Acceptable Google Tag Manager Container IDs. */ const GOOGLE_TAG_MANAGER_MATCH = '/(?:GTM)-[0-9a-zA-Z]{4,}/'; /** * The machine name for the configuration entity. * * @var string */ protected $id; /** * The human-readable name of the configuration entity. * * @var string */ protected $label; /** * The weight of the configuration entity. * * @var int */ protected $weight = 0; /** * The Google Tag measurement or container id(s). * * @var string[] */ protected $tag_container_ids = []; /** * Advanced Settings. * * @var array */ protected $advanced_settings = []; /** * Custom dimensions and metrics. * * @var array */ protected array $dimensions_metrics = []; /** * The insertion conditions. * * Each item is the configuration array not the condition object. * * @var array */ protected array $conditions = []; /** * Event plugin configuration. * * @var array */ protected array $events = []; /** * The insertion condition collection. * * @var \Drupal\Core\Condition\ConditionPluginCollection|null */ protected $conditionCollection; /** * The condition plugin manager. * * @var \Drupal\Core\Executable\ExecutableManagerInterface|null */ protected $conditionPluginManager; /** * Return the Gtm id. * * @return string * Gtm Id. */ public function getGtmId(): string { return current($this->getGtmIds(1)) ?: ''; } /** * Return the Gtm id. * * @return array * Gtm Id. */ public function getGtmIds($length = NULL): array { $default_tag = array_slice( array_filter( $this->tag_container_ids, static fn ($id) => is_string($id) && preg_match(self::GOOGLE_TAG_MANAGER_MATCH, $id) ), 0, $length ); return $default_tag ?: []; } /** * Return GTM Advanced Settings. * * @return array * Gtm settings. */ public function getGtmSettings(string $gtmid = NULL): array { // Choose first gtmID if none was supplied. $gtmid = $gtmid ?? $this->getGtmId(); $advanced_settings = $this->get('advanced_settings'); // Legacy advanced settings detected. return $advanced_settings['gtm'][$gtmid] ?? [ 'data_layer' => 'dataLayer', 'include_environment' => FALSE, ]; } /** * Return the first tag as the default. * * @return string * Default tag id. */ public function getDefaultTagId(): string { $default_tag = array_slice( array_filter( $this->tag_container_ids, static fn ($id) => is_string($id) && preg_match(self::GOOGLE_TAG_MANAGER_MATCH, $id) === 0), 0, 1 ); return current($default_tag) ?: ''; } /** * Returns additional ids. * * @return array * Additional ids. */ public function getAdditionalIds(): array { return array_slice( array_filter( $this->tag_container_ids, static fn($id) => is_string($id) && preg_match(self::GOOGLE_TAG_MANAGER_MATCH, $id) === 0), 1 ); } /** * {@inheritdoc} */ public function getPluginCollections() { return [ 'conditions' => $this->getInsertionConditions(), ]; } /** * Checks whether event plugin is configured or not. * * @param string $plugin_id * Event plugin id. * * @return bool * True if configured else false. */ public function hasEvent(string $plugin_id): bool { return array_key_exists($plugin_id, $this->events); } /** * Returns event plugin config if configured. * * @param string $plugin_id * Event plugin id. * * @return array * Event plugin config. */ public function getEventConfiguration(string $plugin_id): array { return $this->events[$plugin_id] ?? []; } /** * Returns the set of insertion conditions for this tag container. * * @return \Drupal\Core\Condition\ConditionPluginCollection * A collection of configured condition plugins. */ public function getInsertionConditions() { if ($this->conditionCollection === NULL) { $this->conditionCollection = new ConditionPluginCollection($this->conditionPluginManager(), $this->get('conditions')); } return $this->conditionCollection; } /** * Gets the condition plugin manager. * * @return \Drupal\Core\Executable\ExecutableManagerInterface * The condition plugin manager. */ protected function conditionPluginManager() { if ($this->conditionPluginManager === NULL) { $this->conditionPluginManager = \Drupal::service('plugin.manager.condition'); } return $this->conditionPluginManager; } /** * Returns custom dimension and metrics. * * @return array * Dimension and metrics attribute. */ public function getDimensionsAndMetrics(): array { return $this->dimensions_metrics; } /** * Returns Consent Mode status. * * @return bool * Whether Consent Mode Javascript should be added to the request. */ public function getConsentMode(): bool { $advanced_settings = $this->get('advanced_settings'); return !empty($advanced_settings['consent_mode']); } /** * {@inheritdoc} */ public function getCacheContexts() { $cache_contexts = array_map(fn(ConditionInterface $condition) => $condition->getCacheContexts(), iterator_to_array($this->getInsertionConditions()) ?? []); return Cache::mergeContexts(parent::getCacheContexts(), ...array_values($cache_contexts)); } /** * {@inheritdoc} */ public function getCacheTags() { $cache_tags = array_map(fn(ConditionInterface $condition) => $condition->getCacheTags(), iterator_to_array($this->getInsertionConditions()) ?? []); return Cache::mergeTags(parent::getCacheTags(), ...array_values($cache_tags)); } /** * {@inheritdoc} */ public function getCacheMaxAge() { $cache_maxage = array_map(fn(ConditionInterface $condition) => $condition->getCacheMaxAge(), iterator_to_array($this->getInsertionConditions()) ?? []); return Cache::mergeMaxAges(parent::getCacheMaxAge(), ...array_values($cache_maxage)); } }