-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathdgi_members.tokens.inc
84 lines (73 loc) · 1.99 KB
/
dgi_members.tokens.inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php
/**
* @file
* Token hooks.
*/
use Drupal\Core\Render\BubbleableMetadata;
/**
* Implements hook_token_info().
*/
function dgi_members_token_info() {
$config = \Drupal::config('dgi_members.settings');
$parameter_tokens = [];
foreach ($config->get('member_parameters') as $parameter) {
$parameter_tokens[_dgi_members_get_token_name($parameter)] = [
'name' => t('Active member from @parameter (dgi_members/Compound)', [
'@parameter' => $parameter,
]),
'type' => 'node',
];
}
return [
'tokens' => [
'node' => $parameter_tokens,
],
];
}
/**
* Implements hook_tokens().
*/
function dgi_members_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
if ($type != 'node') {
return;
}
$output = [];
$config = \Drupal::config('dgi_members.settings');
/** @var \Drupal\dgi_members\DgiMembersEntityOperationsInterface $member_service */
$member_service = \Drupal::service('dgi_members.entity_service');
foreach ($config->get('member_parameters') as $parameter) {
$mapped = _dgi_members_get_token_name($parameter);
$prefix = "{$mapped}:";
$to_chain = [];
foreach ($tokens as $key => $value) {
if (str_starts_with($key, $prefix)) {
$to_chain[substr($key, strlen($prefix))] = $value;
}
}
if ($to_chain) {
$bubbleable_metadata->addCacheContexts([
"url.query_args:{$parameter}",
]);
$output += \Drupal::token()->generate(
$type,
$to_chain,
['node' => $member_service->retrieveActiveMember($parameter)] + $data,
$options,
$bubbleable_metadata,
);
}
}
return $output;
}
/**
* Helper; map URL query parameter to placeholder content.
*
* @param string $parameter
* The URL query parameter to map.
*
* @return string
* The value as it should be in the token placeholder.
*/
function _dgi_members_get_token_name(string $parameter) : string {
return "dgi_member__{$parameter}";
}