*/ class admin_plugin_statistics extends AdminPlugin { /** @var string the currently selected page */ protected $opt = ''; /** @var string from date in YYYY-MM-DD */ protected $from = ''; /** @var string to date in YYYY-MM-DD */ protected $to = ''; /** @var int Offset to use when displaying paged data */ protected $start = 0; /** @var helper_plugin_statistics */ protected $hlp; /** * Available statistic pages */ protected $pages = [ 'dashboard' => 1, 'content' => ['page', 'edits', 'images', 'downloads', 'history'], 'users' => ['topuser', 'topeditor', 'topgroup', 'topgroupedit', 'seenusers'], 'links' => ['referer', 'newreferer', 'outlinks'], 'search' => ['searchengines', 'searchphrases', 'searchwords', 'internalsearchphrases', 'internalsearchwords'], 'technology' => ['browsers', 'os', 'countries', 'resolution', 'viewport'] ]; /** @var array keeps a list of all real content pages, generated from above array */ protected $allowedpages = []; /** * Initialize the helper */ public function __construct() { $this->hlp = plugin_load('helper', 'statistics'); // build a list of pages foreach ($this->pages as $key => $val) { if (is_array($val)) { $this->allowedpages = array_merge($this->allowedpages, $val); } else { $this->allowedpages[] = $key; } } } /** * Access for managers allowed */ public function forAdminOnly() { return false; } /** * return sort order for position in admin menu */ public function getMenuSort() { return 350; } /** * handle user request */ public function handle() { global $INPUT; $this->opt = preg_replace('/[^a-z]+/', '', $INPUT->str('opt')); if (!in_array($this->opt, $this->allowedpages)) $this->opt = 'dashboard'; $this->start = $INPUT->int('s'); $this->setTimeframe($INPUT->str('f', date('Y-m-d')), $INPUT->str('t', date('Y-m-d'))); } /** * set limit clause */ public function setTimeframe($from, $to) { // swap if wrong order if ($from > $to) [$from, $to] = [$to, $from]; $this->hlp->Query()->setTimeFrame($from, $to); $this->from = $from; $this->to = $to; } /** * Output the Statistics */ public function html() { echo '
'; echo '

' . $this->getLang('menu') . '

'; $this->html_timeselect(); tpl_flush(); $method = 'html_' . $this->opt; if (method_exists($this, $method)) { echo '
'; echo '

' . $this->getLang($this->opt) . '

'; $this->$method(); echo '
'; } echo '
'; } /** * Return the TOC * * @return array */ public function getTOC() { $toc = []; foreach ($this->pages as $key => $info) { if (is_array($info)) { $toc[] = html_mktocitem( '', $this->getLang($key), 1, '' ); foreach ($info as $page) { $toc[] = html_mktocitem( '?do=admin&page=statistics&opt=' . $page . '&f=' . $this->from . '&t=' . $this->to, $this->getLang($page), 2, '' ); } } else { $toc[] = html_mktocitem( '?do=admin&page=statistics&opt=' . $key . '&f=' . $this->from . '&t=' . $this->to, $this->getLang($key), 1, '' ); } } return $toc; } public function html_graph($name, $width, $height) { $this->hlp->Graph($this->from, $this->to, $width, $height)->$name(); } /** * Outputs pagination links * * @param int $limit * @param int $next */ public function html_pager($limit, $next) { echo '
'; if ($this->start > 0) { $go = max($this->start - $limit, 0); echo ''; } if ($next) { $go = $this->start + $limit; echo ''; } echo '
'; } /** * Print the time selection menu */ public function html_timeselect() { $quick = [ 'today' => date('Y-m-d'), 'last1' => date('Y-m-d', time() - (60 * 60 * 24)), 'last7' => date('Y-m-d', time() - (60 * 60 * 24 * 7)), 'last30' => date('Y-m-d', time() - (60 * 60 * 24 * 30)), ]; echo '
'; echo '' . $this->getLang('time_select') . ' '; echo '
'; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo '
'; echo ''; echo '
'; } /** * Print an introductionary screen */ public function html_dashboard() { echo '

' . $this->getLang('intro_dashboard') . '

'; // general info echo '
'; $result = $this->hlp->Query()->aggregate(); echo ''; echo ''; echo '
'; $this->html_graph('dashboardviews', 700, 280); $this->html_graph('dashboardwiki', 700, 280); echo '
'; // top pages today echo '
'; echo '

' . $this->getLang('dash_mostpopular') . '

'; $result = $this->hlp->Query()->pages($this->start, 15); $this->html_resulttable($result); echo '' . $this->getLang('more') . ''; echo '
'; // top referer today echo '
'; echo '

' . $this->getLang('dash_newincoming') . '

'; $result = $this->hlp->Query()->newreferer($this->start, 15); $this->html_resulttable($result); echo '' . $this->getLang('more') . ''; echo '
'; // top searches today echo '
'; echo '

' . $this->getLang('dash_topsearch') . '

'; $result = $this->hlp->Query()->searchphrases(true, $this->start, 15); $this->html_resulttable($result); echo '' . $this->getLang('more') . ''; echo '
'; } public function html_history() { echo '

' . $this->getLang('intro_history') . '

'; $this->html_graph('history_page_count', 600, 200); $this->html_graph('history_page_size', 600, 200); $this->html_graph('history_media_count', 600, 200); $this->html_graph('history_media_size', 600, 200); } public function html_countries() { echo '

' . $this->getLang('intro_countries') . '

'; $this->html_graph('countries', 200, 200); $result = $this->hlp->Query()->countries(); $this->html_resulttable($result, '', 150); } public function html_page() { echo '

' . $this->getLang('intro_page') . '

'; $result = $this->hlp->Query()->pages(); $this->html_resulttable($result, '', 150); } public function html_edits() { echo '

' . $this->getLang('intro_edits') . '

'; $result = $this->hlp->Query()->edits(); $this->html_resulttable($result, '', 150); } public function html_images() { echo '

' . $this->getLang('intro_images') . '

'; $result = $this->hlp->Query()->imagessum(); echo '

'; echo sprintf($this->getLang('trafficsum'), $result[0]['cnt'], filesize_h($result[0]['filesize'])); echo '

'; $result = $this->hlp->Query()->images(); $this->html_resulttable($result, '', 150); } public function html_downloads() { echo '

' . $this->getLang('intro_downloads') . '

'; $result = $this->hlp->Query()->downloadssum(); echo '

'; echo sprintf($this->getLang('trafficsum'), $result[0]['cnt'], filesize_h($result[0]['filesize'])); echo '

'; $result = $this->hlp->Query()->downloads(); $this->html_resulttable($result, '', 150); } public function html_browsers() { echo '

' . $this->getLang('intro_browsers') . '

'; $this->html_graph('browsers', 200, 200); $result = $this->hlp->Query()->browsers(false); $this->html_resulttable($result, '', 150); } public function html_topuser() { echo '

' . $this->getLang('intro_topuser') . '

'; $this->html_graph('topuser', 200, 200); $result = $this->hlp->Query()->topuser(); $this->html_resulttable($result, '', 150); } public function html_topeditor() { echo '

' . $this->getLang('intro_topeditor') . '

'; $this->html_graph('topeditor', 200, 200); $result = $this->hlp->Query()->topeditor(); $this->html_resulttable($result, '', 150); } public function html_topgroup() { echo '

' . $this->getLang('intro_topgroup') . '

'; $this->html_graph('topgroup', 200, 200); $result = $this->hlp->Query()->topgroup(); $this->html_resulttable($result, '', 150); } public function html_topgroupedit() { echo '

' . $this->getLang('intro_topgroupedit') . '

'; $this->html_graph('topgroupedit', 200, 200); $result = $this->hlp->Query()->topgroupedit(); $this->html_resulttable($result, '', 150); } public function html_os() { echo '

' . $this->getLang('intro_os') . '

'; $this->html_graph('os', 200, 200); $result = $this->hlp->Query()->os(); $this->html_resulttable($result, '', 150); } public function html_referer() { $result = $this->hlp->Query()->aggregate(); $all = $result['search'] + $result['external'] + $result['direct']; if ($all) { printf( '

' . $this->getLang('intro_referer') . '

', $all, $result['direct'], (100 * $result['direct'] / $all), $result['search'], (100 * $result['search'] / $all), $result['external'], (100 * $result['external'] / $all) ); } $result = $this->hlp->Query()->referer(); $this->html_resulttable($result, '', 150); } public function html_newreferer() { echo '

' . $this->getLang('intro_newreferer') . '

'; $result = $this->hlp->Query()->newreferer(); $this->html_resulttable($result, '', 150); } public function html_outlinks() { echo '

' . $this->getLang('intro_outlinks') . '

'; $result = $this->hlp->Query()->outlinks(); $this->html_resulttable($result, '', 150); } public function html_searchphrases() { echo '

' . $this->getLang('intro_searchphrases') . '

'; $result = $this->hlp->Query()->searchphrases(true); $this->html_resulttable($result, '', 150); } public function html_searchwords() { echo '

' . $this->getLang('intro_searchwords') . '

'; $result = $this->hlp->Query()->searchwords(true); $this->html_resulttable($result, '', 150); } public function html_internalsearchphrases() { echo '

' . $this->getLang('intro_internalsearchphrases') . '

'; $result = $this->hlp->Query()->searchphrases(false); $this->html_resulttable($result, '', 150); } public function html_internalsearchwords() { echo '

' . $this->getLang('intro_internalsearchwords') . '

'; $result = $this->hlp->Query()->searchwords(false); $this->html_resulttable($result, '', 150); } public function html_searchengines() { echo '

' . $this->getLang('intro_searchengines') . '

'; $this->html_graph('searchengines', 400, 200); $result = $this->hlp->Query()->searchengines(); $this->html_resulttable($result, '', 150); } public function html_resolution() { echo '

' . $this->getLang('intro_resolution') . '

'; $this->html_graph('resolution', 650, 490); $result = $this->hlp->Query()->resolution(); $this->html_resulttable($result, '', 150); } public function html_viewport() { echo '

' . $this->getLang('intro_viewport') . '

'; $this->html_graph('viewport', 650, 490); $result = $this->hlp->Query()->viewport(); $this->html_resulttable($result, '', 150); } public function html_seenusers() { echo '

' . $this->getLang('intro_seenusers') . '

'; $result = $this->hlp->Query()->seenusers(); $this->html_resulttable($result, '', 150); } /** * Display a result in a HTML table */ public function html_resulttable($result, $header = '', $pager = 0) { echo ''; if (is_array($header)) { echo ''; foreach ($header as $h) { echo ''; } echo ''; } $count = 0; if (is_array($result)) foreach ($result as $row) { echo ''; foreach ($row as $k => $v) { if ($k == 'res_x') continue; if ($k == 'res_y') continue; echo ''; } echo ''; if ($pager && ($count == $pager)) break; $count++; } echo '
' . hsc($h) . '
'; if ($k == 'page') { echo ''; echo hsc($v); echo ''; } elseif ($k == 'media') { echo ''; echo hsc($v); echo ''; } elseif ($k == 'filesize') { echo filesize_h($v); } elseif ($k == 'url') { $url = hsc($v); $url = preg_replace('/^https?:\/\/(www\.)?/', '', $url); if (strlen($url) > 45) { $url = substr($url, 0, 30) . ' … ' . substr($url, -15); } echo ''; echo $url; echo ''; } elseif ($k == 'ilookup') { echo 'Search'; } elseif ($k == 'lookup') { echo ''; echo 'Google'; echo ' '; echo ''; echo 'Yahoo!'; echo ' '; echo ''; echo 'Bing'; echo ' '; } elseif ($k == 'engine') { include_once(__DIR__ . '/inc/searchengines.php'); if (isset($SEARCHENGINEINFO[$v])) { echo '' . $SEARCHENGINEINFO[$v][0] . ''; } else { echo hsc(ucwords($v)); } } elseif ($k == 'eflag') { $this->html_icon('search', $v); } elseif ($k == 'bflag') { $this->html_icon('browser', $v); } elseif ($k == 'osflag') { $this->html_icon('os', $v); } elseif ($k == 'cflag') { $this->html_icon('flags', $v); } elseif ($k == 'html') { echo $v; } else { echo hsc($v); } echo '
'; if ($pager) $this->html_pager($pager, count($result) > $pager); } public function html_icon($type, $value) { $value = strtolower(preg_replace('/[^\w]+/', '', $value)); $value = str_replace(' ', '_', $value); $file = 'lib/plugins/statistics/ico/' . $type . '/' . $value . '.png'; if ($type == 'flags') { $w = 18; $h = 12; } else { $w = 16; $h = 16; } if (file_exists(DOKU_INC . $file)) { echo '' . hsc($value) . ''; } } }