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