You are here

token_node.inc in Token 5

Same filename and directory in other branches
  1. 6 token_node.inc

Implementations of token module hooks for the core node and book modules.

The token module requires specific hooks to be added to modules so that those modules can return data about their objects to the token API. Until and unless token becomes a part of core, the implementations of the token hooks for core modules are provided in the token module itself.

File

token_node.inc
View source
<?php

/**
 * @file
 * Implementations of token module hooks for the core node and book modules.
 *
 * The token module requires specific hooks to be added to modules
 * so that those modules can return data about their objects to the
 * token API.  Until and unless token becomes a part of core, the
 * implementations of the token hooks for core modules are provided
 * in the token module itself.
 *
 * @ingroup token
 */

/**
 * Implementation of hook_token_values().
 */
function node_token_values($type, $object = NULL, $options = array()) {
  $values = array();
  switch ($type) {
    case 'node':
      $node = $object;
      $account = db_fetch_object(db_query("SELECT name, mail FROM {users} WHERE uid = %d", $node->uid));

      // Adjust for the anonymous user name.
      if (!$node->uid && !$account->name) {
        $account->name = variable_get('anonymous', t('Anonymous'));
      }
      $values['nid'] = $node->nid;
      $values['type'] = $node->type;
      $values['type-name'] = node_get_types('name', $node->type);
      $values['title'] = check_plain($node->title);
      $values['title-raw'] = $node->title;
      $values['node-path-raw'] = drupal_get_path_alias('node/' . $node->nid);
      $values['node-path'] = check_plain($values['node-path-raw']);
      $values['node-url'] = url('node/' . $node->nid, NULL, NULL, TRUE);
      $values['author-uid'] = $node->uid;
      $values['author-name'] = check_plain($account->name);
      $values['author-name-raw'] = $account->name;
      $values['author-mail'] = check_plain($account->mail);
      $values['author-mail-raw'] = $account->mail;
      $values['log-raw'] = isset($node->log) ? $node->log : '';
      $values['log'] = filter_xss($values['log-raw']);
      if (module_exists('comment')) {
        $values['node_comment_count'] = isset($node->comment_count) ? $node->comment_count : 0;
        $values['unread_comment_count'] = comment_num_new($node->nid);
      }
      else {
        $values['node_comment_count'] = 0;
        $values['unread_comment_count'] = 0;
      }
      if (isset($node->created)) {
        $values += token_get_date_token_values($node->created);
      }
      if (isset($node->changed)) {
        $values += token_get_date_token_values($node->changed, 'mod-');
      }

      // Now get the menu related information.
      global $_menu;
      $trail = array();
      $trail_raw = array();
      $original_mid = token_menu_get_mid('node/' . $node->nid);
      $mid = $original_mid;
      while ($mid && $_menu['visible'][$mid] && $_menu['visible'][$mid]['pid'] != 0) {
        array_unshift($trail, check_plain($_menu['visible'][$mid]['title']));
        $mid = $_menu['visible'][$mid]['pid'];
      }

      // One more time, unfiltered
      $mid = $original_mid;
      while ($mid && $_menu['visible'][$mid] && $_menu['visible'][$mid]['pid'] != 0) {
        array_unshift($trail_raw, $_menu['visible'][$mid]['title']);
        $mid = $_menu['visible'][$mid]['pid'];
      }
      if (isset($trail)) {
        $values['menupath'] = implode('/', $trail);
        $values['menupath-raw'] = implode('/', $trail_raw);
        $values['menu'] = check_plain($_menu['visible'][$mid]['title']);
        $values['menu-raw'] = $_menu['visible'][$mid]['title'];
      }
      else {
        $values['menu'] = '';
        $values['menu-raw'] = '';
        $values['menupath'] = '';
        $values['menupath-raw'] = '';
      }

      // And now taxonomy, which is a bit more work. This code is adapted from
      // pathauto's handling code; it's intended for compatibility with it.
      if (module_exists('taxonomy') && !empty($node->taxonomy) && is_array($node->taxonomy)) {
        foreach ($node->taxonomy as $term) {
          $original_term = $term;
          if ((object) $term) {

            // With free-tagging it's somewhat hard to get the tid, vid, name values
            // Rather than duplicating taxonomy.module code here you should make sure your calling module
            // has a weight of at least 1 which will run after taxonomy has saved the data which allows us to
            // pull it out of the db here.
            if (!isset($term->name) || !isset($term->tid)) {
              $vid = db_result(db_query_range("SELECT t.vid FROM {term_node} r INNER JOIN {term_data} t ON r.tid = t.tid INNER JOIN {vocabulary} v ON t.vid = v.vid WHERE r.nid = %d ORDER BY v.weight, t.weight, t.name", $object->nid, 0, 1));
              if (!$vid) {
                continue;
              }
              $term = db_fetch_object(db_query_range("SELECT t.tid, t.name FROM {term_data} t INNER JOIN {term_node} r ON r.tid = t.tid WHERE t.vid = %d AND r.nid = %d ORDER BY t.weight", $vid, $object->nid, 0, 1));
              $term->vid = $vid;
            }

            // Ok, if we still don't have a term name maybe this is a pre-taxonomy submit node
            // So if it's a number we can get data from it
            if (!isset($term->name) && is_array($original_term)) {
              $tid = array_shift($original_term);
              if (is_numeric($tid)) {
                $term = taxonomy_get_term($tid);
              }
            }
            $values['term'] = check_plain($term->name);
            $values['term-raw'] = $term->name;
            $values['term-id'] = $term->tid;
            $vid = $term->vid;
            if (!empty($vid)) {
              $vocabulary = taxonomy_get_vocabulary($vid);
              $values['vocab'] = check_plain($vocabulary->name);
              $values['vocab-raw'] = $vocabulary->name;
              $values['vocab-id'] = $vocabulary->vid;
            }

            // The 'catpath' (and 'cat') tokens have been removed, as they caused quite a bit of confusion,
            // and the catpath was a relatively expensive query when the taxonomy tree was deep.
            //
            // It existed only to provide forward-compatability with pathauto module, and
            // for most uses of token.module, it was a relatively useless token -- it exposed
            // a list of term names formatted as a URL/path string. Once pathauto supports
            // tokens, *it* should handle this catpath alias as it's the primary consumer.
            break;
          }
        }
      }

      // It's possible to leave that block and still not have good data.
      // So, we test for these and if not set, set them.
      if (!isset($values['term'])) {
        $values['term'] = '';
        $values['term-raw'] = '';
        $values['term-id'] = '';
        $values['vocab'] = '';
        $values['vocab-raw'] = '';
        $values['vocab-id'] = '';
      }
      break;
  }
  return $values;
}

