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


23

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.


Tài liệu bổ sung đã được cập nhật (ngày 31 tháng 10 năm 2014) và có thể được tìm thấy tại drupal.org/documentation/modules/token
iStryker

Câu trả lời:


7

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ì.

Các token.api tài liệu là 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.


20

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ô-đun bằng hook_token_info_alter ()hook_tokens_alter () .

Khác với mô-đun Token, mã trong lõi Drupal cho phép chỉ 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ột 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 các mã thông báo được thay thế. Trong Drupal 7, việc triển khai hook_tokens()nhận $tokens, một loạt các mã thông báo sẽ được thay thế, làm đối số; mô-đun sau đó có thể tính toán giá trị của mã thông báo, biết rằng 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 () , đây là hàm duy nhất được sử dụng để thay thế các mã thông báo bằng các 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 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 một đố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 một tham số cho biết móc khi nội dung của mã thông báo cần được vệ sinh; khi giá trị mã thông báo không cần phải được vệ sinh, nội dung sẽ không được chuyển đến các chức năng 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 xây dựng danh sách các mã thông báo đó và hiển thị nó trong mô tả của trường biểu mẫu; cách khác, nó có thể sử dụng chức năng chủ đề vẫn có sẵn trong mô-đun Token.

8

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

Cảm ơn đã cung cấp một ví dụ. Chúng luôn hữu ích
iStryker

1
Vì vậy, mã thông báo sẽ ở trong ví dụ trên : [site:city_name]. Hãy chắc chắn rằng bạn xóa bộ nhớ cache hoặc khởi động lại memcached nếu được sử dụng.
kenorb

Lưu ý: $sanitizetrong ví dụ trên không được xác định, vì vậy bạn sẽ hiểu Notice: Undefined variablevề điều đó.
kenorb

@kenorb mắt tốt, và tôi thấy câu trả lời này đã được cập nhật :)
WebMW

3

Đối với 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;
}

2

Đối với 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);

1
Cái gì newsimpletrong ví dụ này?
dùng1359

sử dụng Drupal \ Core \ Render \ BubblizableMetadata; $ token = \ Drupal :: mã thông báo (); hàm modulename_tokens ($ type, $ tokens, mảng $ data, mảng $ tùy chọn, BubblizableMetadata $ bubblizable_metadata) {...}
Karthikeyan Manivasagam

Điều này sẽ có trong
modulename.tokens.inc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.