Risposte:
In Drupal 6, usi hook_token_values()
.
Questo hook ti permetterà di creare token. Puoi crearli nell'ambito globale oppure puoi utilizzare un oggetto come un nodo o un utente per eseguire il seeding dei valori.
Dovresti anche usare hook_token_list()
per spiegare quali sono i tuoi token.
La documentazione token.api è abbastanza chiara.
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;
}
}
Non invierò X a pubblicare tutto, ma questo dovrebbe darti un'idea di alto livello.
In Drupal 7 il codice per la gestione dei token fa parte del modulo principale Drupal.
Gli hook che i moduli token devono implementare sono:
Altri moduli possono modificare l'implementazione del token fornita da un modulo utilizzando hook_token_info_alter () e hook_tokens_alter () .
A differenza del modulo token, il codice nel core di Drupal consente di creare il contenuto di un token solo quando strettamente necessario. In Drupal 6, il modulo Token chiederà ai moduli che implementano i token tutti i valori per il loro token usando hook_token_values()
; ciò significa che un modulo può calcolare il valore per un token che non è quindi necessario per i token che vengono sostituiti. In Drupal 7, l'implementazione di hook_tokens()
riceve $tokens
, una serie di token da sostituire, come argomento; il modulo è quindi in grado di calcolare il valore di un token, sapendo che verrà utilizzato.
La funzione che in Drupal 7 viene utilizzata per sostituire i token con il loro valore è token_replace () , che è l'unica funzione utilizzata per sostituire i token con i loro valori.
Altre differenze tra il modulo token per Drupal 6 e il codice in Drupal 7 sono:
hook_tokens()
get un parametro che dice all'hook quando il contenuto del token deve essere disinfettato; quando non è necessario disinfettare il valore del token, il contenuto non viene passato alle funzioni check_plain()
o filter_xss()
.Volevo aggiungere un nuovo token alla sezione delle informazioni sul sito dei token, denominata Nome città . È così che l'ho fatto in 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]
. Assicurati di cancellare le cache o riavviare memcached se usato.
$sanitize
nell'esempio sopra non è definito, quindi lo capirai Notice: Undefined variable
.
Per Drupal 8, esempio usando l'oggetto nodo:
Puoi inserire token nel tuo modulo su mymodule.tokens.inc usando hook_token_info () per registrarli e hook_tokens () per i dati di sostituzione.
Se si desidera creare un token personalizzato per un tipo di token esistente, ad esempio per i nodi, è necessario inserire il token nel sottoarray in hook_token_info (). Fai riferimento a node.tokens.inc nel modulo del nodo per vedere da cosa stai costruendo.
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;
}
Per 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;
}
Ottenere il valore dei token nella tua funzione richiede un codice simile al seguente.
$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
in questo esempio?