danielebarchiesi@0
|
1 <?php
|
danielebarchiesi@0
|
2
|
danielebarchiesi@0
|
3 /**
|
danielebarchiesi@0
|
4 * @file
|
danielebarchiesi@0
|
5 * Admin page callbacks for the Statistics module.
|
danielebarchiesi@0
|
6 */
|
danielebarchiesi@0
|
7
|
danielebarchiesi@0
|
8 /**
|
danielebarchiesi@0
|
9 * Page callback: Displays the "recent hits" page.
|
danielebarchiesi@0
|
10 *
|
danielebarchiesi@0
|
11 * This displays the pages with recent hits in a given time interval that
|
danielebarchiesi@0
|
12 * haven't been flushed yet. The flush interval is set on the statistics
|
danielebarchiesi@0
|
13 * settings form, but is dependent on cron running.
|
danielebarchiesi@0
|
14 *
|
danielebarchiesi@0
|
15 * @return
|
danielebarchiesi@0
|
16 * A render array containing information about the most recent hits.
|
danielebarchiesi@0
|
17 */
|
danielebarchiesi@0
|
18 function statistics_recent_hits() {
|
danielebarchiesi@0
|
19 $header = array(
|
danielebarchiesi@0
|
20 array('data' => t('Timestamp'), 'field' => 'a.timestamp', 'sort' => 'desc'),
|
danielebarchiesi@0
|
21 array('data' => t('Page'), 'field' => 'a.path'),
|
danielebarchiesi@0
|
22 array('data' => t('User'), 'field' => 'u.name'),
|
danielebarchiesi@0
|
23 array('data' => t('Operations'))
|
danielebarchiesi@0
|
24 );
|
danielebarchiesi@0
|
25
|
danielebarchiesi@0
|
26 $query = db_select('accesslog', 'a', array('target' => 'slave'))->extend('PagerDefault')->extend('TableSort');
|
danielebarchiesi@0
|
27 $query->join('users', 'u', 'a.uid = u.uid');
|
danielebarchiesi@0
|
28 $query
|
danielebarchiesi@0
|
29 ->fields('a', array('aid', 'timestamp', 'path', 'title', 'uid'))
|
danielebarchiesi@0
|
30 ->fields('u', array('name'))
|
danielebarchiesi@0
|
31 ->limit(30)
|
danielebarchiesi@0
|
32 ->orderByHeader($header);
|
danielebarchiesi@0
|
33
|
danielebarchiesi@0
|
34 $result = $query->execute();
|
danielebarchiesi@0
|
35 $rows = array();
|
danielebarchiesi@0
|
36 foreach ($result as $log) {
|
danielebarchiesi@0
|
37 $rows[] = array(
|
danielebarchiesi@0
|
38 array('data' => format_date($log->timestamp, 'short'), 'class' => array('nowrap')),
|
danielebarchiesi@0
|
39 _statistics_format_item($log->title, $log->path),
|
danielebarchiesi@0
|
40 theme('username', array('account' => $log)),
|
danielebarchiesi@0
|
41 l(t('details'), "admin/reports/access/$log->aid"));
|
danielebarchiesi@0
|
42 }
|
danielebarchiesi@0
|
43
|
danielebarchiesi@0
|
44 $build['statistics_table'] = array(
|
danielebarchiesi@0
|
45 '#theme' => 'table',
|
danielebarchiesi@0
|
46 '#header' => $header,
|
danielebarchiesi@0
|
47 '#rows' => $rows,
|
danielebarchiesi@0
|
48 '#empty' => t('No statistics available.'),
|
danielebarchiesi@0
|
49 );
|
danielebarchiesi@0
|
50 $build['statistics_pager'] = array('#theme' => 'pager');
|
danielebarchiesi@0
|
51 return $build;
|
danielebarchiesi@0
|
52 }
|
danielebarchiesi@0
|
53
|
danielebarchiesi@0
|
54 /**
|
danielebarchiesi@0
|
55 * Page callback: Displays statistics for the "top pages" (most accesses).
|
danielebarchiesi@0
|
56 *
|
danielebarchiesi@0
|
57 * This displays the pages with the most hits (the "top pages") within a given
|
danielebarchiesi@0
|
58 * time period that haven't been flushed yet. The flush interval is set on the
|
danielebarchiesi@0
|
59 * statistics settings form, but is dependent on cron running.
|
danielebarchiesi@0
|
60 *
|
danielebarchiesi@0
|
61 * @return
|
danielebarchiesi@0
|
62 * A render array containing information about the the top pages.
|
danielebarchiesi@0
|
63 */
|
danielebarchiesi@0
|
64 function statistics_top_pages() {
|
danielebarchiesi@0
|
65 $header = array(
|
danielebarchiesi@0
|
66 array('data' => t('Hits'), 'field' => 'hits', 'sort' => 'desc'),
|
danielebarchiesi@0
|
67 array('data' => t('Page'), 'field' => 'path'),
|
danielebarchiesi@0
|
68 array('data' => t('Average page generation time'), 'field' => 'average_time'),
|
danielebarchiesi@0
|
69 array('data' => t('Total page generation time'), 'field' => 'total_time')
|
danielebarchiesi@0
|
70 );
|
danielebarchiesi@0
|
71
|
danielebarchiesi@0
|
72 $query = db_select('accesslog', 'a', array('target' => 'slave'))->extend('PagerDefault')->extend('TableSort');
|
danielebarchiesi@0
|
73 $query->addExpression('COUNT(path)', 'hits');
|
danielebarchiesi@0
|
74 // MAX(title) avoids having empty node titles which otherwise causes
|
danielebarchiesi@0
|
75 // duplicates in the top pages list.
|
danielebarchiesi@0
|
76 $query->addExpression('MAX(title)', 'title');
|
danielebarchiesi@0
|
77 $query->addExpression('AVG(timer)', 'average_time');
|
danielebarchiesi@0
|
78 $query->addExpression('SUM(timer)', 'total_time');
|
danielebarchiesi@0
|
79
|
danielebarchiesi@0
|
80 $query
|
danielebarchiesi@0
|
81 ->fields('a', array('path'))
|
danielebarchiesi@0
|
82 ->groupBy('path')
|
danielebarchiesi@0
|
83 ->limit(30)
|
danielebarchiesi@0
|
84 ->orderByHeader($header);
|
danielebarchiesi@0
|
85
|
danielebarchiesi@0
|
86 $count_query = db_select('accesslog', 'a', array('target' => 'slave'));
|
danielebarchiesi@0
|
87 $count_query->addExpression('COUNT(DISTINCT path)');
|
danielebarchiesi@0
|
88 $query->setCountQuery($count_query);
|
danielebarchiesi@0
|
89
|
danielebarchiesi@0
|
90 $result = $query->execute();
|
danielebarchiesi@0
|
91 $rows = array();
|
danielebarchiesi@0
|
92 foreach ($result as $page) {
|
danielebarchiesi@0
|
93 $rows[] = array($page->hits, _statistics_format_item($page->title, $page->path), t('%time ms', array('%time' => round($page->average_time))), format_interval(round($page->total_time / 1000)));
|
danielebarchiesi@0
|
94 }
|
danielebarchiesi@0
|
95
|
danielebarchiesi@0
|
96 drupal_set_title(t('Top pages in the past %interval', array('%interval' => format_interval(variable_get('statistics_flush_accesslog_timer', 259200)))), PASS_THROUGH);
|
danielebarchiesi@0
|
97 $build['statistics_top_pages_table'] = array(
|
danielebarchiesi@0
|
98 '#theme' => 'table',
|
danielebarchiesi@0
|
99 '#header' => $header,
|
danielebarchiesi@0
|
100 '#rows' => $rows,
|
danielebarchiesi@0
|
101 '#empty' => t('No statistics available.'),
|
danielebarchiesi@0
|
102 );
|
danielebarchiesi@0
|
103 $build['statistics_top_pages_pager'] = array('#theme' => 'pager');
|
danielebarchiesi@0
|
104 return $build;
|
danielebarchiesi@0
|
105 }
|
danielebarchiesi@0
|
106
|
danielebarchiesi@0
|
107 /**
|
danielebarchiesi@0
|
108 * Page callback: Displays the "top visitors" page.
|
danielebarchiesi@0
|
109 *
|
danielebarchiesi@0
|
110 * This displays the pages with the top number of visitors in a given time
|
danielebarchiesi@0
|
111 * interval that haven't been flushed yet. The flush interval is set on the
|
danielebarchiesi@0
|
112 * statistics settings form, but is dependent on cron running.
|
danielebarchiesi@0
|
113 *
|
danielebarchiesi@0
|
114 * @return
|
danielebarchiesi@0
|
115 * A render array containing the top visitors information.
|
danielebarchiesi@0
|
116 */
|
danielebarchiesi@0
|
117 function statistics_top_visitors() {
|
danielebarchiesi@0
|
118
|
danielebarchiesi@0
|
119 $header = array(
|
danielebarchiesi@0
|
120 array('data' => t('Hits'), 'field' => 'hits', 'sort' => 'desc'),
|
danielebarchiesi@0
|
121 array('data' => t('Visitor'), 'field' => 'u.name'),
|
danielebarchiesi@0
|
122 array('data' => t('Total page generation time'), 'field' => 'total'),
|
danielebarchiesi@0
|
123 array('data' => user_access('block IP addresses') ? t('Operations') : '', 'colspan' => 2),
|
danielebarchiesi@0
|
124 );
|
danielebarchiesi@0
|
125 $query = db_select('accesslog', 'a', array('target' => 'slave'))->extend('PagerDefault')->extend('TableSort');
|
danielebarchiesi@0
|
126 $query->leftJoin('blocked_ips', 'bl', 'a.hostname = bl.ip');
|
danielebarchiesi@0
|
127 $query->leftJoin('users', 'u', 'a.uid = u.uid');
|
danielebarchiesi@0
|
128
|
danielebarchiesi@0
|
129 $query->addExpression('COUNT(a.uid)', 'hits');
|
danielebarchiesi@0
|
130 $query->addExpression('SUM(a.timer)', 'total');
|
danielebarchiesi@0
|
131 $query
|
danielebarchiesi@0
|
132 ->fields('a', array('uid', 'hostname'))
|
danielebarchiesi@0
|
133 ->fields('u', array('name'))
|
danielebarchiesi@0
|
134 ->fields('bl', array('iid'))
|
danielebarchiesi@0
|
135 ->groupBy('a.hostname')
|
danielebarchiesi@0
|
136 ->groupBy('a.uid')
|
danielebarchiesi@0
|
137 ->groupBy('u.name')
|
danielebarchiesi@0
|
138 ->groupBy('bl.iid')
|
danielebarchiesi@0
|
139 ->limit(30)
|
danielebarchiesi@0
|
140 ->orderByHeader($header);
|
danielebarchiesi@0
|
141
|
danielebarchiesi@0
|
142 $uniques_query = db_select('accesslog')->distinct();
|
danielebarchiesi@0
|
143 $uniques_query->fields('accesslog', array('uid', 'hostname'));
|
danielebarchiesi@0
|
144 $count_query = db_select($uniques_query);
|
danielebarchiesi@0
|
145 $count_query->addExpression('COUNT(*)');
|
danielebarchiesi@0
|
146 $query->setCountQuery($count_query);
|
danielebarchiesi@0
|
147
|
danielebarchiesi@0
|
148 $result = $query->execute();
|
danielebarchiesi@0
|
149 $rows = array();
|
danielebarchiesi@0
|
150 $destination = drupal_get_destination();
|
danielebarchiesi@0
|
151 foreach ($result as $account) {
|
danielebarchiesi@0
|
152 $ban_link = $account->iid ? l(t('unblock IP address'), "admin/config/people/ip-blocking/delete/$account->iid", array('query' => $destination)) : l(t('block IP address'), "admin/config/people/ip-blocking/$account->hostname", array('query' => $destination));
|
danielebarchiesi@0
|
153 $rows[] = array($account->hits, ($account->uid ? theme('username', array('account' => $account)) : $account->hostname), format_interval(round($account->total / 1000)), (user_access('block IP addresses') && !$account->uid) ? $ban_link : '');
|
danielebarchiesi@0
|
154 }
|
danielebarchiesi@0
|
155
|
danielebarchiesi@0
|
156 drupal_set_title(t('Top visitors in the past %interval', array('%interval' => format_interval(variable_get('statistics_flush_accesslog_timer', 259200)))), PASS_THROUGH);
|
danielebarchiesi@0
|
157 $build['statistics_top_visitors_table'] = array(
|
danielebarchiesi@0
|
158 '#theme' => 'table',
|
danielebarchiesi@0
|
159 '#header' => $header,
|
danielebarchiesi@0
|
160 '#rows' => $rows,
|
danielebarchiesi@0
|
161 '#empty' => t('No statistics available.'),
|
danielebarchiesi@0
|
162 );
|
danielebarchiesi@0
|
163 $build['statistics_top_visitors_pager'] = array('#theme' => 'pager');
|
danielebarchiesi@0
|
164 return $build;
|
danielebarchiesi@0
|
165 }
|
danielebarchiesi@0
|
166
|
danielebarchiesi@0
|
167 /**
|
danielebarchiesi@0
|
168 * Page callback: Displays the "top referrers" in the access logs.
|
danielebarchiesi@0
|
169 *
|
danielebarchiesi@0
|
170 * This displays the pages with the top referrers in a given time interval that
|
danielebarchiesi@0
|
171 * haven't been flushed yet. The flush interval is set on the statistics
|
danielebarchiesi@0
|
172 * settings form, but is dependent on cron running.
|
danielebarchiesi@0
|
173 *
|
danielebarchiesi@0
|
174 * @return
|
danielebarchiesi@0
|
175 * A render array containing the top referrers information.
|
danielebarchiesi@0
|
176 */
|
danielebarchiesi@0
|
177 function statistics_top_referrers() {
|
danielebarchiesi@0
|
178 drupal_set_title(t('Top referrers in the past %interval', array('%interval' => format_interval(variable_get('statistics_flush_accesslog_timer', 259200)))), PASS_THROUGH);
|
danielebarchiesi@0
|
179
|
danielebarchiesi@0
|
180 $header = array(
|
danielebarchiesi@0
|
181 array('data' => t('Hits'), 'field' => 'hits', 'sort' => 'desc'),
|
danielebarchiesi@0
|
182 array('data' => t('Url'), 'field' => 'url'),
|
danielebarchiesi@0
|
183 array('data' => t('Last visit'), 'field' => 'last'),
|
danielebarchiesi@0
|
184 );
|
danielebarchiesi@0
|
185 $query = db_select('accesslog', 'a')->extend('PagerDefault')->extend('TableSort');
|
danielebarchiesi@0
|
186
|
danielebarchiesi@0
|
187 $query->addExpression('COUNT(url)', 'hits');
|
danielebarchiesi@0
|
188 $query->addExpression('MAX(timestamp)', 'last');
|
danielebarchiesi@0
|
189 $query
|
danielebarchiesi@0
|
190 ->fields('a', array('url'))
|
danielebarchiesi@0
|
191 ->condition('url', '%' . $_SERVER['HTTP_HOST'] . '%', 'NOT LIKE')
|
danielebarchiesi@0
|
192 ->condition('url', '', '<>')
|
danielebarchiesi@0
|
193 ->groupBy('url')
|
danielebarchiesi@0
|
194 ->limit(30)
|
danielebarchiesi@0
|
195 ->orderByHeader($header);
|
danielebarchiesi@0
|
196
|
danielebarchiesi@0
|
197 $count_query = db_select('accesslog', 'a', array('target' => 'slave'));
|
danielebarchiesi@0
|
198 $count_query->addExpression('COUNT(DISTINCT url)');
|
danielebarchiesi@0
|
199 $count_query
|
danielebarchiesi@0
|
200 ->condition('url', '%' . $_SERVER['HTTP_HOST'] . '%', 'NOT LIKE')
|
danielebarchiesi@0
|
201 ->condition('url', '', '<>');
|
danielebarchiesi@0
|
202 $query->setCountQuery($count_query);
|
danielebarchiesi@0
|
203
|
danielebarchiesi@0
|
204 $result = $query->execute();
|
danielebarchiesi@0
|
205 $rows = array();
|
danielebarchiesi@0
|
206 foreach ($result as $referrer) {
|
danielebarchiesi@0
|
207 $rows[] = array($referrer->hits, _statistics_link($referrer->url), t('@time ago', array('@time' => format_interval(REQUEST_TIME - $referrer->last))));
|
danielebarchiesi@0
|
208 }
|
danielebarchiesi@0
|
209
|
danielebarchiesi@0
|
210 $build['statistics_top_referrers_table'] = array(
|
danielebarchiesi@0
|
211 '#theme' => 'table',
|
danielebarchiesi@0
|
212 '#header' => $header,
|
danielebarchiesi@0
|
213 '#rows' => $rows,
|
danielebarchiesi@0
|
214 '#empty' => t('No statistics available.'),
|
danielebarchiesi@0
|
215 );
|
danielebarchiesi@0
|
216 $build['statistics_top_referrers_pager'] = array('#theme' => 'pager');
|
danielebarchiesi@0
|
217 return $build;
|
danielebarchiesi@0
|
218 }
|
danielebarchiesi@0
|
219
|
danielebarchiesi@0
|
220 /**
|
danielebarchiesi@0
|
221 * Page callback: Gathers page access statistics suitable for rendering.
|
danielebarchiesi@0
|
222 *
|
danielebarchiesi@0
|
223 * @param $aid
|
danielebarchiesi@0
|
224 * The unique accesslog ID.
|
danielebarchiesi@0
|
225 *
|
danielebarchiesi@0
|
226 * @return
|
danielebarchiesi@0
|
227 * A render array containing page access statistics. If information for the
|
danielebarchiesi@0
|
228 * page was not found, drupal_not_found() is called.
|
danielebarchiesi@0
|
229 */
|
danielebarchiesi@0
|
230 function statistics_access_log($aid) {
|
danielebarchiesi@0
|
231 $access = db_query('SELECT a.*, u.name FROM {accesslog} a LEFT JOIN {users} u ON a.uid = u.uid WHERE aid = :aid', array(':aid' => $aid))->fetch();
|
danielebarchiesi@0
|
232 if ($access) {
|
danielebarchiesi@0
|
233 $rows[] = array(
|
danielebarchiesi@0
|
234 array('data' => t('URL'), 'header' => TRUE),
|
danielebarchiesi@0
|
235 l(url($access->path, array('absolute' => TRUE)), $access->path)
|
danielebarchiesi@0
|
236 );
|
danielebarchiesi@0
|
237 // It is safe to avoid filtering $access->title through check_plain because
|
danielebarchiesi@0
|
238 // it comes from drupal_get_title().
|
danielebarchiesi@0
|
239 $rows[] = array(
|
danielebarchiesi@0
|
240 array('data' => t('Title'), 'header' => TRUE),
|
danielebarchiesi@0
|
241 $access->title
|
danielebarchiesi@0
|
242 );
|
danielebarchiesi@0
|
243 $rows[] = array(
|
danielebarchiesi@0
|
244 array('data' => t('Referrer'), 'header' => TRUE),
|
danielebarchiesi@0
|
245 ($access->url ? l($access->url, $access->url) : '')
|
danielebarchiesi@0
|
246 );
|
danielebarchiesi@0
|
247 $rows[] = array(
|
danielebarchiesi@0
|
248 array('data' => t('Date'), 'header' => TRUE),
|
danielebarchiesi@0
|
249 format_date($access->timestamp, 'long')
|
danielebarchiesi@0
|
250 );
|
danielebarchiesi@0
|
251 $rows[] = array(
|
danielebarchiesi@0
|
252 array('data' => t('User'), 'header' => TRUE),
|
danielebarchiesi@0
|
253 theme('username', array('account' => $access))
|
danielebarchiesi@0
|
254 );
|
danielebarchiesi@0
|
255 $rows[] = array(
|
danielebarchiesi@0
|
256 array('data' => t('Hostname'), 'header' => TRUE),
|
danielebarchiesi@0
|
257 check_plain($access->hostname)
|
danielebarchiesi@0
|
258 );
|
danielebarchiesi@0
|
259
|
danielebarchiesi@0
|
260 $build['statistics_table'] = array(
|
danielebarchiesi@0
|
261 '#theme' => 'table',
|
danielebarchiesi@0
|
262 '#rows' => $rows,
|
danielebarchiesi@0
|
263 );
|
danielebarchiesi@0
|
264 return $build;
|
danielebarchiesi@0
|
265 }
|
danielebarchiesi@0
|
266 else {
|
danielebarchiesi@0
|
267 drupal_not_found();
|
danielebarchiesi@0
|
268 }
|
danielebarchiesi@0
|
269 }
|
danielebarchiesi@0
|
270
|
danielebarchiesi@0
|
271 /**
|
danielebarchiesi@0
|
272 * Form constructor for the statistics administration form.
|
danielebarchiesi@0
|
273 *
|
danielebarchiesi@0
|
274 * @ingroup forms
|
danielebarchiesi@0
|
275 * @see system_settings_form()
|
danielebarchiesi@0
|
276 */
|
danielebarchiesi@0
|
277 function statistics_settings_form() {
|
danielebarchiesi@0
|
278 // Access log settings.
|
danielebarchiesi@0
|
279 $form['access'] = array(
|
danielebarchiesi@0
|
280 '#type' => 'fieldset',
|
danielebarchiesi@0
|
281 '#title' => t('Access log settings'),
|
danielebarchiesi@0
|
282 );
|
danielebarchiesi@0
|
283 $form['access']['statistics_enable_access_log'] = array(
|
danielebarchiesi@0
|
284 '#type' => 'checkbox',
|
danielebarchiesi@0
|
285 '#title' => t('Enable access log'),
|
danielebarchiesi@0
|
286 '#default_value' => variable_get('statistics_enable_access_log', 0),
|
danielebarchiesi@0
|
287 '#description' => t('Log each page access. Required for referrer statistics.'),
|
danielebarchiesi@0
|
288 );
|
danielebarchiesi@0
|
289 $form['access']['statistics_flush_accesslog_timer'] = array(
|
danielebarchiesi@0
|
290 '#type' => 'select',
|
danielebarchiesi@0
|
291 '#title' => t('Discard access logs older than'),
|
danielebarchiesi@0
|
292 '#default_value' => variable_get('statistics_flush_accesslog_timer', 259200),
|
danielebarchiesi@0
|
293 '#options' => array(0 => t('Never')) + drupal_map_assoc(array(3600, 10800, 21600, 32400, 43200, 86400, 172800, 259200, 604800, 1209600, 2419200, 4838400, 9676800), 'format_interval'),
|
danielebarchiesi@0
|
294 '#description' => t('Older access log entries (including referrer statistics) will be automatically discarded. (Requires a correctly configured <a href="@cron">cron maintenance task</a>.)', array('@cron' => url('admin/reports/status'))),
|
danielebarchiesi@0
|
295 );
|
danielebarchiesi@0
|
296
|
danielebarchiesi@0
|
297 // Content counter settings.
|
danielebarchiesi@0
|
298 $form['content'] = array(
|
danielebarchiesi@0
|
299 '#type' => 'fieldset',
|
danielebarchiesi@0
|
300 '#title' => t('Content viewing counter settings'),
|
danielebarchiesi@0
|
301 );
|
danielebarchiesi@0
|
302 $form['content']['statistics_count_content_views'] = array(
|
danielebarchiesi@0
|
303 '#type' => 'checkbox',
|
danielebarchiesi@0
|
304 '#title' => t('Count content views'),
|
danielebarchiesi@0
|
305 '#default_value' => variable_get('statistics_count_content_views', 0),
|
danielebarchiesi@0
|
306 '#description' => t('Increment a counter each time content is viewed.'),
|
danielebarchiesi@0
|
307 );
|
danielebarchiesi@0
|
308
|
danielebarchiesi@0
|
309 return system_settings_form($form);
|
danielebarchiesi@0
|
310 }
|