Come creare a livello di codice un token personalizzato in un modulo


23

Come faresti a creare programmaticamente un token? Vorrei aggiungere alcuni token personalizzati per il mio modulo.


Ulteriore documentazione è stata aggiornata (31 ottobre 2014) e può essere trovata su drupal.org/documentation/modules/token
iStryker

Risposte:


7

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.


20

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:

  • hook_token_info () è l'hook che fornisce informazioni sui token implementati da un modulo.
  • hook_tokens () è l'hook che deve essere implementato per fornire i valori effettivi che sostituiscono i token.

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:

  • In Drupal 7, [nodo: autore] restituisce il nome dell'autore; [nodo: autore: posta] restituisce l'indirizzo e-mail associato all'autore di un nodo e [nodo: autore: url] restituisce l'URL del profilo utente per l'autore del nodo. In altre parole, è possibile usare [nodo: autore: xyz], dove "xyz" è uno dei token restituiti per un oggetto utente.
  • In Drupal 7, non ci sono token grezzi; l'implementazione di 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().
  • In Drupal 7, non esiste alcuna funzione che mostri l'elenco dei token disponibili. Se un modulo deve mostrare l'elenco dei token disponibili, deve creare l'elenco dei token stessi e mostrarlo nella descrizione di un campo modulo; in alternativa, può utilizzare la funzione tema ancora disponibile nel modulo Token.

8

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

Grazie per aver fornito un esempio. Sono sempre utili
iStryker

1
Così il token sarebbe nell'esempio di cui sopra: [site:city_name]. Assicurati di cancellare le cache o riavviare memcached se usato.
Kenorb,

Nota: $sanitizenell'esempio sopra non è definito, quindi lo capirai Notice: Undefined variable.
Kenorb,

@kenorb buon occhio, e vedo che questa risposta è stata aggiornata :)
WebMW il

3

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

2

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

1
Che cos'è newe simplein questo esempio?
user1359

usa Drupal \ Core \ Render \ BubbleableMetadata; $ token = \ Drupal :: token (); funzione modulename_tokens ($ type, $ tokens, array $ data, array $ options, BubbleableMetadata $ bubbleable_metadata) {...}
Karthikeyan Manivasagam

Questo dovrebbe andare in modulename.tokens.inc
oknate
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.