Antworten:
In Drupal 6 verwenden Sie hook_token_values()
.
Mit diesem Hook können Sie Token erstellen. Sie können sie im globalen Bereich erstellen oder Sie können ein Objekt wie einen Knoten oder einen Benutzer verwenden, um die Werte zu setzen.
Sie sollten auch verwenden hook_token_list()
, um zu erklären, was Ihre Token sind.
Die token.api- Dokumentation ist ziemlich klar.
function my_user_token_values($type, $object = NULL, $options = array()) {
if ($type == 'user') {
$user = $object;
$tokens['name'] = $user->name;
$tokens['mail'] = $user->mail;
return $tokens;
}
}
Ich werde das Ganze nicht veröffentlichen, aber das sollte dir eine gute Idee geben.
In Drupal 7 ist der Code für den Umgang mit Tokens Teil des Drupal-Kernmoduls.
Die Hooks, die die Token-Module implementieren müssen, sind:
Andere Module können die von einem Modul bereitgestellte Token-Implementierung mit hook_token_info_alter () und hook_tokens_alter () ändern .
Anders als im Token-Modul ermöglicht der Code in Drupal Core, den Inhalt eines Tokens nur dann zu erstellen, wenn dies unbedingt erforderlich ist. In Drupal 6 fragt das Token-Modul die Module, die Token implementieren, nach allen Werten für das Token, das sie verwenden hook_token_values()
. Dies bedeutet, dass ein Modul den Wert für ein Token berechnen kann, der dann für die zu ersetzenden Token nicht benötigt wird. In Drupal 7 ist die Implementierung von hook_tokens()
receive $tokens
ein Array von zu ersetzenden Tokens als Argument. Das Modul kann dann den Wert eines Tokens berechnen, da es weiß, dass er verwendet wird.
Die Funktion, mit der in Drupal 7 die Token durch ihren Wert ersetzt werden, ist token_replace (). Dies ist die einzige Funktion, mit der die Token durch ihre Werte ersetzt werden.
Weitere Unterschiede zwischen dem Token-Modul für Drupal 6 und dem Code in Drupal 7 sind:
hook_tokens()
get einen Parameter, der dem Hook mitteilt, wann der Inhalt des Tokens bereinigt werden muss; Wenn der Token-Wert nicht bereinigt werden muss, wird der Inhalt nicht an die Funktionen check_plain()
oder übergeben filter_xss()
.Ich wollte dem Abschnitt Site-Informationen von Tokens einen neuen Token hinzufügen , der den Namen Stadt trägt . So habe ich es in Drupal 7 gemacht.
/**
* Implements hook_token_info().
*/
function my_module_token_info() {
// Add tokens.
$site['city_name'] = array(
'name' => t('Token Name'),
'description' => t('Token Description'),
);
return array(
'tokens' => array(
'site' => $site,
),
);
}
/**
* Implements hook_tokens().
*/
function my_module_tokens($type, $tokens, array $data = array(), array $options = array()) {
$replacements = array();
if ($type == 'site') {
foreach ($tokens as $name => $original) {
switch ($name) {
case 'city_name':
$city_name = variable_get('city_name');
$replacements[$original] = $sanitize ? check_plain($city_name) : $city_name;
break;
}
}
}
// Return the replacements.
return $replacements;
}
[site:city_name]
. Stellen Sie sicher, dass Sie die Caches löschen oder memcached neu starten, falls verwendet.
$sanitize
In obigem Beispiel ist nicht definiert, daher werden Sie darüber informiert Notice: Undefined variable
.
Beispiel für Drupal 8 mit dem Knotenobjekt:
Sie können Tokens in Ihr Modul unter mymodule.tokens.inc einfügen, indem Sie hook_token_info () verwenden, um sie zu registrieren, und hook_tokens () für die Ersatzdaten.
Wenn Sie ein benutzerdefiniertes Token für einen vorhandenen Token-Typ erstellen möchten, z. B. für Knoten, müssen Sie Ihr Token in das Subarray in hook_token_info () einfügen. Unter node.tokens.inc im Knotenmodul erfahren Sie, woraus Sie bauen.
mymodule.tokens.inc:
<?php
use Drupal\Core\Render\BubbleableMetadata;
use Drupal\image\Entity\ImageStyle;
/**
* Implements hook_token_info().
*/
function mymodule_token_info() {
$info = array();
$info['tokens']['node']['custom_title'] = [
'name' => t("Custom Title"),
'description' => t("a custom node title token"),
];
// Return them.
return $info;
}
/**
* Implements hook_tokens().
*/
function mymodule_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
$replacements = array();
if ($type == 'node') {
foreach ($tokens as $name => $original) {
// Find the desired token by name
switch ($name) {
case '$data['node']':
$node = $data['node'];
$replacements[$original] = $node->label();
break;
}
}
}
// Return the replacements.
return $replacements;
}
Für Drupal 8
// We need to include the needed class for tokens.
use Drupal\Core\Render\BubbleableMetadata;
/**
* Implements hook_token_info().
*/
function modulename_token_info() {
$info = array();
// Add any new tokens.
$info['tokens']['customtokentype']['customtoken'] = t('Telling drupal that you define custom token');
// Return them.
return $info;
}
/**
* Implements hook_tokens().
*/
function modulename_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
$replacements = array();
$simple = $data["customanything"];
if ($type == 'customtokentype') {
foreach ($tokens as $name => $original) {
// Find the desired token by name
switch ($name) {
case 'customtoken':
$new = $simple;
$replacements[$original] = $new;
break;
}
}
}
// Return the replacements.
return $replacements;
}
Um den Wert von Tokens in Ihrer Funktion zu ermitteln, ist ein Code ähnlich dem folgenden erforderlich.
$token = \Drupal::token();
$message_html = "hello my custom token is replaced see it here [customtokentype:customtoken]";
// Token data.
$data = array('customanything' => $tosendtotokens);
$message_html = $token->replace($message_html, $data);
new
und simple
in diesem Beispiel?