Bir modülde programlı olarak özel bir belirteç oluşturma


Yanıtlar:


7

Drupal 6'da kullanıyorsunuz hook_token_values().

Bu kanca, belirteçleri oluşturmanıza olanak sağlar. Onları global kapsamda oluşturabilir veya değerleri sıralamak için düğüm gibi bir nesneyi veya bir kullanıcıyı kullanabilirsiniz.

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

Token.api dokümantasyon 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 postalamayacağım ama bu size yüksek bir fikir vermeli.


20

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

Token modüllerinin uygulanması gereken kancalar:

  • hook_token_info () , bir modül tarafından uygulanan belirteçler hakkında bilgi sağlayan kancadır.
  • hook_tokens () , belirteçleri değiştiren 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 belirteç uygulamasını değiştirebilir .

Token modülünden farklı olarak, Drupal çekirdeğindeki kod, yalnızca tam olarak gerekli olduğunda bir token içeriğinin oluşturulmasına izin verir. Drupal 6'da, Token modülü, belirteçleri kullanmak için tüm değerleri belirteçleri uygulayan modüllere sorar hook_token_values(); bu, bir modülün bir token için değeri hesaplayabilmesi anlamına gelir; bu daha sonra değiştirilen tokenler için gerekli değildir. Siteye 7'de, uygulanması hook_tokens()alır $tokens, jeton, bir dizi değişken olarak, değiştirilmesi; modül daha sonra kullanılacağını bilerek, bir jetonun değerini hesaplayabilir.

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

Drupal 6 için Token modülü ile Drupal 7'deki kod arasındaki diğer fark:

  • Drupal 7'de [node: author] yazarın ismini verir; [node: author: mail], bir düğümün yazarı ile ilişkili e-posta adresini ve [node: author: url], düğüm yazarı için 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 yoktur; hook_tokens()belirtecin içeriğinin sterilize edilmesi gerektiğinde çengele söyleyen bir parametrenin uygulanması ; belirteç değerinin sterilize edilmesi gerekmediğinde, içerik işlevlere check_plain()geçilmez filter_xss().
  • Drupal 7'de mevcut jetonların listesini gösteren herhangi bir fonksiyon yoktur. Bir modül mevcut belirteçlerin listesini göstermesi gerekiyorsa, belirteçlerin kendi listesini yapmalı ve onu bir form alanının açıklamasında göstermelidir; alternatif olarak, Token modülünde hala mevcut olan tema işlevini kullanabilir.

8

Şehir adı adlı belirteçlerin Site bilgisi bölümüne yeni bir belirteç eklemek istedim . Drupal 7’de böyle yaptım.

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

Örnek verdiğiniz için teşekkür ederiz. Her zaman yardımcı
olurlar

1
Belirteç yukarıdaki örnekte olacağını Yani: [site:city_name]. Önbellekleri temizlediğinizden veya kullanılıyorsa memcached uygulamasını yeniden başlattığınızdan emin olun.
kenorb

Not: $sanitizeYukarıdaki örnekte tanımlanmadı, bu yüzden bunu anlayacaksınız Notice: Undefined variable.
kenorb

@kenorb iyi göz ve bu cevabın güncellendiğinden beri görüyorum :)
WebMW

3

Drupal 8 için, düğüm nesnesini kullanarak örnek:

Onları kaydetmek için hook_token_info () ve değiştirme verileri için hook_tokens () kullanarak mymodule.tokens.inc adresindeki belirteçleri koyabilirsiniz.

Düğümler gibi mevcut bir belirteç türü için özel bir belirteç oluşturmak istiyorsanız, belirtecinizi hook_token_info () içindeki alt dizinin içine yerleştirmeniz gerekir. Neyin inşa ettiğini görmek için düğüm modülündeki node.tokens.inc dosyasına 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;
}

2

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

İşlevinizde belirteçlerin değerini almak, aşağıdakine benzer bir kod gerektirir.

$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
Bu örnekte newve nedir simple?
user1359

Drupal \ Core \ Render \ BubbleableMetadata kullanın; $ token = \ Drupal :: token (); işlev modulename_tokens ($ türü, $ belirteçleri, $ $ veri dizisi, $ $ dizisi, bubbleableMetadata $ bubbleable_metadata) {...}
Karthikeyan Manivasagam

Bu modulename.tokens.inc
oknate
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.