web-dev-qa-db-ja.com

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

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

23
Lucy

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に投稿することはしませんが、それはあなたに高レベルのアイデアを与えるはずです。

7
Jeremy French

Drupal 7では、トークンを処理するためのコードはDrupalコアモジュールの一部です。

トークンモジュールが実装する必要があるフックは次のとおりです。

  • hook_token_info() は、モジュールによって実装されたトークンに関する情報を提供するフックです。
  • hook_tokens() は、トークンを置き換える実際の値を提供するために実装する必要があるフックです。

他のモジュールは、モジュールから提供されるトークンの実装を hook_token_info_alter() および hook_tokens_alter() を使用して変更できます。

Tokenモジュールとは異なり、Drupalコアのコードでは、厳密に必要な場合にのみトークンのコンテンツを作成できます。Drupal 6では、Tokenモジュールはhook_token_values()を使用して、トークンを実装するモジュールにトークンのすべての値を要求します。これは、モジュールがトークンの値を計算できることを意味します。この値は、置き換えられるトークンには必要ありません。In Drupal 7、hook_tokens()の実装は、置き換えられるトークンの配列である_$tokens_を引数として受け取ります;モジュールはそれを知っているトークンの値を計算できます使用されます。

Drupal 7でトークンを値に置き換えるために使用される関数は token_replace() です。これは、トークンを値に置き換えるために使用される唯一の関数です。

Drupal 6のTokenモジュールと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では、利用可能なトークンのリストを表示する関数はありません。モジュールが利用可能なトークンのリストを表示する必要がある場合、モジュールはトークン自体のリストを作成し、フォームフィールドの説明に表示するか、トークンモジュールで引き続き使用できるテーマ関数を使用できます。
20
kiamlaluno

市名と呼ばれるトークンのSite informationセクションに新しいトークンを追加したかったのです。 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;
}
8
Lee Woodman

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

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

ノードなどの既存のトークンタイプのカスタムトークンを作成する場合は、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;
}
4
oknate

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