Odpowiedzi:
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.
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:
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:
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()
.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;
}
[site:city_name]
. Upewnij się, że wyczyściłeś pamięć podręczną lub uruchom ponownie pamięć memcached, jeśli jest używana.
$sanitize
w powyższym przykładzie nie jest zdefiniowany, więc o tym poradzisz Notice: Undefined variable
.
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;
}
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);
new
iw simple
tym przykładzie jest?