web-gelistirme-sc.com

Bir modülde programlı olarak özel bir belirteç nasıl oluşturulur

Programlı olarak bir belirteç oluşturmayı nasıl başardınız? Modülüm için bazı özel jetonlar eklemek istiyorum.

23
Lucy

Drupal 6 içinde hook_token_values() kullanırsınız.

Bu kanca, jeton oluşturmanıza izin verecektir. Bunları genel kapsamda oluşturabilir veya düğüm gibi bir nesneyi veya değerleri tohumlamak için bir kullanıcı kullanabilirsiniz.

Jetonlarınızın ne olduğunu açıklamak için ayrıca hook_token_list() kullanmalısınız.

token.api belgeleri oldukça açıktır.

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

Her şeyi X yayınlamayacağım, ancak bu size üst düzey bir fikir vermeli.

7
Jeremy French

Drupal 7'de, belirteçleri işleme kodu Drupal çekirdek modülünün bir parçasıdır.

Belirteç modüllerinin uygulaması gereken kancalar şunlardır:

  • hook_token_info () , bir modül tarafından uygulanan jetonlar hakkında bilgi sağlayan kancadır.
  • hook_tokens () , belirteçlerin yerine geçen gerçek değerleri sağlamak için uygulanması gereken kancadır.

Diğer modüller hook_token_info_alter () ve hook_tokens_alter () kullanarak bir modülden sağlanan simge uygulamasını değiştirebilir.

Token modülünden farklı olarak, Drupal core'daki kod, yalnızca kesinlikle gerekli olduğunda bir token içeriği oluşturmaya izin verir. Drupal 6'da, Token modülü, jeton için tüm değerleri hook_token_values() kullanarak jeton uygulayan modüllere soracaktır; bu, bir modülün bir token değerini değiştirebileceği anlamına gelir; bu, daha sonra değiştirilen tokenlar için gerekli değildir. Drupal 7'de, hook_tokens() uygulamasının yerine argüman olarak değiştirilecek bir dizi token $tokens Verilir; modül daha sonra kullanılacağını bilerek bir belirtecin değerini hesaplayabilir.

Jetonları değerleriyle değiştirmek için Drupal 7'de kullanılan işlev, belirteçleri değerleriyle değiştirmek için kullanılan tek işlev olan token_replace () işlevidir.

Drupal 6 için Token modülü ile Drupal 7 içindeki kod arasındaki diğer farklar:

  • Drupal 7'de [düğüm: yazar] yazarın adını döndürür; [düğüm: yazar: posta], bir düğümün yazarıyla ilişkili e-posta adresini ve [düğüm: yazar: url], düğüm yazarının kullanıcı profilinin URL'sini döndürür. Başka bir deyişle, [node: author: xyz] kullanmak mümkündür, burada "xyz" bir kullanıcı nesnesi için döndürülen belirteçlerden biridir.
  • Drupal 7'de ham belirteçler yok; hook_tokens() uygulamasının, token içeriğinin sanitize edilmesi gerektiğinde kancayı söyleyen bir parametre alması; jeton değerinin sterilize edilmesi gerekmediğinde, içerik check_plain() veya filter_xss() işlevlerine geçirilmez.
  • Drupal 7'de, kullanılabilir belirteçlerin listesini gösteren herhangi bir işlev yoktur. Bir modülün kullanılabilir belirteçlerin listesini göstermesi gerekiyorsa, belirteçlerin listesini oluşturmalı ve bir form alanının açıklamasında göstermelidir; alternatif olarak, Token modülünde hala bulunan tema işlevini kullanabilir.
20
kiamlaluno

Şehir adı adlı jetonların Site bilgileri bölümüne yeni bir jeton eklemek istedim. Ben böyle yaptım 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

Drupal 8, düğüm nesnesini kullanan örnek:

Modülünüze mymodule.tokens.inc adresindeki jetonları, bunları kaydetmek için hook_token_info () ve değiştirme verileri için hook_tokens () kullanarak koyabilirsiniz.

Düğümler gibi mevcut bir belirteç türü için özel bir belirteç oluşturmak istiyorsanız, belirteçinizi hook_token_info () içindeki alt dizinin içine koymanız gerekir. Neyi geliştirdiğinizi görmek için düğüm modülündeki node.tokens.inc'e bakın.

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

Drupal 8 için

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

İşleçinizde belirteçlerin değerini elde etmek için aşağıdakine benzer kodlar gerekir.

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