프로그래밍 방식으로 모듈에서 사용자 정의 토큰을 만드는 방법


23

프로그래밍 방식으로 토큰을 만드는 방법은 무엇입니까? 내 모듈에 대한 사용자 지정 토큰을 추가하고 싶습니다.


추가 문서는 OCT (31,2014) 업데이트되었으며에서 찾을 수 있습니다 drupal.org/documentation/modules/token
iStryker

답변:


7

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는 모든 것을 게시하지는 않지만 높은 수준의 아이디어를 제공해야합니다.


20

Drupal 7에서 토큰 처리 코드는 Drupal 코어 모듈의 일부입니다.

토큰 모듈을 구현하는 데 필요한 후크는 다음과 같습니다.

  • hook_token_info () 는 모듈이 구현 한 토큰에 대한 정보를 제공하는 후크입니다.
  • hook_tokens () 는 토큰을 대체하는 실제 값을 제공하기 위해 구현해야하는 후크입니다.

다른 모듈은 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의 코드 간의 다른 차이점은 다음과 같습니다.

  • Drupal 7에서 [node : author]는 저자의 이름을 반환합니다. [node : author : mail]은 노드 작성자와 연관된 이메일 주소를 리턴하고 [node : author : url]은 노드 작성자에 대한 사용자 프로파일의 URL을 리턴합니다. 다시 말해, [node : author : xyz]를 사용할 수 있습니다. 여기서 "xyz"는 사용자 개체에 대해 반환 된 토큰 중 하나입니다.
  • Drupal 7에는 원시 토큰이 없습니다. 의 구현 hook_tokens()토큰 요구 사항의 내용을 살균 할 수있는 후크에 알려주는 매개 변수를 얻을; 토큰 값을 소독 할 필요가없는 경우 콘텐츠가 check_plain()또는 함수에 전달되지 않습니다 filter_xss().
  • Drupal 7에는 사용 가능한 토큰 목록을 표시하는 기능이 없습니다. 모듈이 사용 가능한 토큰 목록을 표시해야하는 경우 토큰 자체 목록을 작성하고 양식 필드의 설명에 표시해야합니다. 또는 토큰 모듈에서 여전히 사용 가능한 테마 기능을 사용할 수 있습니다.

8

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

예제를 제공해 주셔서 감사합니다. 그들은 항상 도움이됩니다
iStryker

1
따라서 토큰은 위의 예에 [site:city_name]있습니다. 캐시를 지우거나 사용 된 경우 memcached를 다시 시작하십시오.
kenorb

참고 : $sanitize위의 예에서는 정의되어 있지 않으므로 그에 Notice: Undefined variable대해 알게 될 것 입니다.
kenorb

@ kenorb 좋은 눈, 그리고 나는이 답변이 업데이트 된 것을 본다 :)
WebMW

3

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

2

드루팔 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);

1
무엇 newsimple이 예에서는?
user1359

Drupal \ Core \ Render \ BubbleableMetadata를 사용하십시오. $ token = \ Drupal :: token (); function modulename_tokens ($ type, $ tokens, 배열 $ data, 배열 $ options, BubbleableMetadata $ bubbleable_metadata) {...}
Karthikeyan Manivasagam

이것은 modulename.tokens.inc
oknate에 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.