tarte_au_citron-1.0.0-beta1/tarte_au_citron.module

tarte_au_citron.module
<?php

/**
 * @file
 * Provides primary Drupal hook implementations.
 */

use Drupal\Component\Utility\UrlHelper;
use Drupal\Component\Utility\Xss;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Url;

/**
 * Implements hook_help().
 */
function tarte_au_citron_help($route_name, RouteMatchInterface $route_match) {
  switch ($route_name) {
    case 'help.page.tarte_au_citron':
      $output = '<h3>' . t('About') . '</h3>';
      $output .= '<p>' . t('Manage features which use cookies (ads, social networks, videos, other contrib modules who print data in your pages)') . '</p>';
      $output .= '<h3>' . t('Uses') . '</h3>';
      $output .= '<dl>';
      $output .= '<dt>' . t('Configuring Tarte au citron') . '</dt>';
      $output .= '<dd>' . t('Administrators can configure Tarte au citron on <a href=":tarte_au_citron">Tarte au citron settings page</a>. This page allow administrators to configure the display of the GDPR modal and enable desired plugins.', [':tarte_au_citron' => Url::fromRoute('tarte_au_citron.configuration')->toString()]) . '</dd>';
      return $output;
  }
}

/**
 * Implements hook_library_info_alter().
 */
function tarte_au_citron_library_info_alter(&$libraries, $extension): void {
  if ($extension === 'tarte_au_citron' && isset($libraries['tarte_au_citron_lib'])) {
    /**
     * @var \Drupal\tarte_au_citron\LibraryJsDiscoverInterface $libJsDiscoverService
     */
    $libJsDiscoverService = \Drupal::service('tarte_au_citron.library_js_discover');
    $libraries['tarte_au_citron_lib']['version'] = $libJsDiscoverService->getLibraryVersion();

    if ($libJsDiscoverService->hasJsMinified()) {
      $libraries['tarte_au_citron_lib']['js']['/libraries/tarteaucitron/tarteaucitron.min.js'] = $libraries['tarte_au_citron_lib']['js']['/libraries/tarteaucitron/tarteaucitron.js'];
      unset($libraries['tarte_au_citron_lib']['js']['/libraries/tarteaucitron/tarteaucitron.js']);
    }
  }
}

/**
 * Implements hook_page_attachments_alter().
 */
function tarte_au_citron_page_attachments_alter(array &$attachments): void {
  /** @var \Drupal\tarte_au_citron\ServicesManagerInterface $serviceManager */
  $serviceManager = \Drupal::service('tarte_au_citron.services_manager');

  if (!$serviceManager->isNeeded()) {
    return;
  }

  /** @var \Drupal\tarte_au_citron\LibraryJsDiscoverInterface $discoverService */
  $discoverService = \Drupal::service('tarte_au_citron.library_js_discover');
  $configDef = $discoverService->getJsConfig();

  $config = \Drupal::config('tarte_au_citron.settings');
  $data = $config->get('tacConfig');
  $data = array_filter($data, function ($item) {
    return !(
      (is_string($item) || is_array($item)) && empty($item)
    );
  });
  foreach ($data as $key => $value) {
    if (empty($configDef[$key]) || empty($configDef[$key]['isUrl'])) {
      continue;
    }
    $data[$key] = UrlHelper::filterBadProtocol($data[$key]);
  }

  $attachments['#attached']['library'][] = 'tarte_au_citron/tarte_au_citron';

  // Attach library services.
  $enabledServices = $serviceManager->getServices(TRUE);

  $data['user'] = [];
  $data['services'] = [];
  foreach ($enabledServices as $currentService) {
    $currentService->addJs($attachments, $data['user']);
    \Drupal::moduleHandler()
      ->alter('tarte_au_citron_' . $currentService->getPluginId(), $attachments, $currentService);
    $data['services'][] = $currentService->getPluginDefinition()['id'];
  }
  if (!empty($data['services'])) {
    unset($data['services_settings']);
  }

  // Translate labels.
  $textsConfig = \Drupal::config('tarte_au_citron.texts.settings');
  if ($textsConfig->get('strategy') === 'custom') {
    $data['tarteaucitronCustomText'] = $textsConfig->get('texts');
    _tarte_au_citron_filter_text($data['tarteaucitronCustomText']);
  }
  elseif ($textsConfig->get('strategy') === 'forced') {
    $languageManager = \Drupal::languageManager();
    $tacLanguages = $discoverService->getTextsAvailableLanguagesConfig();
    switch ($textsConfig->get('forced_lang')) {
      case 'current':
        $lang = $languageManager->getCurrentLanguage()->getId();
        break;

      case 'default':
        $lang = $languageManager->getDefaultLanguage()->getId();
        break;

      default:
        $lang = $textsConfig->get('forced_lang');
        break;
    }
    if (!empty($tacLanguages[$lang])) {
      $data['tarteaucitronForceLanguage'] = $lang;
    }
  }

  $attachments['#attached']['drupalSettings']['tarte_au_citron'] = $data;
}

/**
 * Recursive function to prevent XSS in texts.
 *
 * @param array $data
 *   The data.
 */
function _tarte_au_citron_filter_text(array &$data): void {
  foreach ($data as $keyText => $keyValue) {
    if (is_array($keyValue)) {
      _tarte_au_citron_filter_text($data[$keyText]);
    }
    else {
      $data[$keyText] = Xss::filterAdmin($keyValue);
    }
    if (empty($data[$keyText])) {
      unset($data[$keyText]);
    }
  }
}

/**
 * Implements hook_config_schema_info_alter().
 */
function tarte_au_citron_config_schema_info_alter(&$definitions): void {
  /** @var \Drupal\tarte_au_citron\LibraryJsDiscover $service */
  $service = \Drupal::service('tarte_au_citron.library_js_discover');
  $schemaDefinitions = $service->getJsConfig();
  foreach ($schemaDefinitions as $key => $def) {
    $definitions['tarte_au_citron.settings']['mapping']['tacConfig']['mapping'][$key] = [
      'type' => $def['type'],
    ];
  }
  $schemaTextsDefinitions = $service->getTextsConfig();
  foreach ($schemaTextsDefinitions as $key => $def) {
    _tarte_au_citron_config_schema_process($definitions['tarte_au_citron.texts.settings']['mapping']['texts']['mapping'], $key, $def);
  }
}

/**
 * Recursive function to create config schema for texts.
 *
 * @param array $schema
 *   The schema.
 * @param string $key
 *   The current key.
 * @param array $def
 *   The current definition.
 */
function _tarte_au_citron_config_schema_process(array &$schema, string $key, array $def): void {
  if ($def['type'] === 'mapping') {
    $schema[$key] = [
      'type' => 'mapping',
      'mapping' => [],
    ];
    foreach ($def['children'] as $subkey => $subvalue) {
      _tarte_au_citron_config_schema_process($schema[$key]['mapping'], $subkey, $subvalue);
    }
  }
  else {
    $schema[$key] = [
      'type' => $def['type'],
      'label' => $def['default_value'],
    ];
  }
}

/**
 * Implements hook_theme().
 */
function tarte_au_citron_theme(): array {
  return [
    'tarte_au_citron_config_form_header' => [
      'variables' => [],
    ],
    'tarte_au_citron_texts_config_form_header' => [
      'variables' => [],
    ],
  ];
}

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

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