Câu trả lời:
Trong Drupal 6, bạn sử dụng hook_token_values()
.
Móc này sẽ cho phép bạn tạo mã thông báo. Bạn có thể tạo chúng trong phạm vi toàn cầu hoặc bạn có thể sử dụng một đối tượng như nút hoặc người dùng để gieo các giá trị.
Bạn cũng nên sử dụng hook_token_list()
để giải thích mã thông báo của bạn là gì.
Các token.api tài liệu là khá rõ ràng.
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;
}
}
Tôi sẽ không đăng toàn bộ bài viết nhưng điều đó sẽ cho bạn một ý tưởng cấp cao.
Trong Drupal 7, mã để xử lý mã thông báo là một phần của mô-đun lõi Drupal.
Các hook mà các mô-đun mã thông báo cần thực hiện là:
Các mô-đun khác có thể thay đổi triển khai mã thông báo được cung cấp từ mô-đun bằng hook_token_info_alter () và hook_tokens_alter () .
Khác với mô-đun Token, mã trong lõi Drupal cho phép chỉ tạo nội dung của mã thông báo khi thực sự cần thiết. Trong Drupal 6, mô-đun Token sẽ yêu cầu các mô-đun triển khai mã thông báo tất cả các giá trị cho mã thông báo của họ bằng cách sử dụng hook_token_values()
; điều này có nghĩa là một mô-đun có thể tính giá trị cho mã thông báo mà sau đó không bắt buộc đối với các mã thông báo được thay thế. Trong Drupal 7, việc triển khai hook_tokens()
nhận $tokens
, một loạt các mã thông báo sẽ được thay thế, làm đối số; mô-đun sau đó có thể tính toán giá trị của mã thông báo, biết rằng nó sẽ được sử dụng.
Hàm trong Drupal 7 được sử dụng để thay thế các mã thông báo bằng giá trị của chúng là token_Vplace () , đây là hàm duy nhất được sử dụng để thay thế các mã thông báo bằng các giá trị của chúng.
Sự khác biệt khác giữa mô-đun Token cho Drupal 6 và mã trong Drupal 7 là:
hook_tokens()
nhận một tham số cho biết móc khi nội dung của mã thông báo cần được vệ sinh; khi giá trị mã thông báo không cần phải được vệ sinh, nội dung sẽ không được chuyển đến các chức năng check_plain()
hoặc filter_xss()
.Tôi muốn thêm mã thông báo mới vào phần thông tin Trang web của mã thông báo, được gọi là tên Thành phố . Đây là cách tôi đã làm trong 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]
. Hãy chắc chắn rằng bạn xóa bộ nhớ cache hoặc khởi động lại memcached nếu được sử dụng.
$sanitize
trong ví dụ trên không được xác định, vì vậy bạn sẽ hiểu Notice: Undefined variable
về điều đó.
Đối với Drupal 8, ví dụ sử dụng đối tượng nút:
Bạn có thể đặt mã thông báo trong mô-đun của mình tại mymodule.tokens.inc bằng hook_token_info () để đăng ký chúng và hook_tokens () cho dữ liệu thay thế.
Nếu bạn muốn tạo mã thông báo tùy chỉnh cho loại mã thông báo hiện có, chẳng hạn như đối với các nút, bạn sẽ cần đặt mã thông báo của mình trong phân khúc trong hook_token_info (). Tham khảo node.tokens.inc trong mô-đun nút để xem những gì bạn đang xây dựng.
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;
}
Đối với 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;
}
Lấy giá trị của các mã thông báo trong hàm của bạn yêu cầu mã tương tự như mã sau.
$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
và simple
trong ví dụ này?