Cara pemrograman membuat token khusus dalam modul

23

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

Lucy
sumber
Dokumentasi tambahan telah diperbarui (31 Okt 2014) dan dapat ditemukan di drupal.org/documentation/modules/token
iStryker

Jawaban:

7

Di Drupal 6, Anda menggunakan hook_token_values().

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

The token.api dokumentasi 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.

Jeremy French
sumber
20

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

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 inti Drupal memungkinkan untuk membuat konten token hanya ketika benar-benar diperlukan. Dalam Drupal 6, modul Token akan meminta modul menerapkan token semua nilai untuk token mereka menggunakan hook_token_values(); ini berarti bahwa modul dapat menghitung nilai token yang kemudian tidak diperlukan untuk token yang diganti. Di Drupal 7, pelaksanaan hook_tokens()menerima $tokens, array token harus diganti, sebagai argumen; modul ini kemudian dapat menghitung nilai token, tahu itu akan digunakan.

Fungsi yang dalam 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; [node: author: mail] mengembalikan alamat email yang dikaitkan dengan pembuat node, dan [node: author: url] mengembalikan URL profil pengguna untuk pembuat node. 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()get parameter yang memberitahu hook ketika konten token perlu disanitasi; ketika nilai token tidak perlu disanitasi, konten tidak diteruskan ke fungsi check_plain()atau filter_xss().
  • Di 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 menunjukkannya dalam deskripsi bidang formulir; sebagai alternatif, dapat menggunakan fungsi tema yang masih tersedia dalam modul Token.
kiamlaluno
sumber
8

Saya ingin menambahkan token baru ke bagian informasi situs token, yang 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;
}
Lee Woodman
sumber
Terima kasih telah memberikan contoh. Mereka selalu membantu
iStryker
1
Jadi token akan di contoh di atas: [site:city_name]. Pastikan Anda menghapus cache atau memulai memcached jika digunakan.
kenorb
Catatan: $sanitizedalam contoh di atas tidak ditentukan, jadi Anda akan mendapatkannya Notice: Undefined variable.
kenorb
@kenorb mata yang baik, dan saya melihat jawaban ini telah diperbarui :)
WebMW
3

Untuk Drupal 8, contoh menggunakan objek simpul:

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;
}
oknate
sumber
2

Untuk 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);
Karthikeyan Manivasagam
sumber
1
Apa newdan simpledalam contoh ini?
user1359
gunakan Drupal \ Core \ Render \ BubbleableMetadata; $ token = \ Drupal :: token (); function modulename_tokens ($ type, $ toens, array $ data, array $ options, BubbleableMetadata $ bubbleable_metadata) {...}
Karthikeyan Manivasagam
Ini harus masuk dalam modulename.tokens.inc
oknate