Respostas:
No Drupal 6, você usa hook_token_values()
.
Este gancho permitirá que você crie tokens. Você pode criá-los no escopo global ou pode usar um objeto como um nó ou um usuário para propagar os valores.
Você também deve usar hook_token_list()
para explicar quais são seus tokens.
A documentação do token.api é 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;
}
}
Não vou publicar o X, mas isso deve lhe dar uma ideia de alto nível.
No Drupal 7, o código para manipulação de tokens faz parte do módulo principal do Drupal.
Os ganchos que os módulos de token precisam implementar são:
Outros módulos podem alterar a implementação do token fornecida a partir de um módulo usando hook_token_info_alter () e hook_tokens_alter () .
Diferentemente do módulo Token, o código no núcleo do Drupal permite criar o conteúdo de um token somente quando estritamente necessário. No Drupal 6, o módulo Token solicitaria aos módulos que implementam tokens todos os valores para o uso de token hook_token_values()
; isso significa que um módulo pode calcular o valor de um token que não é necessário para os tokens que estão sendo substituídos. No Drupal 7, a implementação de hook_tokens()
recebe $tokens
, uma matriz de tokens a serem substituídos, como argumento; o módulo poderá calcular o valor de um token, sabendo que ele será usado.
A função que no Drupal 7 é usada para substituir os tokens pelo seu valor é token_replace () , que é a única função usada para substituir os tokens pelos seus valores.
Outra diferença entre o módulo Token para Drupal 6 e o código no Drupal 7 é:
hook_tokens()
get um parâmetro que informa ao gancho quando o conteúdo do token precisa ser higienizado; quando o valor do token não precisa ser higienizado, o conteúdo não é passado para as funções check_plain()
ou filter_xss()
.Eu queria adicionar um novo token à seção de informações do site de tokens, chamada nome da cidade . Foi assim que fiz no 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]
. Certifique-se de limpar os caches ou reiniciar o memcached, se usado.
$sanitize
no exemplo acima não está definido, então você entenderá Notice: Undefined variable
isso.
Para o Drupal 8, exemplo usando o objeto node:
Você pode colocar tokens no seu módulo em mymodule.tokens.inc usando hook_token_info () para registrá-los e hook_tokens () para os dados de substituição.
Se você deseja criar um token personalizado para um tipo de token existente, como para nós, precisará colocá-lo dentro da sub-matriz em hook_token_info (). Consulte node.tokens.inc no módulo node para ver do que você está construindo.
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;
}
Obter o valor dos tokens em sua função requer um código semelhante ao seguinte.
$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
e simple
neste exemplo?