Programmgesteuertes Erstellen eines benutzerdefinierten Tokens in einem Modul

23

Wie würden Sie programmgesteuert ein Token erstellen? Ich möchte einige benutzerdefinierte Token für mein Modul hinzufügen.

Lucy
quelle
Die zusätzliche Dokumentation wurde aktualisiert (31.10.2014) und kann unter drupal.org/documentation/modules/token
iStryker 12.03.15

Antworten:

7

In Drupal 6 verwenden Sie hook_token_values().

Mit diesem Hook können Sie Token erstellen. Sie können sie im globalen Bereich erstellen oder Sie können ein Objekt wie einen Knoten oder einen Benutzer verwenden, um die Werte zu setzen.

Sie sollten auch verwenden hook_token_list(), um zu erklären, was Ihre Token sind.

Die token.api- Dokumentation ist ziemlich klar.

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

Ich werde das Ganze nicht veröffentlichen, aber das sollte dir eine gute Idee geben.

Jeremy French
quelle
20

In Drupal 7 ist der Code für den Umgang mit Tokens Teil des Drupal-Kernmoduls.

Die Hooks, die die Token-Module implementieren müssen, sind:

  • hook_token_info () ist der Hook, der Informationen zu den von einem Modul implementierten Token bereitstellt.
  • hook_tokens () ist der Hook, der implementiert werden muss, um die tatsächlichen Werte bereitzustellen, die die Token ersetzen.

Andere Module können die von einem Modul bereitgestellte Token-Implementierung mit hook_token_info_alter () und hook_tokens_alter () ändern .

Anders als im Token-Modul ermöglicht der Code in Drupal Core, den Inhalt eines Tokens nur dann zu erstellen, wenn dies unbedingt erforderlich ist. In Drupal 6 fragt das Token-Modul die Module, die Token implementieren, nach allen Werten für das Token, das sie verwenden hook_token_values(). Dies bedeutet, dass ein Modul den Wert für ein Token berechnen kann, der dann für die zu ersetzenden Token nicht benötigt wird. In Drupal 7 ist die Implementierung von hook_tokens()receive $tokensein Array von zu ersetzenden Tokens als Argument. Das Modul kann dann den Wert eines Tokens berechnen, da es weiß, dass er verwendet wird.

Die Funktion, mit der in Drupal 7 die Token durch ihren Wert ersetzt werden, ist token_replace (). Dies ist die einzige Funktion, mit der die Token durch ihre Werte ersetzt werden.

Weitere Unterschiede zwischen dem Token-Modul für Drupal 6 und dem Code in Drupal 7 sind:

  • In Drupal 7 gibt [node: author] den Namen des Autors zurück. [node: author: mail] gibt die E-Mail-Adresse zurück, die dem Autor eines Knotens zugeordnet ist, und [node: author: url] gibt die URL des Benutzerprofils für den Knotenautor zurück. Mit anderen Worten, es ist möglich, [node: author: xyz] zu verwenden, wobei "xyz" eines der Token ist, die für ein Benutzerobjekt zurückgegeben werden.
  • In Drupal 7 gibt es keine rohen Token. die Implementierung von hook_tokens()get einen Parameter, der dem Hook mitteilt, wann der Inhalt des Tokens bereinigt werden muss; Wenn der Token-Wert nicht bereinigt werden muss, wird der Inhalt nicht an die Funktionen check_plain()oder übergeben filter_xss().
  • In Drupal 7 gibt es keine Funktion, die die Liste der verfügbaren Token anzeigt. Wenn ein Modul die Liste der verfügbaren Token anzeigen muss, muss es die Liste der Token selbst erstellen und in der Beschreibung eines Formularfelds anzeigen. Alternativ kann die im Token-Modul noch verfügbare Theme-Funktion verwendet werden.
kiamlaluno
quelle
8

Ich wollte dem Abschnitt Site-Informationen von Tokens einen neuen Token hinzufügen , der den Namen Stadt trägt . So habe ich es in Drupal 7 gemacht.

 /**
 * 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
quelle
Vielen Dank für ein Beispiel. Sie sind immer hilfsbereit
iStryker
1
So ist das Zeichen in obigem Beispiel wäre: [site:city_name]. Stellen Sie sicher, dass Sie die Caches löschen oder memcached neu starten, falls verwendet.
Kenorb
Hinweis: $sanitizeIn obigem Beispiel ist nicht definiert, daher werden Sie darüber informiert Notice: Undefined variable.
Kenorb
@kenorb gutes Auge, und ich sehe, dass diese Antwort seitdem aktualisiert wurde :)
WebMW
3

Beispiel für Drupal 8 mit dem Knotenobjekt:

Sie können Tokens in Ihr Modul unter mymodule.tokens.inc einfügen, indem Sie hook_token_info () verwenden, um sie zu registrieren, und hook_tokens () für die Ersatzdaten.

Wenn Sie ein benutzerdefiniertes Token für einen vorhandenen Token-Typ erstellen möchten, z. B. für Knoten, müssen Sie Ihr Token in das Subarray in hook_token_info () einfügen. Unter node.tokens.inc im Knotenmodul erfahren Sie, woraus Sie bauen.

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

Für 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;
}

Um den Wert von Tokens in Ihrer Funktion zu ermitteln, ist ein Code ähnlich dem folgenden erforderlich.

$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
quelle
1
Was ist newund simplein diesem Beispiel?
user1359
benutze Drupal \ Core \ Render \ BubbleableMetadata; $ token = \ Drupal :: token (); function modulename_tokens ($ type, $ tokens, array $ data, array $ options, BubbleableMetadata $ bubbleable_metadata) {...}
Karthikeyan Manivasagam
Dies sollte in modulename.tokens.inc
oknate