Jak programowo utworzyć niestandardowy token w module

23

Jak poszedłbyś programowo utworzyć token? Chcę dodać niestandardowe tokeny do mojego modułu.

Lucy
źródło
Dodatkowa dokumentacja została zaktualizowana (31 października 2014 r.) I można ją znaleźć na stronie drupal.org/documentation/modules/token
iStryker

Odpowiedzi:

7

W Drupal 6 używasz hook_token_values().

Ten hak pozwoli ci tworzyć tokeny. Możesz utworzyć je w zasięgu globalnym lub użyć obiektu takiego jak węzeł lub użytkownik do zapoczątkowania wartości.

Powinieneś także użyć, hook_token_list()aby wyjaśnić, jakie są twoje tokeny.

Dokumentacja token.api jest dość przejrzysta.

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

Nie opublikuję całego X, ale to powinno dać ci pomysł na wysokim poziomie.

Jeremy French
źródło
20

W Drupal 7 kod do obsługi tokenów jest częścią modułu podstawowego Drupal.

Haki, które moduły tokenu muszą zaimplementować, to:

  • hook_token_info () to hook, który dostarcza informacji o tokenach zaimplementowanych przez moduł.
  • hook_tokens () to hook, który należy zaimplementować, aby podać rzeczywiste wartości zastępujące tokeny.

Inne moduły mogą zmieniać implementację tokena dostarczoną z modułu za pomocą hook_token_info_alter () i hook_tokens_alter () .

W odróżnieniu od modułu Token, kod w rdzeniu Drupala pozwala tworzyć zawartość tokena tylko wtedy, gdy jest to absolutnie konieczne. W Drupal 6 moduł Tokenów poprosiłby moduły implementujące tokeny o podanie wszystkich wartości ich tokena hook_token_values(); oznacza to, że moduł może obliczyć wartość tokena, który nie jest wówczas wymagany do wymiany tokena. W Drupal 7, implementacja hook_tokens()otrzymuje $tokens, tablicę tokenów do zastąpienia, jako argument; moduł jest wówczas w stanie obliczyć wartość tokena, wiedząc, że zostanie użyty.

Funkcja, która w Drupal 7 jest używana do zamiany tokenów na ich wartość, to token_replace () , która jest jedyną funkcją używaną do zamiany tokenów na ich wartości.

Inne różnice między modułem Token dla Drupala 6 a kodem w Drupal 7 to:

  • W Drupal 7 [węzeł: autor] zwraca nazwisko autora; [node: autor: mail] zwraca adres e-mail powiązany z autorem węzła, a [node: autor: url] zwraca adres URL profilu użytkownika dla autora węzła. Innymi słowy, można użyć [node: autor: xyz], gdzie „xyz” jest jednym z tokenów zwróconych dla obiektu użytkownika.
  • W Drupal 7 nie ma surowych żetonów; implementacja hook_tokens()parametru get, który informuje hak, kiedy zawartość tokena wymaga dezynfekcji; gdy wartość tokena nie wymaga dezynfekcji, zawartość nie jest przekazywana do funkcji check_plain()lub filter_xss().
  • W Drupal 7 nie ma żadnej funkcji, która wyświetla listę dostępnych tokenów. Jeśli moduł musi wyświetlić listę dostępnych tokenów, musi zbudować listę samych tokenów i pokazać ją w opisie pola formularza; alternatywnie może użyć funkcji motywu dostępnej w module Token.
kiamlaluno
źródło
8

Chciałem dodać nowy token do sekcji informacji o tokenach o nazwie Nazwa miasta . Tak właśnie zrobiłem w 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;
}
Lee Woodman
źródło
Dziękujemy za podanie przykładu. Są zawsze pomocni
iStryker
1
Więc token będzie w powyższym przykładzie: [site:city_name]. Upewnij się, że wyczyściłeś pamięć podręczną lub uruchom ponownie pamięć memcached, jeśli jest używana.
kenorb
Uwaga: $sanitizew powyższym przykładzie nie jest zdefiniowany, więc o tym poradzisz Notice: Undefined variable.
kenorb
@kenorb dobre oko i widzę, że ta odpowiedź została zaktualizowana :)
WebMW
3

W przypadku Drupal 8 przykład użycia obiektu węzła:

Możesz umieścić tokeny w module na mymodule.tokens.inc za pomocą hook_token_info (), aby je zarejestrować i hook_tokens () dla danych zastępczych.

Jeśli chcesz utworzyć niestandardowy token dla istniejącego typu tokenu, na przykład dla węzłów, musisz umieścić token w podtablicy w hook_token_info (). Przejdź do node.tokens.inc w module węzłów, aby zobaczyć, z czego budujesz.

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
źródło
2

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

Uzyskanie wartości tokenów w funkcji wymaga kodu podobnego do następującego.

$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
źródło
1
Co newiw simpletym przykładzie jest?
user1359,
użyj Drupal \ Core \ Render \ BubbleableMetadata; $ token = \ Drupal :: token (); funkcja modulename_tokens ($ typ, $ tokeny, tablica $ dane, tablica $ opcje, BubbleableMetadata $ bubbleable_metadata) {...}
Karthikeyan Manivasagam 11.09.17
Powinno to iść w modulename.tokens.inc
oknate