google_tag-8.x-1.x-dev/src/Migration/GoogleTagUpgradeManager.php
src/Migration/GoogleTagUpgradeManager.php
<?php namespace Drupal\google_tag\Migration; use Drupal\google_tag\Entity\TagContainer; /** * Google tag upgrade service. * * To upgrade container entities from 1.x to 2.x. */ class GoogleTagUpgradeManager extends GoogleTagMigrateBase { /** * Upgrades google tag entities from 1.x to 2.x. * * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException * @throws \Drupal\Component\Plugin\Exception\PluginException * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException * @throws \Drupal\Core\Entity\EntityStorageException */ public function upgradeGoogleTagEntities(): void { $storage = $this->entityTypeManager->getStorage('google_tag_container'); $entity_ids = $storage->getQuery() ->accessCheck(TRUE) ->condition('status', 1) ->sort('weight') ->execute(); $gtag_settings = $this->configFactory->getEditable('google_tag.settings'); $default_entity = $gtag_settings->get('default_google_tag_entity') ?? ''; $use_collection = $gtag_settings->get('use_collection') ?? FALSE; if ($entity_ids) { /** @var \Drupal\google_tag\Entity\TagContainer[] $entities */ $entities = $storage->loadMultiple($entity_ids); $use_collection = count($entities) > 1; foreach ($entities as $entity) { // First iteration. if ($default_entity === '') { $default_entity = $entity->id(); } // Skip if it's a new entity. if ($entity->get('tag_container_ids') !== []) { continue; } // Convert container_id string into tag_container_ids array. $entity->set('tag_container_ids', [$entity->get('container_id')]); // Convert advanced settings from old to new format. $this->convertGtmSettings($entity); // Convert conditions. $this->convertConditions($entity); // Configure events. $events = $entity->get('events'); if ($events === []) { $entity->set('events', $this->getDefaultEventData()); } $entity->save(); } } $new_gtag_settings['default_google_tag_entity'] = $default_entity; $new_gtag_settings['use_collection'] = $use_collection; $gtag_settings->setData($new_gtag_settings)->save(); } /** * Converts gtm settings for google tag entity. * * @param \Drupal\google_tag\Entity\TagContainer $entity * Google tag entity. */ protected function convertGtmSettings(TagContainer $entity): void { $gtm_settings = []; $gtm_id = $entity->getGtmId(); $gtm_settings['data_layer'] = $entity->get('data_layer') ?? 'dataLayer'; $gtm_settings['include_classes'] = $entity->get('include_classes') ?? FALSE; $gtm_settings['allowlist_classes'] = $entity->get('whitelist_classes') ?? ''; $gtm_settings['blocklist_classes'] = $entity->get('blacklist_classes') ?? ''; $gtm_settings['include_environment'] = $entity->get('include_environment') ?? FALSE; $gtm_settings['environment_id'] = $entity->get('environment_id') ?? ''; $gtm_settings['environment_token'] = $entity->get('environment_token') ?? ''; $entity->set('advanced_settings', ['gtm' => [$gtm_id => $gtm_settings]]); } /** * Converts conditions for google tag entity. * * @param \Drupal\google_tag\Entity\TagContainer $entity * Google tag entity. */ protected function convertConditions(TagContainer $entity): void { // Convert conditions. // Get saved conditions. $old_conditions = $entity->get('conditions'); $conditions = []; $condition_definitions = $this->conditionManager->getDefinitions(); $negate_toggle = 'exclude listed'; foreach ($old_conditions as $condition_id => $condition_config) { // Only add to the config if condition plugin is available. if (isset($condition_definitions[$condition_id])) { $conditions[$condition_id] = $condition_config; continue; } // Convert custom gtag_language into language condition. if ($condition_id === 'gtag_language') { $gtag_language_config = $old_conditions['gtag_language'] ?? []; $language_plugin = 'language'; $language_negate = $gtag_language_config['language_toggle'] === $negate_toggle; $langcodes = $gtag_language_config['language_list'] ?? []; $langcodes = array_combine($langcodes, $langcodes); $language_config = [ 'id' => $language_plugin, 'langcodes' => $langcodes, 'negate' => $language_negate, ]; $language_config['context_mapping'] = $gtag_language_config['context_mapping']; $conditions[$language_plugin] = $language_config; } } // Convert roles, request paths, status code // custom conditions from 1.x to actual condition plugins. // Request path custom condition. $request_negate = $entity->get('path_toggle') === $negate_toggle; $request_paths = $entity->get('path_list'); $request_path_plugin = 'request_path'; if ($request_paths !== '' && isset($condition_definitions[$request_path_plugin])) { $conditions[$request_path_plugin] = static::getRequestPathCondition($request_paths, $request_negate); } // Response code custom condition. $response_code_negate = $entity->get('status_toggle') === $negate_toggle; $response_codes = $entity->get('status_list'); $response_code_plugin = 'response_code'; if ($response_codes !== '' && isset($condition_definitions[$response_code_plugin])) { $response_code_config = [ 'id' => $response_code_plugin, 'response_codes' => $response_codes, 'negate' => $response_code_negate, ]; $conditions[$response_code_plugin] = $response_code_config; } // Roles custom condition. $roles_negate = $entity->get('role_toggle') === $negate_toggle; $roles = $entity->get('role_list'); $roles_plugin = 'user_role'; if ($roles !== [] && isset($condition_definitions[$roles_plugin])) { $conditions[$roles_plugin] = static::getUserRoleCondition($roles, $roles_negate); } $entity->set('conditions', $conditions); } }