Comment créer par programme un jeton personnalisé dans un module

23

Comment feriez-vous pour créer un jeton par programme? Je souhaite ajouter des jetons personnalisés pour mon module.

Lucy
la source
Une documentation supplémentaire a été mise à jour (31 octobre 2014) et peut être consultée sur drupal.org/documentation/modules/token
iStryker

Réponses:

7

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.

Jeremy French
la source
20

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:

  • hook_token_info () est le hook qui fournit des informations sur les jetons implémentés par un module.
  • hook_tokens () est le hook qui doit être implémenté pour fournir les valeurs réelles qui remplacent les jetons.

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:

  • Dans Drupal 7, [node: author] renvoie le nom de l'auteur; [node: author: mail] renvoie l'adresse e-mail associée à l'auteur d'un nœud, et [node: author: url] renvoie l'URL du profil utilisateur de l'auteur du nœud. En d'autres termes, il est possible d'utiliser [node: author: xyz], où "xyz" est l'un des jetons renvoyés pour un objet utilisateur.
  • Dans Drupal 7, il n'y a pas de jetons bruts; l'implémentation de 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().
  • Dans Drupal 7, il n'y a aucune fonction qui affiche la liste des jetons disponibles. Si un module doit afficher la liste des jetons disponibles, il doit construire la liste des jetons lui-même et l'afficher dans la description d'un champ de formulaire; alternativement, il peut utiliser la fonction de thème toujours disponible dans le module Token.
kiamlaluno
la source
8

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;
}
Lee Woodman
la source
Merci d'avoir fourni un exemple. Ils sont toujours utiles
iStryker
1
Ainsi , le jeton serait dans l' exemple ci - dessus: [site:city_name]. Assurez-vous d'effacer les caches ou de redémarrer memcached s'il est utilisé.
kenorb
Remarque: $sanitizedans l'exemple ci-dessus n'est pas défini, vous obtiendrez Notice: Undefined variableà ce sujet.
kenorb
@kenorb good eye, et je vois que cette réponse a depuis été mise à jour :)
WebMW
3

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;
}
oknate
la source
2

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);
Karthikeyan Manivasagam
la source
1
Qu'est-ce que c'est newet simpledans cet exemple?
user1359
utiliser Drupal \ Core \ Render \ BubbleableMetadata; $ token = \ Drupal :: token (); function modulename_tokens ($ type, $ tokens, array $ data, array $ options, BubbleableMetadata $ bubbleable_metadata) {...}
Karthikeyan Manivasagam
Cela devrait aller dans modulename.tokens.inc
oknate