モジュールでカスタムトークンをプログラムで作成する方法


23

プログラムでトークンを作成するにはどうしますか?モジュールにカスタムトークンを追加したい。


追加のドキュメントが更新され(2014年10月31日)、drupal.org
documentation /

回答:


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()を使用して、モジュールから提供されるトークン実装を変更できます。

Tokenモジュールとは異なり、Drupalコアのコードでは、厳密に必要な場合にのみトークンのコンテンツを作成できます。Drupal 6では、Tokenモジュールは、トークンを実装するモジュールに、トークンを使用してhook_token_values()、; を使用してトークンのすべての値を要求します。これは、モジュールがトークンの値を計算できることを意味します。この値は、置き換えられるトークンには必要ありません。Drupal 7では、receiveの実装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」はユーザーオブジェクトに対して返されるトークンの1つです。
  • 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を再起動してください。
ケノーブ

注:$sanitize上記の例では定義されていないため、それNotice: Undefined variableについて説明します。
ケノーブ

@kenorb良い目、そして私はこの答えが更新されているのを見ます:)
WebMW

3

Drupal 8の場合、ノードオブジェクトを使用した例:

hook_token_info()を使用してトークンを登録し、置換データ用のhook_tokens()を使用して、mymodule.tokens.incのモジュールにトークンを配置できます。

ノードなどの既存のトークンタイプのカスタムトークンを作成する場合は、hook_token_info()内のサブ配列内にトークンを配置する必要があります。nodeモジュールの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

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

関数でトークンの値を取得するには、次のようなコードが必要です。

$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(); 関数modulename_tokens($ type、$ tokens、配列$ data、配列$ options、BubbleableMetadata $ bubbleable_metadata){...}
Karthikeyan Manivasagam

これはmodulename.tokens.incに
入れる
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.