/**
 * Implementation of hook_token_list().
 */
function node_token_list($type = 'all') {
  if ($type == 'node' || $type == 'all') {
    $tokens['node']['nid'] = t('The unique ID of the content item, or "node".');
    $tokens['node']['type'] = t('The type of the node.');
    $tokens['node']['type-name'] = t('The human-readable name of the node type.');
    $tokens['node']['title'] = t('The title of the node.');
    $tokens['node']['title-raw'] = t('The title of the node.');
    $tokens['node']['node-path'] = t('The URL alias of the node.');
    $tokens['node']['node-path-raw'] = t('The URL alias of the node.');
    $tokens['node']['node-url'] = t('The URL of the node.');
    $tokens['node']['author-uid'] = t("The unique ID of the author of the node.");
    $tokens['node']['author-name'] = t("The login name of the author of the node.");
    $tokens['node']['author-name-raw'] = t("The login name of the author of the node.");
    $tokens['node']['author-mail'] = t("The email address of the author of the node.");
    $tokens['node']['author-mail-raw'] = t("The email address of the author of the node.");
    $tokens['node']['log'] = t('The explanation of the most recent changes made to the node.');
    $tokens['node']['log-raw'] = t('The explanation of the most recent changes made to the node.');
    $tokens['node'] += token_get_date_token_info(t('Node creation'));
    $tokens['node'] += token_get_date_token_info(t('Node modification'), 'mod-');
    if (module_exists('comment')) {
      $tokens['node']['node_comment_count'] = t("The number of comments posted on a node.");
      $tokens['node']['unread_comment_count'] = t("The number of comments posted on a node since the reader last viewed it.");
    }
    if (module_exists('taxonomy')) {
      $tokens['node']['term'] = t("Name of top taxonomy term");
      $tokens['node']['term-raw'] = t("Unfiltered name of top taxonomy term.");
      $tokens['node']['term-id'] = t("ID of top taxonomy term");
      $tokens['node']['vocab'] = t("Name of top term's vocabulary");
      $tokens['node']['vocab-raw'] = t("Unfiltered name of top term's vocabulary.");
      $tokens['node']['vocab-id'] = t("ID of top term's vocabulary");

      // Temporarily disabled -- see notes in node_token_values.
      // $tokens['node']['catpath']        = t("Full taxonomy tree for the topmost term");
    }
    if (module_exists('menu')) {
      $tokens['node']['menu'] = t("The name of the menu the node belongs to.");
      $tokens['node']['menu-raw'] = t("The name of the menu the node belongs to.");
      $tokens['node']['menupath'] = t("The menu path (as reflected in the breadcrumb), not including Home or [menu]. Separated by /.");
      $tokens['node']['menupath-raw'] = t("The unfiltered menu path (as reflected in the breadcrumb), not including Home or [menu]. Separated by /.");
    }
    return $tokens;
  }
}

