Як програмно створити призначену для користувача лексему в модулі


23

Як би ви йти про створення програмного знака? Я хотів би додати деякі призначені для користувача маркери для мого модуля.


Додаткова документація була оновлена (жовтень 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.

Гачки, які необхідно здійснити для лексеми модулів:

  • kuk_token_info () - це гак, який надає інформацію про маркери, реалізовані модулем.
  • hook_tokens () являє собою гачок , який повинен бути реалізований , щоб забезпечити фактичні значення , які замінюють маркери.

Інші модулі можуть змінювати маркера реалізації , що надається з модуля з допомогою hook_token_info_alter () і hook_tokens_alter () .

На відміну від модуля Token, код в ядрі Drupal дозволяє створювати вміст маркера лише при строгій необхідності. У Drupal 6 модуль Token попросить модулі, що реалізують маркери, усі значення для їх використання маркера hook_token_values(); Це означає , що модуль може обчислити значення для маркерів , який в цьому випадку не потрібно для маркерів замінюються. У Drupal 7 реалізація hook_tokens()отримує $tokensмасив лексем, що підлягають заміні, як аргумент; Потім модуль може обчислити значення токена, знаючи, що він буде використаний.

Функція, яка в Drupal 7 використовується для заміни лексем на їх значення, - token_replace () , яка є єдиною функцією, яка використовується для заміни лексем на їх значення.

Інша різниця між модулем Token для Drupal 6 та кодом в Drupal 7 полягає в:

  • В Drupal 7, [вузол: автор] повертає ім'я автора; [node: author: mail] повертає адресу електронної пошти, пов’язану з автором вузла, а [node: author: url] повертає URL-адресу профілю користувача для автора вузла. Іншими словами, можна використовувати [вузол: Автор: XYZ], де «XYZ» на один з маркерів, повернутих для об'єкта користувача.
  • В Drupal 7, немає необроблені маркери; реалізація параметра hook_tokens()get, який повідомляє гачку, коли вміст маркера потребує санітарії; коли значення лексеми не потрібно санітувати, вміст не передається функціям check_plain()або filter_xss().
  • У Drupal 7 немає жодної функції, яка б відображала список доступних жетонів. Якщо через потребу модуля, щоб відобразити список доступних маркерів, він повинен побудувати список лексем собі і показати його в описі поля форми; Крім того, він може використовувати функцію теми, яка все ще доступна в модулі Token.

8

Я хотів додати новий маркер до розділу Інформація про сайт жетонів, який називається Назва міста . Ось як я це зробив у 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

$sanitizeNotice: Undefined variable
kenorb

@kenorb хороший очей, і я бачу , що ця відповідь була з тих пір оновлюється :)
WebMW

3

Для Drupal 8, наприклад, використовуючи об’єкт вузла:

Ви можете розмістити жетони у своєму модулі на сайті mymodule.tokens.inc, використовуючи kuk_token_info (), щоб зареєструвати їх, а для_заміни даних_upload_tokens ().

Якщо ви хочете створити спеціальний маркер для існуючого типу лексеми, наприклад, для вузлів, вам потрібно буде помістити маркер у підмагістраль в межах kuka_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

Для 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
Що newі simpleв цьому прикладі?
user1359

Використання Drupal \ Ядро \ Рендеринг \ BubbleableMetadata; $ Лексема = \ Drupal :: маркер ();

Це повинно йти в modulename.tokens.inc
oknate
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.