2022-05-03 15:24:29 +02:00

163 lines
5.0 KiB
Plaintext

<?php
/**
* @file
* Install, update and uninstall functions for the token module.
*/
/**
* Implements hook_requirements().
*/
function token_requirements($phase = 'runtime') {
$requirements = [];
if ($phase == 'runtime') {
// Check for various token definition problems.
$token_problems = token_get_token_problems();
// Format and display each token problem.
foreach ($token_problems as $problem_key => $problem) {
if (!empty($problem['problems'])) {
$problems = array_unique($problem['problems']);
$build = [
'#theme' => 'item_list',
'#items' => $problems,
];
$requirements['token-' . $problem_key] = [
'title' => $problem['label'],
'value' => \Drupal::service('renderer')->renderPlain($build),
'severity' => $problem['severity'],
];
}
}
}
return $requirements;
}
/**
* Implements hook_install().
*/
function token_install() {
// Create a token view mode for each entity type.
$info = \Drupal::entityTypeManager()->getDefinitions();
foreach ($info as $entity_type => $entity_type_info) {
// We're only interested in entity types with a view builder.
if (!$entity_type_info->getViewBuilderClass()) {
continue;
}
// Try to find a token view mode for that entity type.
$storage = \Drupal::entityTypeManager()->getStorage('entity_view_mode');
// Add a token view mode if it does not already exist.
if (!$storage->load("$entity_type.token")) {
$storage->create([
'targetEntityType' => $entity_type,
'id' => "$entity_type.token",
'status' => TRUE,
'label' => t('Token'),
])->save();
}
}
}
/**
* Get token problems.
*/
function token_get_token_problems() {
// @todo Improve the duplicate checking to report which modules are the offenders.
//$token_info = [];
//foreach (module_implements('token_info') as $module) {
// $module_token_info = module_invoke($module, 'token_info');
// if (in_array($module, _token_core_supported_modules())) {
// $module .= '/token';
// }
// if (isset($module_token_info['types'])) {
// if (is_array($module_token_info['types'])) {
// foreach (array_keys($module_token_info['types']) as $type) {
// if (is_array($module_token_info['types'][$type])) {
// $module_token_info['types'][$type] += ['module' => $module];
// }
// }
// }
// }
// if (isset($module_token_info['tokens'])) {
// if (is_array($module_token_info['tokens'])) {
//
// }
// }
// if (is_array($module_token_info)) {
// $token_info = array_merge_recursive($token_info, $module_token_info);
// }
//}
$token_info = \Drupal::token()->getInfo();
$token_problems = [
'not-array' => [
'label' => t('Tokens or token types not defined as arrays'),
'severity' => REQUIREMENT_ERROR,
],
'missing-info' => [
'label' => t('Tokens or token types missing name property'),
'severity' => REQUIREMENT_WARNING,
],
'type-no-tokens' => [
'label' => t('Token types do not have any tokens defined'),
'severity' => REQUIREMENT_INFO,
],
'tokens-no-type' => [
'label' => t('Token types are not defined but have tokens'),
'severity' => REQUIREMENT_INFO,
],
'duplicate' => [
'label' => t('Token or token types are defined by multiple modules'),
'severity' => REQUIREMENT_ERROR,
],
];
// Check token types for problems.
foreach ($token_info['types'] as $type => $type_info) {
$real_type = !empty($type_info['type']) ? $type_info['type'] : $type;
if (!is_array($type_info)) {
$token_problems['not-array']['problems'][] = "\$info['types']['$type']";
continue;
}
elseif (!isset($type_info['name'])) {
$token_problems['missing-info']['problems'][] = "\$info['types']['$type']";
}
elseif (is_array($type_info['name'])) {
$token_problems['duplicate']['problems'][] = "\$info['types']['$type']";
}
elseif (empty($token_info['tokens'][$real_type])) {
$token_problems['type-no-tokens']['problems'][] = "\$info['types']['$real_type']";
}
}
// Check tokens for problems.
foreach ($token_info['tokens'] as $type => $tokens) {
if (!is_array($tokens)) {
$token_problems['not-array']['problems'][] = "\$info['tokens']['$type']";
continue;
}
else {
foreach (array_keys($tokens) as $token) {
if (!is_array($tokens[$token])) {
$token_problems['not-array']['problems'][] = "\$info['tokens']['$type']['$token']";
continue;
}
elseif (!isset($tokens[$token]['name'])) {
$token_problems['missing-info']['problems'][] = "\$info['tokens']['$type']['$token']";
}
elseif (is_array($tokens[$token]['name'])) {
$token_problems['duplicate']['problems'][] = "\$info['tokens']['$type']['$token']";
}
}
}
if (!isset($token_info['types'][$type])) {
$token_problems['tokens-no-type']['problems'][] = "\$info['types']['$type']";
}
}
return $token_problems;
}