답변:
Drupal 6에서는을 사용 hook_token_values()
합니다.
이 후크를 사용하면 토큰을 만들 수 있습니다. 전역 범위에서이를 작성하거나 노드와 같은 오브젝트 또는 사용자를 사용하여 값을 시드 할 수 있습니다.
또한 hook_token_list()
토큰이 무엇인지 설명하는 데 사용해야 합니다.
token.api의 문서는 매우 분명하다.
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;
}
}
X는 모든 것을 게시하지는 않지만 높은 수준의 아이디어를 제공해야합니다.
Drupal 7에서 토큰 처리 코드는 Drupal 코어 모듈의 일부입니다.
토큰 모듈을 구현하는 데 필요한 후크는 다음과 같습니다.
다른 모듈은 hook_token_info_alter () 및 hook_tokens_alter ()를 사용하여 모듈에서 제공되는 토큰 구현을 변경할 수 있습니다 .
토큰 모듈과 달리 Drupal 코어의 코드를 사용하면 꼭 필요한 경우에만 토큰의 내용을 만들 수 있습니다. Drupal 6에서 토큰 모듈은 토큰을 구현하는 모듈에 hook_token_values()
; 이는 모듈이 토큰의 값을 계산할 수 있음을 의미하며 교체 할 토큰에는 필요하지 않습니다. 드루팔 7에서의 구현은 hook_tokens()
수신 $tokens
토큰의 배열은 인수로 교체하는 단계; 그러면 모듈은 토큰의 가치를 계산하여 토큰의 가치를 계산할 수 있습니다.
Drupal 7에서 토큰을 값으로 바꾸는 데 사용되는 함수 는 token_replace () 이며, 토큰을 값으로 바꾸는 데 사용되는 유일한 함수입니다.
Drupal 6의 토큰 모듈과 Drupal 7의 코드 간의 다른 차이점은 다음과 같습니다.
hook_tokens()
토큰 요구 사항의 내용을 살균 할 수있는 후크에 알려주는 매개 변수를 얻을; 토큰 값을 소독 할 필요가없는 경우 콘텐츠가 check_plain()
또는 함수에 전달되지 않습니다 filter_xss()
.City name 이라는 토큰 의 사이트 정보 섹션에 새 토큰을 추가하고 싶었습니다 . 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]
있습니다. 캐시를 지우거나 사용 된 경우 memcached를 다시 시작하십시오.
$sanitize
위의 예에서는 정의되어 있지 않으므로 그에 Notice: Undefined variable
대해 알게 될 것 입니다.
Drupal 8의 경우 노드 객체를 사용하는 예 :
hook_token_info ()를 사용하여 모듈에 mymodule.tokens.inc의 토큰을 등록하고 교체 데이터를 위해 hook_tokens ()를 사용할 수 있습니다.
노드와 같은 기존 토큰 유형에 대한 사용자 지정 토큰을 만들려면 hook_token_info () 내의 하위 배열 내에 토큰을 넣어야합니다. 노드 모듈에서 node.tokens.inc를 참조하여 무엇을 구축하고 있는지 확인하십시오.
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;
}
드루팔 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;
}
함수에서 토큰의 가치를 얻으려면 다음과 유사한 코드가 필요합니다.
$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
과 simple
이 예에서는?