/**
 * Implementation of hook_token_values() for book nodes
 */
function book_token_values($type, $object = NULL, $options = array()) {
  if ($type == 'node') {
    $node = $object;

    // Initialize some variables to empty.
    $tokens['book'] = '';
    $tokens['book-raw'] = '';
    $tokens['book_id'] = '';
    $tokens['bookpath'] = '';
    $tokens['bookpath-raw'] = '';
    if (!empty($node->parent)) {
      $path = book_location($node);
      $tokens['book'] = check_plain($path[0]->title);
      $tokens['book-raw'] = $path[0]->title;
      $tokens['book_id'] = $node->parent;
      $bookhierarchy = book_location($node);
      $bookpath = '';
      $bookpath_raw = '';
      foreach ($bookhierarchy as $bookelement) {
        if ($bookpath == '') {
          $bookpath = check_plain($bookelement->title);
          $bookpath_raw = $bookelement->title;
        }
        else {
          $bookpath = $bookpath . '/' . check_plain($bookelement->title);
          $bookpath_raw = $bookpath_raw . '/' . $bookelement->title;
        }
      }
      $tokens['bookpath'] = $bookpath;
      $tokens['bookpath-raw'] = $bookpath_raw;
    }
    return $tokens;
  }
}
function book_token_list($type) {
  if ($type == 'node' || $type == 'all') {
    $list['book']['book'] = t("The title of the node's book parent.");
    $list['book']['book_id'] = t("The id of the node's book parent.");
    $list['book']['bookpath'] = t("The titles of all parents in the node's book hierarchy.");
    $list['book']['book-raw'] = t("The unfiltered title of the node's book parent.");
    $list['book']['bookpath-raw'] = t("The unfiltered titles of all parents in the node's book hierarchy.");
    return $list;
  }
}

/**
 * Check if mid/path is present in the menu.
 *
 * @param $in
 *   Numeric input is treated as a menu-id, strings as src-paths.
 * @return
 *   An existing mid, or 0 if none found.
 */
function token_menu_get_mid($in) {
  global $_menu;
  if (!is_numeric($in)) {
    if (isset($_menu['path index'][$in])) {
      $mid = $_menu['path index'][$in];
    }
    else {
      $mid = 0;
    }
  }
  else {
    if (!isset($_menu['visible'][$in])) {
      $mid = 0;
    }
  }

  // Temporary paths would break much of this module.
  if ($mid < 0) {
    $mid = 0;
  }
  return $mid;
}

Functions

Namesort descending Description
book_token_list
book_token_values Implementation of hook_token_values() for book nodes
node_token_list Implementation of hook_token_list().
node_token_values Implementation of hook_token_values().
token_menu_get_mid Check if mid/path is present in the menu.