tracardi-1.0.x-dev/tracardi.module

tracardi.module
<?php

use Drupal\Core\Access\AccessResult;
use Drupal\Core\Access\AccessResultInterface;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Url;
use Drupal\field\Entity\FieldConfig;

/**
 * Implements hook_requirements().
 */
function tracardi_requirements($phase): array {
  $requirements = [];

  /** @var \Drupal\tracardi\Services\TracardiApi $api */
  $api = \Drupal::service('tracardi_api');

  $requirements['tracardi'] = [
    'title' => 'Tracardi',
    'value' => $api->isConnected() ? t('✓ Connected') : t('✗ Could not connect'),
    'severity' => $api->isConnected() ? REQUIREMENT_OK : REQUIREMENT_ERROR,
  ];

  return $requirements;
}

/**
 * Implements hook_page_attachments().
 */
function tracardi_page_attachments(array &$attachments): void {
  if (Drupal::service('router.admin_context')->isAdminRoute()) {
    return;
  }

  $config = Drupal::service('config.factory')->get('tracardi.settings');

  /** @var \Drupal\tracardi\PersonalizationManager $pluginManager */
  $pluginManager = Drupal::service('plugin.manager.personalization');
  $plugins = $pluginManager->loadEnabledPlugins();

  // Load basic Tracardi script & settings.
  $attachments['#attached']['library'][] = 'tracardi/tracardi';
  $attachments['#attached']['drupalSettings']['tracardi'] = [
    'api_url' => $config->get('api_url'),
    'profile_cookies_endpoint' => Url::fromRoute('tracardi.profile_cookies', ['id' => 'profileId'])->toString(),
    'source_id' => $config->get('source_id'),
    'enable_script' => $config->get('enable_script'),
    'page_view' => $config->get('page_view'),
    'page_view_payload' => [],
    'form_submit' => $config->get('form_submit'),
    'updated_cookie' => $config->get('updated_cookie'),
  ];

  // Load plugin scripts & settings.
  /** @var \Drupal\tracardi\PersonalizationInterface $plugin */
  foreach ($plugins as $plugin) {
    $attachments['#attached']['library'] = array_merge($attachments['#attached']['library'], $plugin->getPageLibraries());
    $attachments['#attached']['drupalSettings']['tracardi'][$plugin->getId()] = $plugin->getPageDrupalSettings();
  }
}

/**
 * Implements hook_entity_access().
 */
function tracardi_entity_access(EntityInterface $entity, $operation, AccountInterface $account): AccessResultInterface {
  // Only step in to restrict/allow access if there is a view operations.
  if ($operation !== 'view' || !($entity instanceof ContentEntityInterface)) {
    return AccessResult::neutral();
  }

  /** @var \Drupal\tracardi\PersonalizationManager $pluginManager */
  $pluginManager = Drupal::service('plugin.manager.personalization');

  /** @var \Drupal\Tracardi\CookieManager $cookieManager */
  $cookieManager = Drupal::service('tracardi.cookie_manager');

  $personalizationFields = array_filter($entity->getFieldDefinitions(), static function ($field) {
    return ($field instanceof FieldConfig && $field->getType() === 'personalization');
  });

  foreach ($personalizationFields as $field) {
    $selectedPlugin = $field->getSetting('selected_plugin');

    $fieldName = $field->getFieldStorageDefinition()->getName();
    if ($entity->get($fieldName)->isEmpty()) {
      continue;
    }
    $values = array_column($entity->get($fieldName)->getValue(), 'value');
    $plugin = $pluginManager->loadPlugin($selectedPlugin);

    $cookieName = $plugin->getCookieName();
    $cookieValues = $cookieManager->getCookieValues($cookieName) ?: ['_unknown'];

    // Allows access when paragraph settings and cookies match
    if (array_intersect($values, $cookieValues)) {
      return AccessResult::allowed()
        ->addCacheableDependency($entity)
        ->addCacheContexts(['cookies:' . $cookieName]);
    }

    return AccessResult::forbidden()
      ->addCacheableDependency($entity)
      ->addCacheContexts(['cookies:' . $cookieName]);
  }

  return AccessResult::neutral();
}

/**
 * Implements hook_theme().
 */
function tracardi_theme(): array {
  return [
    'preview_widget' => [
      'variables' => [
        'plugins' => [],
      ],
    ],
    'webform_handler_tracardi_summary' => [
      'variables' => [
        'settings' => NULL,
        'handler' => NULL],
    ],
  ];
}

/**
 * Implements hook_field_widget_info_alter().
 */
function tracardi_field_widget_info_alter(array &$info) {
  $info['options_select']['field_types'][] = 'personalization';
}

/**
 * Implements hook_field_widget_info_alter().
 */
function tracardi_field_formatter_info_alter(array &$info) {
  $info['list_default']['field_types'][] = 'personalization';
}

/**
 * Implements hook_preprocess_input().
 */
function tracardi_preprocess_input(&$variables) {
  if (isset($variables['element']['#tracardi'])) {
    $variables['attributes']['data-tracardi'] = $variables['element']['#tracardi'];
  }
}

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

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