1 token.inc token_build_tree($token_type, array $options = array())

Build a tree array of tokens, commonly used for rendering the token browser.


string $token_type: The token type.

array $options: An array of options including the following keys:

  • flat: A boolean if TRUE will only make a flat array of tokens, otherwise child tokens will be inside the 'children' parameter of a token.
  • restricted: A boolean if TRUE will show restricted tokens. Otherwise they will be hidden. Default is FALSE.
  • depth: An integer with the maximum number of token levels to recurse.
  • parents: An optional array with the current parents of the tokens.

Return value

array: An array of token information, keyed by the full token and each containing:

  • name: The translated human-readable name of the token.
  • description: The translated description of the token.
  • raw token: The full token (same as the key of this entry).
  • restricted: Optionally present if the token should only be available in trusted environments.
  • deprecated: Optionally present if the token will be removed from a future version of Backdrop and should not be used.
  • token: The last portion of the token. e.g. in [node:nid], the value would be nid.


core/includes/token.inc, line 507
Backdrop placeholder/token replacement system.


function token_build_tree($token_type, array $options = array()) {
  global $language_content;

  $cache_token = cache('token');

  // Static cache of already built token trees.
  $trees = &backdrop_static(__FUNCTION__, array());

  $options += array(
    'restricted' => FALSE,
    'depth' => 4,
    'data' => array(),
    'values' => FALSE,
    'flat' => FALSE,

  // Do not allow past the maximum token information depth.
  $options['depth'] = min($options['depth'], TOKEN_MAX_DEPTH);

  $tree_cid = "tree:{$token_type}:{$language_content->langcode}:{$options['depth']}";

  // If we do not have this base tree in the static cache, check {cache_token}
  // otherwise generate and store it in the cache.
  if (!isset($trees[$tree_cid])) {
    if ($cache = $cache_token->get($tree_cid)) {
      $trees[$tree_cid] = $cache->data;
    else {
      $options['parents'] = array();
      $trees[$tree_cid] = _token_build_tree($token_type, $options);
      cache_set($tree_cid, $trees[$tree_cid], 'cache', CACHE_PERMANENT);

  $tree = $trees[$tree_cid];

  // If the user has requested a flat tree, convert it.
  if (!empty($options['flat'])) {
    $tree = token_flatten_tree($tree);

  // Fill in token values.
  if (!empty($options['values'])) {
    $token_values = array();
    foreach ($tree as $token => $token_info) {
      if (!empty($token_info['dynamic']) || !empty($token_info['restricted'])) {
      elseif (!isset($token_info['value'])) {
        $token_values[$token_info['token']] = $token;
    if (!empty($token_values)) {
      $token_values = token_generate($token_type, $token_values, $options['data']);
      foreach ($token_values as $token => $replacement) {
        $tree[$token]['value'] = $replacement;

  return $tree;