comment.tokens.inc 9.22 KB
Newer Older
1 2 3 4 5 6 7 8
<?php

/**
 * @file
 * Builds placeholder replacement tokens for comment-related data.
 */

/**
9
 * Implements hook_token_info().
10 11 12 13 14 15 16 17
 */
function comment_token_info() {
  $type = array(
    'name' => t('Comments'),
    'description' => t('Tokens for comments posted on the site.'),
    'needs-data' => 'comment',
  );

18 19
  // @todo Make this work per field. See http://drupal.org/node/2031903
  $entity['comment-count'] = array(
20
    'name' => t("Comment count"),
21
    'description' => t("The number of comments posted on an entity."),
22
  );
23
  $entity['comment-count-new'] = array(
24
    'name' => t("New comment count"),
25
    'description' => t("The number of comments posted on an entity since the reader last viewed it."),
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
  );

  // Core comment tokens
  $comment['cid'] = array(
    'name' => t("Comment ID"),
    'description' => t("The unique ID of the comment."),
  );
  $comment['hostname'] = array(
    'name' => t("IP Address"),
    'description' => t("The IP address of the computer the comment was posted from."),
  );
  $comment['name'] = array(
    'name' => t("Name"),
    'description' => t("The name left by the comment author."),
  );
  $comment['mail'] = array(
    'name' => t("Email address"),
    'description' => t("The email address left by the comment author."),
  );
  $comment['homepage'] = array(
    'name' => t("Home page"),
    'description' => t("The home page URL left by the comment author."),
  );
  $comment['title'] = array(
    'name' => t("Title"),
    'description' => t("The title of the comment."),
  );
  $comment['body'] = array(
    'name' => t("Content"),
    'description' => t("The formatted content of the comment itself."),
  );
  $comment['url'] = array(
    'name' => t("URL"),
    'description' => t("The URL of the comment."),
  );
  $comment['edit-url'] = array(
    'name' => t("Edit URL"),
    'description' => t("The URL of the comment's edit page."),
  );

  // Chained tokens for comments
  $comment['created'] = array(
    'name' => t("Date created"),
    'description' => t("The date the comment was posted."),
    'type' => 'date',
  );
72 73 74 75 76
  $comment['changed'] = array(
    'name' => t("Date changed"),
    'description' => t("The date the comment was most recently updated."),
    'type' => 'date',
  );
77 78 79 80 81
  $comment['parent'] = array(
    'name' => t("Parent"),
    'description' => t("The comment's parent, if comment threading is active."),
    'type' => 'comment',
  );
82 83 84 85 86 87 88
  $comment['entity'] = array(
    'name' => t("Entity"),
    'description' => t("The entity the comment was posted to."),
    'type' => 'entity',
  );
  // Support legacy comment node tokens, since tokes are embedded in user data
  // and can't be upgraded directly.
89 90
  $comment['node'] = array(
    'name' => t("Node"),
91
    'description' => t("DEPRECATED: The node the comment was posted to."),
92 93 94 95 96 97 98 99 100 101 102
    'type' => 'node',
  );
  $comment['author'] = array(
    'name' => t("Author"),
    'description' => t("The author of the comment, if they were logged in."),
    'type' => 'user',
  );

  return array(
    'types' => array('comment' => $type),
    'tokens' => array(
103
      'entity' => $entity,
104
      'comment' => $comment,
105 106
      // Support deprecated node tokens.
      'node' => $entity,
107 108 109 110 111
    ),
  );
}

/**
112
 * Implements hook_tokens().
113 114
 */
