it-swarm-eu.dev

Jak programově vytvořit vlastní token v modulu

Jak byste postupovali při programovém vytváření tokenu? Chci přidat nějaké vlastní tokeny pro můj modul.

23
Lucy

V Drupal 6) použijete hook_token_values() .

Tento háček vám umožní vytvořit tokeny. Můžete je vytvořit v globálním oboru nebo můžete použít objekt jako uzel nebo uživatele k vložení hodnot.

Měli byste také použít hook_token_list() k vysvětlení, jaké jsou vaše tokeny.

Dokumentace token.api je zcela jasná.

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

Nebudu X zveřejňovat celou věc, ale to by vám mělo poskytnout nápad na vysoké úrovni.

7
Jeremy French

V Drupal 7 je kód pro zpracování tokenů součástí jádrového modulu Drupal.

Háčky, které musí moduly tokenů implementovat, jsou:

  • hook_token_info () je hák, který poskytuje informace o tokenech implementovaných modulem.
  • hook_tokens () je hák, který je třeba implementovat, aby poskytoval skutečné hodnoty, které nahrazují tokeny.

Jiné moduly mohou změnit implementaci tokenu poskytovanou z modulu pomocí hook_token_info_alter () a hook_tokens_alter () .

Na rozdíl od modulu Token umožňuje kód v jádru Drupal vytvářet obsah tokenu pouze v nezbytně nutných případech. V Drupal 6 by modul token požádal moduly implementující tokeny všechny hodnoty pro svůj token pomocí hook_token_values(); to znamená, že modul může vypočítat hodnotu tokenu, který se pak pro nahrazované tokeny nevyžaduje. V Drupal 7 implementace hook_tokens() obdrží $tokens, Pole tokenů, které mají být nahrazeny jako argument; modul je pak schopen vypočítat hodnotu tokenu s vědomím, že bude použit.

Funkce, která se v Drupal 7 používá k nahrazení tokenů jejich hodnotou, je token_replace () , což je jediná funkce použitá k nahrazení tokenů jejich hodnotami.

Další rozdíl mezi modulem Token pro Drupal 6 a kódem v Drupal 7 je:

  • V Drupal 7 vrátí [uzel: autor] jméno autora; [uzel: autor: mail] vrátí e-mailovou adresu spojenou s autorem uzlu a [uzel: autor: url] vrátí adresu URL uživatelského profilu autora uzlu. Jinými slovy je možné použít [uzel: autor: xyz], kde „xyz“ je jedním z tokenů vrácených pro uživatelský objekt.
  • V Drupal 7 nejsou žádné raw tokeny; implementace hook_tokens() získává parametr, který háku řekne, kdy je potřeba dezinfikovat obsah tokenu; Pokud není nutné hodnotu tokenu dezinfikovat, není obsah předán funkcím check_plain() nebo filter_xss().
  • V Drupal 7 neexistuje žádná funkce, která by zobrazovala seznam dostupných tokenů. Pokud modul potřebuje zobrazit seznam dostupných tokenů, musí sestavit seznam samotných tokenů a zobrazit je v popisu pole formuláře; alternativně může použít funkci motivu, která je stále k dispozici v modulu Token.
20
kiamlaluno

Chtěl jsem přidat nový token do části tokenů Informace o web nazvanou Název města. Takto jsem to udělal v 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

Pro Drupal 8, příklad používající objekt uzlu:

Do modulu můžete umístit tokeny na mymodule.tokens.inc pomocí hook_token_info () k jejich registraci a hook_tokens () pro náhradní data.

Pokud chcete vytvořit vlastní token pro existující typ tokenu, například pro uzly, budete muset vložit token do podoblasti uvnitř hook_token_info (). Podívejte se na node.tokens.inc v uzlovém modulu a podívejte se, z čeho se stavíte.

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

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

Získání hodnoty tokenů ve vaší funkci vyžaduje kód podobný následujícímu.

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