Réponses:
Dans Drupal 6, vous utilisez hook_token_values()
.
Ce crochet vous permettra de créer des jetons. Vous pouvez les créer dans la portée globale ou vous pouvez utiliser un objet comme un nœud ou un utilisateur pour amorcer les valeurs.
Vous devez également utiliser hook_token_list()
pour expliquer ce que sont vos jetons.
La documentation de token.api est assez claire.
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;
}
}
Je ne publierai pas le tout, mais cela devrait vous donner une idée de haut niveau.
Dans Drupal 7, le code de gestion des jetons fait partie du module de base Drupal.
Les hooks que les modules de jetons doivent implémenter sont:
D'autres modules peuvent modifier l'implémentation du jeton fournie à partir d'un module à l'aide de hook_token_info_alter () et hook_tokens_alter () .
Différemment du module Token, le code dans le noyau Drupal permet de créer le contenu d'un token uniquement lorsque cela est strictement nécessaire. Dans Drupal 6, le module Token demanderait aux modules implémentant les jetons toutes les valeurs de leur jeton utilisant hook_token_values()
; cela signifie qu'un module peut calculer la valeur d'un jeton qui n'est alors pas requise pour les jetons à remplacer. Dans Drupal 7, l'implémentation de hook_tokens()
reçoit $tokens
, un tableau de jetons à remplacer, comme argument; le module est alors capable de calculer la valeur d'un jeton, sachant qu'il sera utilisé.
La fonction qui dans Drupal 7 est utilisée pour remplacer les jetons par leur valeur est token_replace () , qui est la seule fonction utilisée pour remplacer les jetons par leurs valeurs.
Autre différence entre le module Token pour Drupal 6 et le code dans Drupal 7:
hook_tokens()
get un paramètre qui indique au hook quand le contenu du token doit être nettoyé; lorsque la valeur du jeton n'a pas besoin d'être filtrée, le contenu n'est pas transmis aux fonctions check_plain()
ou filter_xss()
.Je voulais ajouter un nouveau jeton à la section Informations sur le site des jetons, appelé Nom de la ville . C'est ainsi que je l'ai fait dans Drupal 7.
/**
* 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]
. Assurez-vous d'effacer les caches ou de redémarrer memcached s'il est utilisé.
$sanitize
dans l'exemple ci-dessus n'est pas défini, vous obtiendrez Notice: Undefined variable
à ce sujet.
Pour Drupal 8, exemple d'utilisation de l'objet nœud:
Vous pouvez placer des jetons dans votre module à mymodule.tokens.inc en utilisant hook_token_info () pour les enregistrer et hook_tokens () pour les données de remplacement.
Si vous souhaitez créer un jeton personnalisé pour un type de jeton existant, tel que pour les nœuds, vous devrez placer votre jeton dans le sous-tableau dans hook_token_info (). Référez-vous à node.tokens.inc dans le module de noeud pour voir de quoi vous construisez.
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;
}
Pour 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;
}
Obtenir la valeur des jetons dans votre fonction nécessite un code similaire au suivant.
$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
et simple
dans cet exemple?