web-dev-qa-db-fra.com

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

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

23
Lucy

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 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.

7
Jeremy French

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 par un module en utilisant hook_token_info_alter () et hook_tokens_alter () .

À la différence du module Token, le code de Drupal core permet de créer le contenu d'un token uniquement lorsque cela est strictement nécessaire. Dans Drupal 6, le module Token demander aux modules implémentant les tokens toutes les valeurs de leur token en utilisant hook_token_values(), cela signifie qu'un module peut calculer la valeur d'un token qui n'est alors pas requise pour les tokens à remplacer. In 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 il sera utilisé.

La fonction utilisée 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 sont:

  • 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 [nœud: auteur: 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() obtient un paramètre qui indique au hook quand le contenu du token doit être nettoyé; lorsque le 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; en variante, il peut utiliser la fonction de thème toujours disponible dans le module Token.
20
kiamlaluno

Je voulais ajouter un nouveau jeton à la section Informations sur le site des jetons, appelé Nom de la ville. Voici comment je l'ai fait en 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;
}
8
Lee Woodman

Pour Drupal 8, exemple utilisant 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, comme pour les nœuds, vous devrez placer votre jeton dans le sous-tableau dans hook_token_info (). Reportez-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;
}
4
oknate

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;
}

L'obtention de 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);
3