it-swarm-vi.com

Cách lập trình tạo mã thông báo tùy chỉnh trong mô-đun

Làm thế nào bạn sẽ đi về lập trình tạo mã thông báo? Tôi muốn thêm một số mã thông báo tùy chỉnh cho mô-đun của mình.

23
Lucy

Trong Drupal 6, bạn sử dụng hook_token_values() .

Móc này sẽ cho phép bạn tạo mã thông báo. Bạn có thể tạo chúng trong phạm vi toàn cầu hoặc bạn có thể sử dụng một đối tượng như nút hoặc người dùng để gieo các giá trị.

Bạn cũng nên sử dụng hook_token_list() để giải thích mã thông báo của bạn là gì.

Tài liệu token.api khá rõ ràng.

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

Tôi sẽ không đăng toàn bộ bài viết nhưng điều đó sẽ cho bạn một ý tưởng cấp cao.

7
Jeremy French

Trong Drupal 7 mã để xử lý mã thông báo là một phần của mô đun lõi Drupal.

Các hook mà các mô-đun mã thông báo cần thực hiện là:

  • hook_token_info () là hook cung cấp thông tin về các mã thông báo được thực hiện bởi một mô-đun.
  • hook_tokens () là hook cần được triển khai để cung cấp các giá trị thực tế thay thế các mã thông báo.

Các mô-đun khác có thể thay đổi triển khai mã thông báo được cung cấp từ một mô-đun bằng cách sử dụng hook_token_info_alter ()hook_tokens_alter () .

Khác với mô-đun Mã thông báo, mã trong Drupal chỉ cho phép tạo nội dung của mã thông báo khi thực sự cần thiết. Trong Drupal 6, mô-đun Token sẽ yêu cầu các mô-đun triển khai mã thông báo tất cả các giá trị cho mã thông báo của họ bằng cách sử dụng hook_token_values(); điều này có nghĩa là mô-đun có thể tính giá trị cho mã thông báo mà sau đó không bắt buộc đối với mã thông báo được thay thế. In Drupal 7, việc triển khai hook_tokens() nhận $tokens, Một mảng các mã thông báo sẽ được thay thế, như là đối số, mô-đun sau đó có thể tính giá trị của mã thông báo, biết nó sẽ được sử dụng.

Hàm trong Drupal 7 được sử dụng để thay thế các mã thông báo bằng giá trị của chúng là token_Vplace () , là hàm duy nhất được sử dụng để thay thế các mã thông báo bằng giá trị của chúng.

Sự khác biệt khác giữa mô-đun Token cho Drupal 6 và mã trong Drupal 7 là:

  • Trong Drupal 7, [nút: tác giả] trả về tên của tác giả; [nút: tác giả: mail] trả về địa chỉ email được liên kết với tác giả của một nút và [nút: tác giả: url] trả về URL của hồ sơ người dùng cho tác giả nút. Nói cách khác, có thể sử dụng [nút: tác giả: xyz], trong đó "xyz" là một trong những mã thông báo được trả về cho đối tượng người dùng.
  • Trong Drupal 7, không có mã thông báo thô; việc triển khai hook_tokens() nhận tham số cho biết hook khi nội dung của mã thông báo cần được vệ sinh; giá trị mã thông báo không cần phải được vệ sinh, nội dung không được chuyển đến các hàm check_plain() hoặc filter_xss().
  • Trong Drupal 7, không có bất kỳ chức năng nào hiển thị danh sách các mã thông báo có sẵn. Nếu một mô-đun cần hiển thị danh sách các mã thông báo có sẵn, nó phải tự xây dựng danh sách các mã thông báo và hiển thị nó trong phần mô tả của một trường biểu mẫu, ngoài ra, nó có thể sử dụng chức năng chủ đề vẫn có sẵn trong mô-đun Token.
20
kiamlaluno

Tôi muốn thêm mã thông báo mới vào phần Thông tin trang web của mã thông báo, được gọi là Tên thành phố. Đây là cách tôi đã làm trong 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

For Drupal 8, ví dụ sử dụng đối tượng nút :

Bạn có thể đặt mã thông báo trong mô-đun của mình tại mymodule.tokens.inc bằng hook_token_info () để đăng ký chúng và hook_tokens () cho dữ liệu thay thế.

Nếu bạn muốn tạo mã thông báo tùy chỉnh cho loại mã thông báo hiện có, chẳng hạn như đối với các nút, bạn sẽ cần đặt mã thông báo của mình trong phân khúc trong hook_token_info (). Tham khảo node.tokens.inc trong mô-đun nút để xem những gì bạn đang xây dựng.

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

Dành cho 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;
}

Lấy giá trị của các mã thông báo trong hàm của bạn yêu cầu mã tương tự như mã sau.

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