it-swarm-id.com

Cara pemrograman membuat token khusus dalam modul

Bagaimana cara Anda membuat token secara terprogram? Saya ingin menambahkan beberapa token khusus untuk modul saya.

23
Lucy

Dalam Drupal 6, Anda menggunakan hook_token_values() .

Kait ini akan memungkinkan Anda untuk membuat token. Anda bisa membuat mereka dalam lingkup global atau Anda bisa menggunakan objek seperti node, atau pengguna untuk menabur nilai.

Anda juga harus menggunakan hook_token_list() untuk menjelaskan apa token Anda.

Dokumentasi token.api cukup jelas.

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

Saya tidak akan X memposting semuanya tetapi itu akan memberi Anda ide tingkat tinggi.

7
Jeremy French

Dalam Drupal 7 kode untuk menangani token adalah bagian dari modul inti Drupal modul.

Kait yang perlu diterapkan modul token adalah:

  • hook_token_info () adalah hook yang memberikan informasi tentang token yang diimplementasikan oleh modul.
  • hook_tokens () adalah hook yang perlu diimplementasikan untuk memberikan nilai aktual yang menggantikan token.

Modul lain dapat mengubah implementasi token yang disediakan dari modul menggunakan hook_token_info_alter () dan hook_tokens_alter () .

Berbeda dari modul Token, kode dalam Drupal core memungkinkan untuk membuat konten token hanya ketika sangat diperlukan. Dalam Drupal 6, modul Token akan meminta modul yang mengimplementasikan token semua nilai untuk token mereka menggunakan hook_token_values(); ini berarti bahwa modul dapat menghitung nilai untuk token yang kemudian tidak diperlukan untuk token yang sedang diganti. Dalam Drupal 7, implementasi hook_tokens() menerima $tokens, Sebuah array token yang akan diganti, sebagai argumen; modul ini kemudian dapat menghitung nilai token, mengetahui itu akan digunakan.

Fungsi yang di Drupal 7 digunakan untuk mengganti token dengan nilainya adalah token_replace () , yang merupakan satu-satunya fungsi yang digunakan untuk mengganti token dengan nilainya.

Perbedaan lain antara modul Token untuk Drupal 6 dan kode dalam Drupal 7 adalah:

  • Dalam Drupal 7, [simpul: penulis] mengembalikan nama penulis; [simpul: penulis: mail] mengembalikan alamat email yang terkait dengan pembuat simpul, dan [simpul: penulis: url] mengembalikan URL profil pengguna untuk pembuat simpul. Dengan kata lain, dimungkinkan untuk menggunakan [simpul: penulis: xyz], di mana "xyz" adalah salah satu token yang dikembalikan untuk objek pengguna.
  • Dalam Drupal 7, tidak ada token mentah; implementasi hook_tokens() mendapatkan parameter yang memberitahu ke hook ketika konten token perlu disanitasi; ketika nilai token tidak perlu disanitasi, konten tidak diteruskan ke fungsi check_plain() atau filter_xss().
  • Dalam Drupal 7, tidak ada fungsi yang menunjukkan daftar token yang tersedia. Jika modul perlu menunjukkan daftar token yang tersedia, itu harus membangun daftar token itu sendiri dan perlihatkan dalam deskripsi bidang formulir, atau dapat juga menggunakan fungsi tema yang masih tersedia dalam modul Token.
20
kiamlaluno

Saya ingin menambahkan token baru ke bagian Informasi situs token, disebut nama Kota. Ini adalah bagaimana saya melakukannya di 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

ntuk Drupal 8, contoh menggunakan objek node:

Anda dapat memasukkan token di modul Anda di mymodule.tokens.inc menggunakan hook_token_info () untuk mendaftarkannya dan hook_tokens () untuk data penggantian.

Jika Anda ingin membuat token khusus untuk jenis token yang ada, seperti untuk node, Anda harus meletakkan token Anda di dalam subarray di dalam hook_token_info (). Lihat node.tokens.inc di modul node untuk melihat apa yang Anda bangun.

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

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

Untuk mendapatkan nilai token dalam fungsi Anda memerlukan kode yang mirip dengan yang berikut.

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