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'];
}
}
