Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
100.00% |
49 / 49 |
|
100.00% |
4 / 4 |
CRAP | |
100.00% |
1 / 1 |
ReportService | |
100.00% |
49 / 49 |
|
100.00% |
4 / 4 |
9 | |
100.00% |
1 / 1 |
__construct | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
1 | |||
referer | |
100.00% |
26 / 26 |
|
100.00% |
1 / 1 |
3 | |||
setReferrersCondition | |
100.00% |
16 / 16 |
|
100.00% |
1 / 1 |
4 | |||
addDateFilter | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
1 |
1 | <?php |
2 | |
3 | namespace Drupal\visitors\Service; |
4 | |
5 | use Drupal\Core\Database\Connection; |
6 | use Drupal\Core\StringTranslation\StringTranslationTrait; |
7 | use Drupal\visitors\VisitorsDateRangeInterface; |
8 | use Drupal\visitors\VisitorsReportInterface; |
9 | use Symfony\Component\HttpFoundation\RequestStack; |
10 | |
11 | /** |
12 | * Report data. |
13 | * |
14 | * @package visitors |
15 | */ |
16 | class ReportService implements VisitorsReportInterface { |
17 | use StringTranslationTrait; |
18 | |
19 | /** |
20 | * The database service. |
21 | * |
22 | * @var \Drupal\Core\Database\Connection |
23 | */ |
24 | protected $database; |
25 | |
26 | /** |
27 | * Items per page. |
28 | * |
29 | * @var int |
30 | */ |
31 | protected $itemsPerPage; |
32 | |
33 | /** |
34 | * The page number. |
35 | * |
36 | * @var int |
37 | */ |
38 | protected $page; |
39 | |
40 | /** |
41 | * The date range service. |
42 | * |
43 | * @var \Drupal\visitors\VisitorsDateRangeInterface |
44 | */ |
45 | protected $dateRange; |
46 | |
47 | /** |
48 | * Database Service Object. |
49 | * |
50 | * @param \Drupal\Core\Database\Connection $database |
51 | * The database service. |
52 | * @param \Symfony\Component\HttpFoundation\RequestStack $stack |
53 | * The request stack service. |
54 | * @param \Drupal\visitors\VisitorsDateRangeInterface $date_range |
55 | * The date range service. |
56 | */ |
57 | public function __construct( |
58 | Connection $database, |
59 | RequestStack $stack, |
60 | VisitorsDateRangeInterface $date_range, |
61 | ) { |
62 | |
63 | $this->database = $database; |
64 | $this->itemsPerPage = 10; |
65 | $this->page = $stack->getCurrentRequest()->query->get('page') ?? 0; |
66 | $this->dateRange = $date_range; |
67 | } |
68 | |
69 | /** |
70 | * {@inheritdoc} |
71 | */ |
72 | public function referer(array $header) { |
73 | /** @var \Drupal\Core\Database\Query\SelectInterface $query */ |
74 | $query = $this->database->select('visitors_event', 'v') |
75 | ->extend('Drupal\Core\Database\Query\PagerSelectExtender') |
76 | ->extend('Drupal\Core\Database\Query\TableSortExtender'); |
77 | // $query->condition('bot', 1, '<>'); |
78 | $query->addExpression('COUNT(*)', 'count'); |
79 | $query->fields('v', ['referrer_url']); |
80 | $this->addDateFilter($query); |
81 | $query = $this->setReferrersCondition($query); |
82 | $query->condition('referrer_url', '', '<>'); |
83 | $query->groupBy('referrer_url'); |
84 | $query->orderByHeader($header); |
85 | $query->limit($this->itemsPerPage); |
86 | |
87 | $count_query = $this->database->select('visitors_event', 'v'); |
88 | // $count_query->condition('bot', 1, '<>'); |
89 | $count_query->condition('referrer_url', '', '<>'); |
90 | $count_query->addExpression('COUNT(DISTINCT referrer_url)'); |
91 | $this->addDateFilter($count_query); |
92 | $count_query = $this->setReferrersCondition($count_query); |
93 | $query->setCountQuery($count_query); |
94 | $results = $query->execute(); |
95 | |
96 | $rows = []; |
97 | $i = $this->page * $this->itemsPerPage; |
98 | foreach ($results as $data) { |
99 | |
100 | $rows[] = [ |
101 | empty($data->referrer_url) ? $this->t('No Referer') : $data->referrer_url, |
102 | $data->count, |
103 | ]; |
104 | } |
105 | return $rows; |
106 | } |
107 | |
108 | /** |
109 | * Build sql query from referer type value. |
110 | */ |
111 | protected function setReferrersCondition($query) { |
112 | switch ($_SESSION['referer_type']) { |
113 | case VisitorsReportInterface::REFERER_TYPE_INTERNAL_PAGES: |
114 | $query->condition( |
115 | 'referrer_url', |
116 | sprintf('%%%s%%', $_SERVER['HTTP_HOST']), |
117 | 'LIKE' |
118 | ); |
119 | $query->condition('referrer_url', '', '<>'); |
120 | break; |
121 | |
122 | case VisitorsReportInterface::REFERER_TYPE_EXTERNAL_PAGES: |
123 | $query->condition( |
124 | 'referrer_url', |
125 | sprintf('%%%s%%', $_SERVER['HTTP_HOST']), |
126 | 'NOT LIKE' |
127 | ); |
128 | break; |
129 | |
130 | default: |
131 | break; |
132 | } |
133 | |
134 | return $query; |
135 | } |
136 | |
137 | /** |
138 | * Add date filter to the query. |
139 | * |
140 | * @param \Drupal\Core\Database\Query\SelectInterface $query |
141 | * The query object. |
142 | */ |
143 | protected function addDateFilter(&$query) { |
144 | |
145 | $from = $this->dateRange->getStartTimestamp(); |
146 | $to = $this->dateRange->getEndTimestamp(); |
147 | |
148 | $query->condition('created', [$from, $to], 'BETWEEN'); |
149 | } |
150 | |
151 | } |