summaryrefslogtreecommitdiffstats
path: root/core/modules/views/views.tokens.inc
blob: 1e0540b5da60aeea85af3df1c8e1bb9da1c687fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<?php

/**
 * @file
 * Token integration for the views module.
 */

use Drupal\Component\Utility\SafeMarkup;

/**
 * Implements hook_token_info().
 */
function views_token_info() {
  $info['types']['view'] = array(
    'name' => t('View', [], ['context' => 'View entity type']),
    'description' => t('Tokens related to views.'),
    'needs-data' => 'view',
  );
  $info['tokens']['view']['label'] = array(
    'name' => t('Label'),
    'description' => t('The label of the view.'),
  );
  $info['tokens']['view']['description'] = array(
    'name' => t('Description'),
    'description' => t('The description of the view.'),
  );
  $info['tokens']['view']['id'] = array(
    'name' => t('ID'),
    'description' => t('The machine-readable ID of the view.'),
  );
  $info['tokens']['view']['title'] = array(
    'name' => t('Title'),
    'description' => t('The title of current display of the view.'),
  );
  $info['tokens']['view']['url'] = array(
    'name' => t('URL'),
    'description' => t('The URL of the view.'),
    'type' => 'url',
  );
  $info['tokens']['view']['base-table'] = array(
    'name' => t('Base table'),
    'description' => t('The base table used for this view.'),
  );
  $info['tokens']['view']['base-field'] = array(
    'name' => t('Base field'),
    'description' => t('The base field used for this view.'),
  );
  $info['tokens']['view']['total-rows'] = array(
    'name' => t('Total rows'),
    'description' => t('The total amount of results returned from the view. The current display will be used.'),
  );
  $info['tokens']['view']['items-per-page'] = array(
    'name' => t('Items per page'),
    'description' => t('The number of items per page.'),
  );
  $info['tokens']['view']['current-page'] = array(
    'name' => t('Current page'),
    'description' => t('The current page of results the view is on.'),
  );
  $info['tokens']['view']['page-count'] = array(
    'name' => t('Page count'),
    'description' => t('The total page count.'),
  );

  return $info;
}

/**
 * Implements hook_tokens().
 */
function views_tokens($type, $tokens, array $data = array(), array $options = array()) {
  $token_service = \Drupal::token();

  $url_options = array('absolute' => TRUE);
  if (isset($options['language'])) {
    $url_options['language'] = $options['language'];
  }
  $sanitize = !empty($options['sanitize']);

  $replacements = array();

  if ($type == 'view' && !empty($data['view'])) {
    /** @var \Drupal\views\ViewExecutable $view */
    $view = $data['view'];

    foreach ($tokens as $name => $original) {
      switch ($name) {
        case 'label':
          $replacements[$original] = $sanitize ? SafeMarkup::checkPlain($view->storage->label()) : $view->storage->label();
          break;

        case 'description':
          $replacements[$original] = $sanitize ? SafeMarkup::checkPlain($view->storage->get('description')) : $view->storage->get('description');
          break;

        case 'id':
          $replacements[$original] = $view->storage->id();
          break;

        case 'title':
          $title = $view->getTitle();
          $replacements[$original] = $sanitize ? SafeMarkup::checkPlain($title) : $title;
          break;

        case 'url':
          if ($url = $view->getUrl()) {
            $replacements[$original] = $url->setOptions($url_options)->toString();
          }
          break;
        case 'base-table':
          $replacements[$original] = $view->storage->get('base_table');
          break;
        case 'base-field':
          $replacements[$original] = $view->storage->get('base_field');
          break;
        case 'total-rows':
          $replacements[$original] = count($view->result);
          break;
        case 'items-per-page':
          $replacements[$original] = (int) $view->getItemsPerPage();
          break;
        case 'current-page':
          $replacements[$original] = (int) $view->getCurrentPage() + 1;
          break;
        case 'page-count':
          // If there are no items per page, set this to 1 for the division.
          $per_page = $view->getItemsPerPage() ?: 1;
          $replacements[$original] = (int) ceil(count($view->result) / $per_page);
          break;
      }
    }

    // [view:url:*] nested tokens. This only works if Token module is installed.
    if ($url_tokens = $token_service->findWithPrefix($tokens, 'url')) {
      if ($path = $view->getUrl()) {
        $replacements += $token_service->generate('url', $url_tokens, array('path' => $url->getInternalPath()), $options);
      }
    }
  }

  return $replacements;
}