Cómo crear mediante programación un token personalizado en un módulo

23

¿Cómo harías para crear un token mediante programación? Deseo agregar algunos tokens personalizados para mi módulo.

Lucy
fuente
Se ha actualizado la documentación adicional (31 de octubre de 2014) y se puede encontrar en drupal.org/documentation/modules/token
iStryker

Respuestas:

7

En Drupal 6, usas hook_token_values().

Este gancho te permitirá crear tokens. Puede crearlos en el ámbito global o puede usar un objeto como un nodo o un usuario para sembrar los valores.

También deberías usar hook_token_list()para explicar cuáles son tus tokens.

La documentación de token.api es bastante clara.

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

No publicaré X todo, pero eso debería darte una idea de alto nivel.

Jeremy French
fuente
20

En Drupal 7, el código para manejar tokens es parte del módulo principal de Drupal.

Los ganchos que los módulos de token deben implementar son:

  • hook_token_info () es el enlace que proporciona información sobre los tokens implementados por un módulo.
  • hook_tokens () es el gancho que debe implementarse para proporcionar los valores reales que reemplazan los tokens.

Otros módulos pueden alterar la implementación del token proporcionada desde un módulo usando hook_token_info_alter () y hook_tokens_alter () .

A diferencia del módulo Token, el código en el núcleo de Drupal permite crear el contenido de un token solo cuando es estrictamente necesario. En Drupal 6, el módulo Token solicitaría a los módulos que implementan tokens todos los valores para su token hook_token_values(); Esto significa que un módulo puede calcular el valor de un token que luego no es necesario para reemplazar los tokens. En Drupal 7, la implementación de hook_tokens()recibe $tokens, una matriz de tokens para ser reemplazados, como argumento; el módulo puede calcular el valor de un token, sabiendo que se usará.

La función que en Drupal 7 se usa para reemplazar los tokens con su valor es token_replace () , que es la única función utilizada para reemplazar los tokens con sus valores.

Otra diferencia entre el módulo Token para Drupal 6 y el código en Drupal 7 es:

  • En Drupal 7, [nodo: autor] devuelve el nombre del autor; [nodo: autor: correo] devuelve la dirección de correo electrónico asociada con el autor de un nodo, y [nodo: autor: url] devuelve la URL del perfil de usuario para el autor del nodo. En otras palabras, es posible usar [nodo: autor: xyz], donde "xyz" es uno de los tokens devueltos para un objeto de usuario.
  • En Drupal 7, no hay tokens sin procesar; la implementación de hook_tokens()obtener un parámetro que le dice al gancho cuándo se debe desinfectar el contenido del token; cuando no es necesario desinfectar el valor del token, el contenido no se pasa a las funciones check_plain()o filter_xss().
  • En Drupal 7, no hay ninguna función que muestre la lista de tokens disponibles. Si un módulo necesita mostrar la lista de tokens disponibles, debe construir la lista de los tokens y mostrarla en la descripción de un campo de formulario; alternativamente, puede usar la función de tema aún disponible en el módulo Token.
kiamlaluno
fuente
8

Quería agregar un nuevo token a la sección de tokens de información del sitio , llamado Nombre de la ciudad . Así es como lo hice 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;
}
Lee Woodman
fuente
Gracias por dar un ejemplo. Siempre son útiles
iStryker
1
Así que el token sería en el ejemplo anterior: [site:city_name]. Asegúrese de borrar las memorias caché o reinicie memcached si se usa.
kenorb
Nota: $sanitizeen el ejemplo anterior no está definido, por lo que obtendrá Notice: Undefined variableinformación al respecto.
kenorb
@kenorb buen ojo, y veo que esta respuesta se ha actualizado desde entonces :)
WebMW
3

Para Drupal 8, ejemplo usando el objeto nodo:

Puede colocar tokens en su módulo en mymodule.tokens.inc usando hook_token_info () para registrarlos y hook_tokens () para los datos de reemplazo.

Si desea crear un token personalizado para un tipo de token existente, como para los nodos, deberá colocar su token dentro del subconjunto dentro de hook_token_info (). Consulte node.tokens.inc en el módulo de nodos para ver de qué está construyendo.

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
fuente
2

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

Obtener el valor de los tokens en su función requiere un código similar al siguiente.

$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
fuente
1
¿Qué es newy simpleen este ejemplo?
user1359
use Drupal \ Core \ Render \ BubbleableMetadata; $ token = \ Drupal :: token (); function modulename_tokens ($ type, $ tokens, array $ data, array $ options, BubbleableMetadata $ bubbleable_metadata) {...}
Karthikeyan Manivasagam
Esto debería ir en modulename.tokens.inc
oknate