Como criar programaticamente um token personalizado em um módulo

23

Como você cria programaticamente um token? Desejo adicionar alguns tokens personalizados para o meu módulo.

Lucy
fonte
Documentação adicional foi atualizado (outubro 31,2014) e pode ser encontrada em drupal.org/documentation/modules/token
iStryker

Respostas:

7

No Drupal 6, você usa hook_token_values().

Este gancho permitirá que você crie tokens. Você pode criá-los no escopo global ou pode usar um objeto como um nó ou um usuário para propagar os valores.

Você também deve usar hook_token_list()para explicar quais são seus tokens.

A documentação do token.api é bastante clara.

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

Não vou publicar o X, mas isso deve lhe dar uma ideia de alto nível.

Jeremy French
fonte
20

No Drupal 7, o código para manipulação de tokens faz parte do módulo principal do Drupal.

Os ganchos que os módulos de token precisam implementar são:

  • hook_token_info () é o gancho que fornece informações sobre os tokens implementados por um módulo.
  • hook_tokens () é o gancho que precisa ser implementado para fornecer os valores reais que substituem os tokens.

Outros módulos podem alterar a implementação do token fornecida a partir de um módulo usando hook_token_info_alter () e hook_tokens_alter () .

Diferentemente do módulo Token, o código no núcleo do Drupal permite criar o conteúdo de um token somente quando estritamente necessário. No Drupal 6, o módulo Token solicitaria aos módulos que implementam tokens todos os valores para o uso de token hook_token_values(); isso significa que um módulo pode calcular o valor de um token que não é necessário para os tokens que estão sendo substituídos. No Drupal 7, a implementação de hook_tokens()recebe $tokens, uma matriz de tokens a serem substituídos, como argumento; o módulo poderá calcular o valor de um token, sabendo que ele será usado.

A função que no Drupal 7 é usada para substituir os tokens pelo seu valor é token_replace () , que é a única função usada para substituir os tokens pelos seus valores.

Outra diferença entre o módulo Token para Drupal 6 e o ​​código no Drupal 7 é:

  • No Drupal 7, [nó: autor] retorna o nome do autor; [node: author: mail] retorna o endereço de email associado ao autor de um nó e [node: author: url] retorna a URL do perfil do usuário para o autor do nó. Em outras palavras, é possível usar [node: author: xyz], em que "xyz" é um dos tokens retornados para um objeto de usuário.
  • No Drupal 7, não há tokens brutos; a implementação de hook_tokens()get um parâmetro que informa ao gancho quando o conteúdo do token precisa ser higienizado; quando o valor do token não precisa ser higienizado, o conteúdo não é passado para as funções check_plain()ou filter_xss().
  • No Drupal 7, não há nenhuma função que mostre a lista dos tokens disponíveis. Se um módulo precisar mostrar a lista de tokens disponíveis, ele deverá criar a lista dos tokens e mostrá-lo na descrição de um campo de formulário; Como alternativa, ele pode usar a função de tema ainda disponível no módulo Token.
kiamlaluno
fonte
8

Eu queria adicionar um novo token à seção de informações do site de tokens, chamada nome da cidade . Foi assim que fiz no 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
fonte
Obrigado por fornecer um exemplo. Eles são sempre úteis
iStryker
1
Portanto, o token seria no exemplo acima: [site:city_name]. Certifique-se de limpar os caches ou reiniciar o memcached, se usado.
kenorb 4/09/15
Nota: $sanitizeno exemplo acima não está definido, então você entenderá Notice: Undefined variableisso.
kenorb 4/09/15
@kenorb bom olho, e vejo que esta resposta foi atualizada :)
WebMW
3

Para o Drupal 8, exemplo usando o objeto node:

Você pode colocar tokens no seu módulo em mymodule.tokens.inc usando hook_token_info () para registrá-los e hook_tokens () para os dados de substituição.

Se você deseja criar um token personalizado para um tipo de token existente, como para nós, precisará colocá-lo dentro da sub-matriz em hook_token_info (). Consulte node.tokens.inc no módulo node para ver do que você está construindo.

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
fonte
2

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

Obter o valor dos tokens em sua função requer um código semelhante ao seguinte.

$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
fonte
1
O que é newe simpleneste exemplo?
user1359
use Drupal \ Core \ Render \ BubbleableMetadata; $ token = \ Drupal :: token (); função modulename_tokens ($ type, $ tokens, array $ data, array $ options, BubbleableMetadata $ bubbleable_metadata) {...}
Karthikeyan Manivasagam
Isso deve
ocorrer