Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
90 / 90
100.00% covered (success)
100.00%
7 / 7
CRAP
100.00% covered (success)
100.00%
1 / 1
VisitorsOnlineBlock
100.00% covered (success)
100.00%
90 / 90
100.00% covered (success)
100.00%
7 / 7
13
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 create
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
 defaultConfiguration
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
1
 blockForm
100.00% covered (success)
100.00%
37 / 37
100.00% covered (success)
100.00%
1 / 1
1
 blockSubmit
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
 build
100.00% covered (success)
100.00%
30 / 30
100.00% covered (success)
100.00%
1 / 1
7
 getCacheMaxAge
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3declare(strict_types=1);
4
5namespace Drupal\visitors\Plugin\Block;
6
7use Drupal\Core\Block\Attribute\Block;
8use Drupal\Core\Block\BlockBase;
9use Drupal\Core\Form\FormStateInterface;
10use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
11use Drupal\Core\StringTranslation\TranslatableMarkup;
12use Drupal\visitors\VisitorsOnlineInterface;
13use Symfony\Component\DependencyInjection\ContainerInterface;
14
15/**
16 * Provides a 'Visitors Online' block.
17 */
18#[Block(
19  id: "visitors_online",
20  admin_label: new TranslatableMarkup("Visitors Online")
21)]
22final class VisitorsOnlineBlock extends BlockBase implements ContainerFactoryPluginInterface {
23
24  /**
25   * Five minutes in seconds.
26   */
27  const MINUTE_5 = 300;
28
29  /**
30   * The visitors online service.
31   *
32   * @var \Drupal\visitors\VisitorsOnlineInterface
33   */
34  protected $online;
35
36  /**
37   * Constructs a StatisticsPopularBlock object.
38   *
39   * @param array $configuration
40   *   A configuration array containing information about the plugin instance.
41   * @param string $plugin_id
42   *   The plugin_id for the plugin instance.
43   * @param mixed $plugin_definition
44   *   The plugin implementation definition.
45   * @param \Drupal\visitors\VisitorsOnlineInterface $visitors_online
46   *   The visitors online service.
47   */
48  public function __construct(array $configuration, $plugin_id, $plugin_definition, VisitorsOnlineInterface $visitors_online) {
49    parent::__construct($configuration, $plugin_id, $plugin_definition);
50
51    $this->online = $visitors_online;
52  }
53
54  /**
55   * {@inheritdoc}
56   */
57  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
58    return new self(
59      $configuration,
60      $plugin_id,
61      $plugin_definition,
62      $container->get('visitors.online'),
63    );
64  }
65
66  /**
67   * {@inheritdoc}
68   */
69  public function defaultConfiguration() {
70    return [
71      'now_30_minute' => TRUE,
72      'now_24_hour' => FALSE,
73      'yesterday_30_minute' => FALSE,
74      'yesterday_24_hour' => FALSE,
75      'last_week_30_minute' => FALSE,
76      'last_week_24_hour' => FALSE,
77    ];
78  }
79
80  /**
81   * {@inheritdoc}
82   */
83  public function blockForm($form, FormStateInterface $form_state) {
84
85    $form['now_30_minute'] = [
86      '#type' => 'checkbox',
87      '#title' => $this->t('Active visitors (last 30 min)'),
88      '#description' => $this->t('Show the number of visitors in the last 30 minutes.'),
89      '#default_value' => $this->configuration['now_30_minute'],
90    ];
91    $form['now_24_hour'] = [
92      '#type' => 'checkbox',
93      '#title' => $this->t('Visitors in the past 24 hours'),
94      '#description' => $this->t('Show the number of visitors in the past 24 hours.'),
95      '#default_value' => $this->configuration['now_24_hour'],
96    ];
97    $form['yesterday_30_minute'] = [
98      '#type' => 'checkbox',
99      '#title' => $this->t('Visitors yesterday (same 30 min)'),
100      '#description' => $this->t('Show the number of visitors in the same 30-minute period yesterday.'),
101      '#default_value' => $this->configuration['yesterday_30_minute'],
102    ];
103    $form['yesterday_24_hour'] = [
104      '#type' => 'checkbox',
105      '#title' => $this->t('Visitors yesterday (total)'),
106      '#description' => $this->t('Show the total number of visitors yesterday.'),
107      '#default_value' => $this->configuration['yesterday_24_hour'],
108    ];
109    $form['last_week_30_minute'] = [
110      '#type' => 'checkbox',
111      '#title' => $this->t('Visitors last week (same 30 min)'),
112      '#description' => $this->t('Show the number of visitors in the same 30-minute period last week.'),
113      '#default_value' => $this->configuration['last_week_30_minute'],
114    ];
115    $form['last_week_24_hour'] = [
116      '#type' => 'checkbox',
117      '#title' => $this->t('Visitors last week (same day)'),
118      '#description' => $this->t('Show the total number of visitors on the same day last week.'),
119      '#default_value' => $this->configuration['last_week_24_hour'],
120    ];
121
122    return $form;
123  }
124
125  /**
126   * {@inheritdoc}
127   */
128  public function blockSubmit($form, FormStateInterface $form_state) {
129    $this->configuration['now_30_minute'] = $form_state->getValue('now_30_minute');
130    $this->configuration['now_24_hour'] = $form_state->getValue('now_24_hour');
131    $this->configuration['yesterday_30_minute'] = $form_state->getValue('yesterday_30_minute');
132    $this->configuration['yesterday_24_hour'] = $form_state->getValue('yesterday_24_hour');
133    $this->configuration['last_week_30_minute'] = $form_state->getValue('last_week_30_minute');
134    $this->configuration['last_week_24_hour'] = $form_state->getValue('last_week_24_hour');
135  }
136
137  /**
138   * {@inheritdoc}
139   */
140  public function build() {
141
142    $items = [];
143    if ($this->configuration['now_30_minute']) {
144      $items[] = $this->t('Last 30 min: @count', [
145        '@count' => $this->online->getLast30Minutes(),
146      ]);
147    }
148    if ($this->configuration['now_24_hour']) {
149      $items[] = $this->t('Last 24 hours: @count', [
150        '@count' => $this->online->getLast24Hours(),
151      ]);
152    }
153    if ($this->configuration['yesterday_30_minute']) {
154      $items[] = $this->t('Yesterday (same 30 min): @count', [
155        '@count' => $this->online->getYesterday30Minutes(),
156      ]);
157    }
158    if ($this->configuration['yesterday_24_hour']) {
159      $items[] = $this->t('Yesterday (total): @count', [
160        '@count' => $this->online->getYesterday24Hours(),
161      ]);
162    }
163    if ($this->configuration['last_week_30_minute']) {
164      $items[] = $this->t('Last week (same 30 min): @count', [
165        '@count' => $this->online->getLastWeek30Minutes(),
166      ]);
167    }
168    if ($this->configuration['last_week_24_hour']) {
169      $items[] = $this->t('Last week (same day): @count', [
170        '@count' => $this->online->getLastWeek24Hours(),
171      ]);
172    }
173
174    $content = [
175      '#theme' => 'item_list',
176      '#items' => $items,
177    ];
178
179    return $content;
180  }
181
182  /**
183   * {@inheritdoc}
184   */
185  public function getCacheMaxAge() {
186    return self::MINUTE_5;
187  }
188
189}