Jawaban:
Di Drupal 6, Anda menggunakan hook_token_values()
.
Hook ini akan memungkinkan Anda untuk membuat token. Anda bisa membuat mereka dalam lingkup global atau Anda bisa menggunakan objek seperti node, atau pengguna untuk menabur nilai.
Anda juga harus menggunakan hook_token_list()
untuk menjelaskan apa token Anda.
The token.api dokumentasi cukup jelas.
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;
}
}
Saya tidak akan X memposting semuanya tetapi itu akan memberi Anda ide tingkat tinggi.
Dalam Drupal 7 kode untuk menangani token adalah bagian dari modul inti Drupal.
Kait yang perlu diterapkan modul token adalah:
Modul lain dapat mengubah implementasi token yang disediakan dari modul menggunakan hook_token_info_alter () dan hook_tokens_alter () .
Berbeda dari modul Token, kode dalam inti Drupal memungkinkan untuk membuat konten token hanya ketika benar-benar diperlukan. Dalam Drupal 6, modul Token akan meminta modul menerapkan token semua nilai untuk token mereka menggunakan hook_token_values()
; ini berarti bahwa modul dapat menghitung nilai token yang kemudian tidak diperlukan untuk token yang diganti. Di Drupal 7, pelaksanaan hook_tokens()
menerima $tokens
, array token harus diganti, sebagai argumen; modul ini kemudian dapat menghitung nilai token, tahu itu akan digunakan.
Fungsi yang dalam Drupal 7 digunakan untuk mengganti token dengan nilainya adalah token_replace () , yang merupakan satu-satunya fungsi yang digunakan untuk mengganti token dengan nilainya.
Perbedaan lain antara modul Token untuk Drupal 6 dan kode dalam Drupal 7 adalah:
hook_tokens()
get parameter yang memberitahu hook ketika konten token perlu disanitasi; ketika nilai token tidak perlu disanitasi, konten tidak diteruskan ke fungsi check_plain()
atau filter_xss()
.Saya ingin menambahkan token baru ke bagian informasi situs token, yang disebut nama kota . Ini adalah bagaimana saya melakukannya di 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]
. Pastikan Anda menghapus cache atau memulai memcached jika digunakan.
$sanitize
dalam contoh di atas tidak ditentukan, jadi Anda akan mendapatkannya Notice: Undefined variable
.
Untuk Drupal 8, contoh menggunakan objek simpul:
Anda dapat memasukkan token di modul Anda di mymodule.tokens.inc menggunakan hook_token_info () untuk mendaftarkannya dan hook_tokens () untuk data penggantian.
Jika Anda ingin membuat token khusus untuk jenis token yang ada, seperti untuk node, Anda harus meletakkan token Anda di dalam subarray di dalam hook_token_info (). Lihat node.tokens.inc di modul node untuk melihat apa yang Anda bangun.
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;
}
Untuk 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;
}
Untuk mendapatkan nilai token dalam fungsi Anda memerlukan kode yang mirip dengan yang berikut.
$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
dan simple
dalam contoh ini?