function comment_tokens($type, $tokens, array $data = array(), array $options = array()) {
115
  $token_service = \Drupal::token();
116

117
  $url_options = array('absolute' => TRUE);
118 119 120
  if (isset($options['langcode'])) {
    $url_options['language'] = language_load($options['langcode']);
    $langcode = $options['langcode'];
121 122
  }
  else {
123
    $langcode = NULL;
124 125 126 127 128 129
  }
  $sanitize = !empty($options['sanitize']);

  $replacements = array();

  if ($type == 'comment' && !empty($data['comment'])) {
130
    /** @var \Drupal\comment\CommentInterface $comment */
131 132 133 134 135 136
    $comment = $data['comment'];

    foreach ($tokens as $name => $original) {
      switch ($name) {
        // Simple key values on the comment.
        case 'cid':
137
          $replacements[$original] = $comment->id();
138 139
          break;

140
        // Poster identity information for comments.
141
        case 'hostname':
142
          $replacements[$original] = $sanitize ? check_plain($comment->getHostname()) : $comment->getHostname();
143 144 145
          break;

        case 'mail':
146
          $mail = $comment->getAuthorEmail();
147 148 149 150
          $replacements[$original] = $sanitize ? check_plain($mail) : $mail;
          break;

        case 'homepage':
151
          $replacements[$original] = $sanitize ? check_url($comment->getHomepage()) : $comment->getHomepage();
152 153 154
          break;

        case 'title':
155
          $replacements[$original] = $sanitize ? filter_xss($comment->getSubject()) : $comment->getSubject();
156 157 158
          break;

        case 'body':
159
          $replacements[$original] = $sanitize ? $comment->comment_body->processed : $comment->comment_body->value;
160 161 162 163
          break;

        // Comment related URLs.
        case 'url':
164 165
          $url_options['fragment']  = 'comment-' . $comment->id();
          $replacements[$original] = url('comment/' . $comment->id(), $url_options);
166 167 168
          break;

        case 'edit-url':
169
          $url_options['fragment'] = NULL;
170
          $replacements[$original] = url('comment/' . $comment->id() . '/edit', $url_options);
171 172
          break;

173 174 175
        // @todo Remove 'name' token in favour of 'author'. See
        //   https://drupal.org/node/920056.
        case 'name':
176
        case 'author':
177 178
          $name = $comment->getAuthorName();
          $replacements[$original] = $sanitize ? filter_xss($name) : $name;
179 180 181
          break;

        case 'parent':
182 183 184
          if ($comment->hasParentComment()) {
            $parent = $comment->getParentComment();
            $replacements[$original] = $sanitize ? filter_xss($parent->getSubject()) : $parent->getSubject();
185 186 187 188
          }
          break;

        case 'created':
189
          $replacements[$original] = format_date($comment->getCreatedTime(), 'medium', '', NULL, $langcode);
190 191 192
          break;

        case 'changed':
193
          $replacements[$original] = format_date($comment->getChangedTime(), 'medium', '', NULL, $langcode);
194 195
          break;

196
        case 'entity':
197
          $entity = $comment->getCommentedEntity();
198
          $title = $entity->label();
199
          $replacements[$original] = $sanitize ? filter_xss($title) : $title;
200
          break;
201 202 203 204 205

        case 'node':
          // Support legacy comment node tokens, since tokes are embedded in
          // user data and can't be upgraded directly.
          // @todo Remove in Drupal 9, see https://drupal.org/node/2031901.
206 207
          if ($comment->getCommentedEntityTypeId() == 'node') {
            $entity = $comment->getCommentedEntity();
208 209 210 211 212 213 214
            $title = $entity->label();
            $replacements[$original] = $sanitize ? filter_xss($title) : $title;
          }
          else {
            $replacements[$original] = NULL;
          }
          break;
215 216 217 218
      }
    }

    // Chained token relationships.
219
    if ($entity_tokens = $token_service->findwithPrefix($tokens, 'entity')) {
220 221
      $entity = $comment->getCommentedEntity();
      $replacements += $token_service->generate($comment->getCommentedEntityTypeId(), $entity_tokens, array($comment->getCommentedEntityTypeId() => $entity), $options);
222 223
    }

224 225
    if (($node_tokens = $token_service->findwithPrefix($tokens, 'node')) && $comment->getCommentedEntityTypeId() == 'node') {
      $node = $comment->getCommentedEntity();
226
      $replacements += $token_service->generate('node', $node_tokens, array('node' => $node), $options);
227 228
    }

229
    if ($date_tokens = $token_service->findwithPrefix($tokens, 'created')) {
230
      $replacements += $token_service->generate('date', $date_tokens, array('date' => $comment->getCreatedTime()), $options);
231 232
    }

233
    if ($date_tokens = $token_service->findwithPrefix($tokens, 'changed')) {
234
      $replacements += $token_service->generate('date', $date_tokens, array('date' => $comment->getChangedTime()), $options);
235 236
    }

237
    if (($parent_tokens = $token_service->findwithPrefix($tokens, 'parent')) && $parent = $comment->getParentComment()) {
238
      $replacements += $token_service->generate('comment', $parent_tokens, array('comment' => $parent), $options);
239 240
    }

241
    if (($author_tokens = $token_service->findwithPrefix($tokens, 'author')) && $account = $comment->getOwner()) {
242
      $replacements += $token_service->generate('user', $author_tokens, array('user' => $account), $options);
243 244
    }
  }
245 246
  elseif (($type == 'entity' & !empty($data['entity'])) ||
    ($type == 'node' & !empty($data['node']))) {
247
    /** @var $entity \Drupal\Core\Entity\ContentEntityInterface */
248
    $entity = !empty($data['entity']) ? $data['entity'] : $data['node'];
249 250

    foreach ($tokens as $name => $original) {
251
      switch ($name) {
252
        case 'comment-count':
253
          $count = 0;
254
          $fields = array_keys(\Drupal::service('comment.manager')->getFields($entity->getEntityTypeId()));
255
          $definitions = array_keys($entity->getFieldDefinitions());
256 257 258 259 260
          $valid_fields = array_intersect($fields, $definitions);
          foreach ($valid_fields as $field_name) {
            $count += $entity->get($field_name)->comment_count;
          }
          $replacements[$original] = $count;
261 262 263
          break;

        case 'comment-count-new':
264
          $replacements[$original] = comment_num_new($entity->id(), $entity->getEntityTypeId());
265 266 267 268 269 270 271
          break;
      }
    }
  }

  return $replacements;
}