Respuestas:
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.
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:
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:
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()
.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;
}
[site:city_name]
. Asegúrese de borrar las memorias caché o reinicie memcached si se usa.
$sanitize
en el ejemplo anterior no está definido, por lo que obtendrá Notice: Undefined variable
información al respecto.
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;
}
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);
new
y simple
en este ejemplo?