cms/drupal/modules/node/node.tokens.inc
changeset 541 e756a8c72c3d
equal deleted inserted replaced
540:07239de796bb 541:e756a8c72c3d
       
     1 <?php
       
     2 
       
     3 /**
       
     4  * @file
       
     5  * Builds placeholder replacement tokens for node-related data.
       
     6  */
       
     7 
       
     8 
       
     9 
       
    10 /**
       
    11  * Implements hook_token_info().
       
    12  */
       
    13 function node_token_info() {
       
    14   $type = array(
       
    15     'name' => t('Nodes'),
       
    16     'description' => t('Tokens related to individual content items, or "nodes".'),
       
    17     'needs-data' => 'node',
       
    18   );
       
    19 
       
    20   // Core tokens for nodes.
       
    21   $node['nid'] = array(
       
    22     'name' => t("Content ID"),
       
    23     'description' => t('The unique ID of the content item, or "node".'),
       
    24   );
       
    25   $node['vid'] = array(
       
    26     'name' => t("Revision ID"),
       
    27     'description' => t("The unique ID of the node's latest revision."),
       
    28   );
       
    29   $node['tnid'] = array(
       
    30     'name' => t("Translation set ID"),
       
    31     'description' => t("The unique ID of the original-language version of this node, if one exists."),
       
    32   );
       
    33   $node['type'] = array(
       
    34     'name' => t("Content type"),
       
    35     'description' => t("The type of the node."),
       
    36   );
       
    37   $node['type-name'] = array(
       
    38     'name' => t("Content type name"),
       
    39     'description' => t("The human-readable name of the node type."),
       
    40   );
       
    41   $node['title'] = array(
       
    42     'name' => t("Title"),
       
    43     'description' => t("The title of the node."),
       
    44   );
       
    45   $node['body'] = array(
       
    46     'name' => t("Body"),
       
    47     'description' => t("The main body text of the node."),
       
    48   );
       
    49   $node['summary'] = array(
       
    50     'name' => t("Summary"),
       
    51     'description' => t("The summary of the node's main body text."),
       
    52   );
       
    53   $node['language'] = array(
       
    54     'name' => t("Language"),
       
    55     'description' => t("The language the node is written in."),
       
    56   );
       
    57   $node['url'] = array(
       
    58     'name' => t("URL"),
       
    59     'description' => t("The URL of the node."),
       
    60   );
       
    61   $node['edit-url'] = array(
       
    62     'name' => t("Edit URL"),
       
    63     'description' => t("The URL of the node's edit page."),
       
    64   );
       
    65 
       
    66   // Chained tokens for nodes.
       
    67   $node['created'] = array(
       
    68     'name' => t("Date created"),
       
    69     'description' => t("The date the node was posted."),
       
    70     'type' => 'date',
       
    71   );
       
    72   $node['changed'] = array(
       
    73     'name' => t("Date changed"),
       
    74     'description' => t("The date the node was most recently updated."),
       
    75     'type' => 'date',
       
    76   );
       
    77   $node['author'] = array(
       
    78     'name' => t("Author"),
       
    79     'description' => t("The author of the node."),
       
    80     'type' => 'user',
       
    81   );
       
    82 
       
    83   return array(
       
    84     'types' => array('node' => $type),
       
    85     'tokens' => array('node' => $node),
       
    86   );
       
    87 }
       
    88 
       
    89 /**
       
    90  * Implements hook_tokens().
       
    91  */
       
    92 function node_tokens($type, $tokens, array $data = array(), array $options = array()) {
       
    93   $url_options = array('absolute' => TRUE);
       
    94   if (isset($options['language'])) {
       
    95     $url_options['language'] = $options['language'];
       
    96     $language_code = $options['language']->language;
       
    97   }
       
    98   else {
       
    99     $language_code = NULL;
       
   100   }
       
   101   $sanitize = !empty($options['sanitize']);
       
   102 
       
   103   $replacements = array();
       
   104 
       
   105   if ($type == 'node' && !empty($data['node'])) {
       
   106     $node = $data['node'];
       
   107 
       
   108     foreach ($tokens as $name => $original) {
       
   109       switch ($name) {
       
   110         // Simple key values on the node.
       
   111         case 'nid':
       
   112           $replacements[$original] = $node->nid;
       
   113           break;
       
   114 
       
   115         case 'vid':
       
   116           $replacements[$original] = $node->vid;
       
   117           break;
       
   118 
       
   119         case 'tnid':
       
   120           $replacements[$original] = $node->tnid;
       
   121           break;
       
   122 
       
   123         case 'type':
       
   124           $replacements[$original] = $sanitize ? check_plain($node->type) : $node->type;
       
   125           break;
       
   126 
       
   127         case 'type-name':
       
   128           $type_name = node_type_get_name($node);
       
   129           $replacements[$original] = $sanitize ? check_plain($type_name) : $type_name;
       
   130           break;
       
   131 
       
   132         case 'title':
       
   133           $replacements[$original] = $sanitize ? check_plain($node->title) : $node->title;
       
   134           break;
       
   135 
       
   136         case 'body':
       
   137         case 'summary':
       
   138           if ($items = field_get_items('node', $node, 'body', $language_code)) {
       
   139             $instance = field_info_instance('node', 'body', $node->type);
       
   140             $field_langcode = field_language('node', $node, 'body', $language_code);
       
   141             // If the summary was requested and is not empty, use it.
       
   142             if ($name == 'summary' && !empty($items[0]['summary'])) {
       
   143               $output = $sanitize ? _text_sanitize($instance, $field_langcode, $items[0], 'summary') : $items[0]['summary'];
       
   144             }
       
   145             // Attempt to provide a suitable version of the 'body' field.
       
   146             else {
       
   147               $output = $sanitize ? _text_sanitize($instance, $field_langcode, $items[0], 'value') : $items[0]['value'];
       
   148               // A summary was requested.
       
   149               if ($name == 'summary') {
       
   150                 if (isset($instance['display']['teaser']['settings']['trim_length'])) {
       
   151                   $trim_length = $instance['display']['teaser']['settings']['trim_length'];
       
   152                 }
       
   153                 else {
       
   154                   // Use default value.
       
   155                   $trim_length = NULL;
       
   156                 }
       
   157                 // Generate an optionally trimmed summary of the body field.
       
   158                 $output = text_summary($output, $instance['settings']['text_processing'] ? $items[0]['format'] : NULL, $trim_length);
       
   159               }
       
   160             }
       
   161             $replacements[$original] = $output;
       
   162           }
       
   163           break;
       
   164 
       
   165         case 'language':
       
   166           $langcode = entity_language('node', $node);
       
   167           $replacements[$original] = $sanitize ? check_plain($langcode) : $langcode;
       
   168           break;
       
   169 
       
   170         case 'url':
       
   171           $replacements[$original] = url('node/' . $node->nid, $url_options);
       
   172           break;
       
   173 
       
   174         case 'edit-url':
       
   175           $replacements[$original] = url('node/' . $node->nid . '/edit', $url_options);
       
   176           break;
       
   177 
       
   178         // Default values for the chained tokens handled below.
       
   179         case 'author':
       
   180           $account = user_load($node->uid);
       
   181           $name = format_username($account);
       
   182           $replacements[$original] = $sanitize ? check_plain($name) : $name;
       
   183           break;
       
   184 
       
   185         case 'created':
       
   186           $replacements[$original] = format_date($node->created, 'medium', '', NULL, $language_code);
       
   187           break;
       
   188 
       
   189         case 'changed':
       
   190           $replacements[$original] = format_date($node->changed, 'medium', '', NULL, $language_code);
       
   191           break;
       
   192       }
       
   193     }
       
   194 
       
   195     if ($author_tokens = token_find_with_prefix($tokens, 'author')) {
       
   196       $author = user_load($node->uid);
       
   197       $replacements += token_generate('user', $author_tokens, array('user' => $author), $options);
       
   198     }
       
   199 
       
   200     if ($created_tokens = token_find_with_prefix($tokens, 'created')) {
       
   201       $replacements += token_generate('date', $created_tokens, array('date' => $node->created), $options);
       
   202     }
       
   203 
       
   204     if ($changed_tokens = token_find_with_prefix($tokens, 'changed')) {
       
   205       $replacements += token_generate('date', $changed_tokens, array('date' => $node->changed), $options);
       
   206     }
       
   207   }
       
   208 
       
   209   return $replacements;
       
   210 }