YaWK  24.1
Yet another WebKit
stats.php
Go to the documentation of this file.
1 <?php
2 // IMPORT REQUIRED CLASSES
3 use YAWK\alert;
4 use YAWK\backend;
6 use YAWK\db;
7 use YAWK\stats;
8 use YAWK\language;
9 
10 if (!isset($db))
11 { // create database object
12  $db = new db();
13 }
14 if (!isset($lang))
15 { // create language object
16  $lang = new language();
17 }
18 if (isset($_GET['reset']) && ($_GET['reset'] == 1))
19 {
20  if ($db->truncateTable("stats") === true){
21  alert::draw("success", "$lang[STATS_RESET]", "$lang[STATS_RESET_SUCCESS]", "", 2400);
22  }
23  else {
24  alert::draw("danger", "$lang[STATS_RESET]", "$lang[STATS_RESET_FAILED]", "", 2400);
25  }
26 }
27 ?>
28 
29 <!-- JS includes -->
30 <!-- SlimScroll 1.3.0 -->
31 <script src="../system/engines/AdminLTE/plugins/slimScroll/jquery.slimscroll.min.js"></script>
32 <!-- ChartJS 1.0.1 -->
33 <script src="../system/engines/AdminLTE/plugins/chartjs/Chart.min.js"></script>
34 <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.4.0/Chart.min.js"></script> -->
35 <style>
36  .tab-content>.tab-pane {
37  display: block;
38  height: 0;
39  overflow: hidden;
40  }
41  .tab-content>.tab-pane.active {
42  height: auto;
43  }
44 </style>
45 <?php
46 
47 /** @var $db db */
48 /** @var $lang language */
49 
50 // check if stats object is here...
51 if (!isset($stats) || (empty($stats)))
52 { // include stats class
53  @require_once '../system/classes/stats.php';
54  // and create new stats object
55  $stats = new stats();
56 }
57 // check if GET param interval is set
58 if (isset($_GET['interval']))
59 { $defaultInterval = $_GET['interval']; }
60 else if (isset($_POST['interval']))
61 { $defaultInterval = $_POST['interval']; }
62 else
63 // default interval value
64 { $defaultInterval = 1; }
65 
66 // check if GET param period is set
67 if (isset($_GET['period']))
68 { $defaultPeriod = $_GET['period']; }
69 else if (isset($_POST['period']))
70 { $defaultPeriod = $_POST['period']; }
71 else
72 // default period value
73 { $defaultPeriod = "DAY"; }
74 
75 // $defaultInterval = 1;
76 // $defaultPeriod = "DAY";
77 // get stats into array
78 $data = $stats->getStatsArray($db, $defaultInterval, $defaultPeriod);
79 
80 // TEMPLATE WRAPPER - HEADER & breadcrumbs
81 echo "
82  <!-- Content Wrapper. Contains page content -->
83  <div class=\"content-wrapper\" id=\"content-FX\">
84  <!-- Content Header (Page header) -->
85  <section class=\"content-header\">";
86 /* draw Title on top */
87 echo backend::getTitle($lang['STATS'], $lang['STATS_SUBTEXT']);
88 echo"<ol class=\"breadcrumb\">
89  <li><a href=\"index.php\" title=\"$lang[DASHBOARD]\"><i class=\"fa fa-dashboard\"></i> $lang[DASHBOARD]</a></li>
90  <li class=\"active\"><a href=\"index.php?page=yawk-stats\" title=\"$lang[STATS]\"> $lang[STATS]</a></li>
91  <li><a href=\"index.php?page=yawk-stats&interval=1&period=DAY\" title=\"$lang[LAST24H]\"> $lang[LAST24H]</a></li>
92  </ol>
93  </section>
94  <!-- Main content -->
95  <section class=\"content\">";
96 /* page content start here */
97 // include '../system/classes/statistics.php';
98 // $oStat = new \YAWK\statistics();
99 // echo $oStat->printObjectData();
100 ?>
101 <div class="box">
102  <div class="box-body">
103  <form action="index.php?page=stats" method="post" class="form-inline">
104  <div class="col-md-4">
105  <?php echo "<h4><i class=\"fa fa-line-chart\"></i> &nbsp;$lang[STATS]</h4>"; ?>
106  </div>
107  <div class="col-md-8">
108 
109  <label for="interval"><?php echo $lang['SHOW_DATA_OF']; ?>&nbsp;</label>
110  <select id="interval" name="interval" class="form-control">
111  <?php
112  if (isset($_POST['interval']))
113  {
114  echo "<option value=\"$_POST[interval]\" selected aria-selected=\"true\">$_POST[interval]</option>";
115  }
116  ?>
117  <option value="0">---</option>
118  <?php
119  for ($i = 1; $i <= 365; $i++) {
120  echo "<option value=\"$i\">$i</option>";
121  }
122  ?>
123  </select>
124  <label for="period"></label>
125  <select id="period" name="period" class="form-control">
126  <?php
127  if (isset($_POST['period']) && (isset($_POST['period'])))
128  {
129  $description = '';
130 
131  switch ($_POST['period']) {
132  case "SECONDS":
133  if ($_POST['interval'] > 1)
134  { $description = $lang['SECONDS']; }
135  else
136  { $description = $lang['SECOND']; }
137  break;
138  case "MINUTE":
139  if ($_POST['interval'] > 1)
140  { $description = $lang['MINUTES']; }
141  else
142  { $description = $lang['MINUTE']; }
143  break;
144  case "HOUR":
145  if ($_POST['interval'] > 1)
146  { $description = $lang['HOURS']; }
147  else
148  { $description = $lang['HOUR']; }
149  break;
150  case "DAY":
151  if ($_POST['interval'] > 1)
152  { $description = $lang['DAYS']; }
153  else
154  { $description = $lang['DAY']; }
155  break;
156  case "WEEK":
157  if ($_POST['interval'] > 1)
158  { $description = $lang['WEEKS']; }
159  else
160  { $description = $lang['WEEK']; }
161  break;
162  case "MONTH":
163  if ($_POST['interval'] > 1)
164  { $description = $lang['MONTHS']; }
165  else
166  { $description = $lang['MONTH']; }
167  break;
168  case "YEAR":
169  if ($_POST['interval'] > 1)
170  { $description = $lang['YEARS']; }
171  else
172  { $description = $lang['YEAR']; }
173  break;
174  }
175  echo "<option value=\"$_POST[period]\" selected aria-selected=\"true\">$description</option>";
176  }
177  ?>
178  <option value="ALL">---</option>
179  <option value="SECONDS"><?php echo $lang['SECONDS']; ?></option>
180  <option value="MINUTE"><?php echo $lang['MINUTES']; ?></option>
181  <option value="HOUR"><?php echo $lang['HOURS']; ?></option>
182  <option value="DAY"><?php echo $lang['DAYS']; ?></option>
183  <option value="WEEK"><?php echo $lang['WEEKS']; ?></option>
184  <option value="MONTH"><?php echo $lang['MONTHS']; ?></option>
185  <option value="YEAR"><?php echo $lang['YEARS']; ?></option>
186  </select>
187  <button type="submit" id="refresh" name="refresh" class="btn btn-success" title="<?php echo $lang['REFRESH_STATS']; ?>"><i class="glyphicon glyphicon-refresh"></i>&nbsp; <?php echo "$lang[STATS]"; ?></button>
188 
189  <?php
190  echo "<a class=\"btn btn-default pull-right\" role=\"dialog\" data-confirm=\"$lang[STATS_RESET_CONFIRM]\"
191  title=\"$lang[STATS_DELETE]\" href=\"index.php?page=stats&reset=1\">&nbsp;<i class=\"fa fa-trash-o\"></i>&nbsp;</a>"; ?>
192  </div>
193  </form>
194  </div>
195 </div>
196 
197 <div class="box">
198  <div class="box-body">
199 
200  <ul class="nav nav-tabs">
201  <li class="active"><a data-toggle="tab" href="#home"><i class="fa fa-pie-chart"></i> &nbsp;<?php echo $lang['OVERVIEW']; ?></a></li>
202  <li><a data-toggle="tab" href="#devices"><i class="fa fa-tablet"></i> &nbsp;<?php echo $lang['DEVICES']; ?></a></li>
203  <li><a data-toggle="tab" href="#browser"><i class="fa fa-firefox"></i> &nbsp;<?php echo $lang['BROWSER']; ?></a></li>
204  <li><a data-toggle="tab" href="#users"><i class="fa fa-users"></i> &nbsp;<?php echo $lang['USERS']; ?></a></li>
205  <li><a data-toggle="tab" href="#os"><i class="fa fa-windows"></i> &nbsp;<?php echo $lang['OPERATING_SYSTEMS']; ?></a></li>
206  <li><a data-toggle="tab" href="#pages"><i class="fa fa-file"></i> &nbsp;<?php echo $lang['PAGES']; ?></a></li>
207  </ul>
208 
209  <div class="tab-content">
210  <div id="home" class="tab-pane fade in active">
211  <h3><i class="fa fa-pie-chart"></i>&nbsp;<?php echo $lang['OVERVIEW']; ?></h3>
212  <div class="col-md-8">
213  <!-- box -->
214  <?php $stats->drawOverviewBox($lang); ?>
215  <!-- / box -->
216  <br>
217  <?php $stats->drawWeekdayBox($db, $data, $lang, 0); ?>
218  <br>
219  <?php $stats->getDaysOfMonthBox($lang); ?>
220  </div>
221  <div class="col-md-4">
222  <!-- box -->
223  <?php $stats->drawDaytimeBox($db, $data, $lang); ?>
224  <!-- / box -->
225  </div>
226  </div>
227  <div id="devices" class="tab-pane">
228  <h3><i class="fa fa-tablet"></i> &nbsp;<?php echo $lang['DEVICES']; ?></h3>
229  <div class="col-md-8">
230  <!-- device type box -->
231  <?php $stats->drawDeviceTypeBox($db, $data, $lang); ?>
232  <!-- /device type box -->
233  </div>
234  <div class="col-md-4">
235  <!-- device type box -->
236  <?php $stats->drawOsBox($db, $data, $lang); ?>
237  <!-- /device type box -->
238  </div>
239  </div>
240  <div id="browser" class="tab-pane fade in">
241  <h3><i class="fa fa-firefox"></i> &nbsp;<?php echo $lang['BROWSER']; ?></h3>
242  <div class="col-md-6">
243  <!-- browser box -->
244  <?php $stats->drawBrowserBox($db, $data, $lang); ?>
245  <!-- /browser box -->
246  </div>
247  <div class="col-md-6">
248  ...
249  </div>
250  </div>
251  <div id="users" class="tab-pane fade in">
252  <h3><i class="fa fa-users"></i> &nbsp;<?php echo $lang['USERS']; ?></h3>
253  <div class="col-md-6">
254  <!-- login box -->
255  <?php $stats->drawLoginBox($db, $lang); ?>
256  <!-- / login box -->
257  </div>
258  <div class="col-md-6">
259  <!-- latest users box -->
260  <?php dashboard::drawLatestUsers($db, 8, $lang); ?>
261  <!-- / latest users box -->
262  </div>
263  </div>
264  <div id="os" class="tab-pane fade in">
265  <h3><i class="fa fa-windows"></i> &nbsp;<?php echo $lang['OPERATING_SYSTEMS']; ?></h3>
266  <div class="col-md-12">
267  <!-- device type box -->
268  <?php $stats->drawOsVersionBox($db, $data, $lang); ?>
269  <!-- /device type box -->
270  </div>
271  </div>
272  <div id="pages" class="tab-pane fade in">
273  <h3><i class="fa fa-file"></i> &nbsp;<?php echo $lang['PAGES']; ?></h3>
274  <?php $stats->drawPagesBox($data, $lang); ?>
275  </div>
276  </div>
277  </div>
278 </div>
279 
280 
281 <script type="text/javascript">
282  // some jquery magic to remember select option status
283  $(document).ready(function() {
284  let getUrlParameter = function getUrlParameter(sParam) {
285  let sPageURL = decodeURIComponent(window.location.search.substring(1)),
286  sURLVariables = sPageURL.split('&'),
287  sParameterName,
288  i;
289 
290  for (i = 0; i < sURLVariables.length; i++) {
291  sParameterName = sURLVariables[i].split('=');
292 
293  if (sParameterName[0] === sParam) {
294  return sParameterName[1] === undefined ? true : sParameterName[1];
295  }
296  }
297  };
298 
299  // period select field
300  let periodSelect = $( "#period" );
301  // interval select field
302  let intervalSelect = $( "#interval" );
303  // submit btn
304  let submitBtn = $( "#refresh" );
305  /*
306  // on change of interval select option
307  $(intervalSelect).on('change', function() {
308  // current selected value
309  intervalSelectValue = this.value;
310  // save current intervalSelectValue to localStorage
311  localStorage.setItem('intervalSelect', intervalSelectValue);
312  });
313 
314  // on change of period select option
315  $(periodSelect).on('change', function() {
316  // current selected value
317  periodSelectValue = this.value;
318  // save current periodSelectValue to localStorage
319  localStorage.setItem('periodSelect', periodSelectValue);
320  });
321  */
322  // on change of period select option
323  $(submitBtn).on('click', function() {
324  // current periodValue
325  var currentPeriodSelectValue = $( "#period option:selected" ).val();
326  // current intervalValue
327  var currentIntervalSelectValue = $( "#interval option:selected" ).val();
328  // save current periodSelectValue to localStorage
329  localStorage.setItem('periodSelect', currentPeriodSelectValue);
330  localStorage.setItem('intervalSelect', currentIntervalSelectValue);
331  });
332 
333  // get data from localStorage
334  lastPeriodSelectValue = localStorage.getItem('periodSelect');
335  lastIntervalSelectValue = localStorage.getItem('intervalSelect');
336 
337  $(periodSelect).val(lastPeriodSelectValue); // change value
338  $(intervalSelect).val(lastIntervalSelectValue); // change value
339 
340  // check if there are GET params...
341  // let getPeriod = getUrlParameter('period');
342  // let getInterval = getUrlParameter('interval');
343 
344  // $( submitBtn ).trigger( "click" );
345  /*
346  // if getPeriod param is not set
347  if(getPeriod !== "")
348  { // otherwise change value of period with GET param data
349  $(periodSelect).val(getPeriod); // change value
350  }
351 
352  // if getInterval param is not set
353  if (getInterval !== "")
354  { // update interval select field with GET param data
355  $(intervalSelect).val(getInterval); // change value
356  }
357  */
358  });
359 </script>
360 
361 <script>
362  var ctx = document.getElementById("myChart").getContext('2d');
363  var myChart = new Chart(ctx, {
364  type: 'bar',
365  data: {
366  labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
367  datasets: [{
368  label: '# of Votes',
369  data: [12, 19, 3, 5, 2, 3],
370  backgroundColor: [
371  'rgba(255, 99, 132, 0.2)',
372  'rgba(54, 162, 235, 0.2)',
373  'rgba(255, 206, 86, 0.2)',
374  'rgba(75, 192, 192, 0.2)',
375  'rgba(153, 102, 255, 0.2)',
376  'rgba(255, 159, 64, 0.2)'
377  ],
378  borderColor: [
379  'rgba(255,99,132,1)',
380  'rgba(54, 162, 235, 1)',
381  'rgba(255, 206, 86, 1)',
382  'rgba(75, 192, 192, 1)',
383  'rgba(153, 102, 255, 1)',
384  'rgba(255, 159, 64, 1)'
385  ],
386  borderWidth: 1
387  }]
388  },
389  options: {
390  scales: {
391  yAxes: [{
392  ticks: {
393  beginAtZero:true
394  }
395  }]
396  }
397  }
398  });
399 </script>
print $lang['FILEMAN_UPLOAD']
$data
Definition: stats.php:78
Dashboard class serves a few useful functions for the admin backend.
Definition: dashboard.php:20
Throws a fancy Bootstrap Alert (success, info, warning or danger)
Definition: alert.php:19
Backend class serves a few useful functions for the admin backend.
Definition: backend.php:27
Mysqli database class; returns db connection object.
Definition: db.php:16
The language class - support multilingual backend.
Definition: language.php:17
Statistics - get and set user and page stats.
Definition: stats.php:10
function window
Definition: fuckAdBlock.js:8
FuckAdBlock prototype on
Definition: fuckAdBlock.js:227
function a
Definition: browser.js:14
return window window jQBrowser a &&a browser
Definition: browser.js:14
type
Definition: menu-new.php:35
return true
Definition: page.php:1313
print $page title
Definition: page-edit.php:377
print $_GET['id']
Definition: page-edit.php:357
function i(e, t)
Definition: plyr.js:1
undefined
Definition: plyr.js:1
<!-- backend language -->< h3 >< i class="fa fa-language"></i > & nbsp
$template name
$i
document ready(function() { $('a[data-confirm]').click(function(ev) { modal='#dataConfirmModal';var href=$(this).attr('href');var title=$(this).attr('title');var icon=$(this).attr('data-icon');if(!icon) { icon='fa fa-trash-o';} if(!$(modal).length) { $('body').append('< div id="dataConfirmModal" class="modal fade" role="dialog" aria-labelledby="dataConfirmLabel" aria-hidden="true">< div class="modal-dialog">< div class="modal-content">< div class="modal-header">< button type="button" class="close" data-dismiss="modal" aria-hidden="true">< i class="fa fa-times"></i ></button >< br >< div class="col-md-1">< h3 class="modal-title">< i class="'+icon+'"></i ></h3 ></div >< div class="col-md-11">< h3 class="modal-title" id="dataConfirmLabel">'+title+'</h3 ></div ></h3 ></div >< div class="modal-body"></div >< div class="modal-footer">< button type="button" class="btn btn-default" data-dismiss="modal" aria-hidden="true">Abbrechen</button >< a type="button" class="btn btn-danger" id="dataConfirmOK">< i class="'+icon+'"></i > L &ouml;schen</a ></div ></div ></div ></div >');} $(modal).find('.modal-body').text($(this).attr('data-confirm'));$('#dataConfirmOK').attr('href', href);$(modal).modal({show:true});return false;});$('#terminateUser').click(function() { var terminate=window.confirm("ACHTUNG!\nDas wird Deinen Account permanent deaktivieren.\n"+"Bist Du Dir sicher, dass Du das tun willst?");if(terminate===true) { var terminateUser=window.confirm("Bist Du Dir wirklich ganz sicher?\n"+"Diese Aktion kann nicht rueckgaengig gemacht werden.");if(terminateUser===true) { $.get('system/templates/YaWK-bootstrap3/js/terminate-user.php', function(data) { if(data==="true") { setTimeout("window.location='logout.html'", 0);} else { alert("Fehler: "+data);} });} } });function dismissNotifications() { $.ajax({ url:'js/dismiss-notifications.php', type:'POST', success:function(data) { if(!data) { alert('Something went wrong!');return false;} } });$("#bell-label").fadeOut();$('#notification-header').html('You have 0 notifications');$('#notification-menu').fadeOut();} $("#dismiss").click(function() { dismissNotifications();});function disableButtons(delay) { $('#loginButton').removeClass().addClass('btn btn-success disabled').attr('id', 'LOGIN_FORBIDDEN');$('#resetPasswordButton').removeClass().addClass('btn btn-danger disabled');setTimeout(function() { $('#LOGIN_FORBIDDEN').attr('id', 'loginButton').removeClass().addClass('btn btn-success');$('#resetPasswordButton').removeClass().addClass('btn btn-danger');}, delay);} $("#loginButton").click(function(){ if($('#loginButton').length > 0) { if($('#loginButton').hasClass('btn') &&$('#loginButton').hasClass('btn-success') &&$('#loginButton').hasClass('disabled')) { } else { $("#loginForm").submit();disableButtons(10000);} } else if($('#LOGIN_FORBIDDEN').length > 0) { if($('#LOGIN_FORBIDDEN').hasClass('btn') &&$('#LOGIN_FORBIDDEN').hasClass('btn-success') &&$('#LOGIN_FORBIDDEN').hasClass('disabled')) { } else { } } });$("#blockedBtn").hover(function() { $("#blockedBtn").hide();$("#askBtn").fadeIn(820);});})