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