4

Creation of custom tokens / placeholder for Drupal 7. I searched many forums to get any help regarding the creation of custom tokens but I failed in getting a proper solution that's why I decided to post this topic to help drupal users.

  • hook_token_info
  • hook_tokens($type, $tokens, array $data = array(), array $options = array())
  • token_replace($text, array $data = array(), array $options = array())

For creating custom token we will use three token api function.

<?php
/**
* Implements hook_token_info(). This hook will register tow token lname and fname.
*/
function myhook_token_info() {
  $info['tokens']['custom']['fname'] = array(
    'name' => t('First name'),
    'description' => t('First name re placer for fname '),
  );
  $info['tokens']['custom']['lname'] = array(
    'name' => t('Last name'),
    'description' => t('Last name re placer for lname '),
  );
  return $info;
}

/**
* Implements hook_tokens(). This hook will operate the token and replace it with it's value.
*/
function myhook_tokens($type, $tokens, array $data = array(), array $options = array()) {
    $replacements = array();
    $sanitize = !empty($options['sanitize']);
    if ($type == 'custom') {
        foreach ($tokens as $name => $original) {
              if (array_key_exists($name, $data)) {
                  $replacements[$original] = $data[$name];   
              }
        }
    }
    return $replacements;
}

/**
* Here we will use the token_replace() function to get the actual content after replacement.
*/
function myhook_myfunction() {
    $custom = array();
    $custom['fname'] = 'Rajat';
    $custom['lname'] = 'Gusain';
    $data = $custom;
    $temp = "Full name : [custom:fname] [custom:lname]";
    $temp = token_replace($temp, $data);
// After token replacement $temp variable will contain " Full name : Rajat Gusain"
}
?>
3

What I came up with, fully documented.

/**
* @file
* Provides special token to use with pathauto.
*
* @see http://drupal.org/node/1308488
*/

/**
* Provide information about our custom placeholder/token.
*
* @see http://api.drupal.org/api/drupal/modules--system--system.api.php/function/hook_token_info/7
* @see http://api.lullabot.com/token_example_token_info/7
* @return array
*   An associative array of available tokens and token types.
*/
function MODULE_NAME_token_info() {
  $info['tokens']['node']['pathauto'] = array(
    'name' => t('Pathauto'),
    'description' => t('Title ready for use with pathauto.'),
  );
  return $info;
}

/**
* Provide replacement values for placeholder tokens.
*
* @see http://api.drupal.org/api/drupal/modules--system--system.api.php/function/hook_tokens/7
* @see http://api.lullabot.com/token_example_tokens/7
* @param string $type
*   The machine-readable name of the type (group) of token being replaced, such
*   as 'node', 'user', or another type defined by a hook_token_info()
*   implementation.
* @param array $tokens
*   An array of tokens to be replaced. The keys are the machine-readable token
*   names, and the values are the raw [type:token] strings that appeared in the
*   original text.
* @param array $data (optional)
*   An associative array of data objects to be used when generating replacement
*   values, as supplied in the $data parameter to token_replace().
* @param array $options (optional)
*   An associative array of options for token replacement; see token_replace()
*   for possible values.
* @return array
*   An associative array of replacement values, keyed by the raw [type:token]
*   strings from the original text.
*/
function MODULE_NAME_tokens($type, $tokens, array $data = array(), array $options = array()) {
  $replacements = array();
  $sanitize = !empty($options['sanitize']);

  if ($type == 'node' && !empty($data['node'])) {
    $node = $data['node'];

    foreach ($tokens as $name => $original) {
      switch ($name) {
        case 'pathauto':
          $replacements[$original] = str_replace('&amp;', '&'), 'and',
            $sanitize ? filter_xss($node->title) : $node->title);
          break;
      }
    }
  }

  return $replacements;
}
?>
  • Nice example. It took a quick pass to cleanup some of the whitespace to try to eliminate scrolling. You may also want to check out drupal.org/node/1354 for Drupal docblock conventions, particularly the "Implements hook_foo()." part. Doing this helps with searching for functions in IDEs. – mpdonadio Jul 6 '13 at 14:08

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy