config = self::$grav['config']; $this->data_path = LOG_DIR . 'popularity'; $this->daily_file = $this->data_path.'/'.self::DAILY_FILE; $this->monthly_file = $this->data_path.'/'.self::MONTHLY_FILE; $this->totals_file = $this->data_path.'/'.self::TOTALS_FILE; $this->visitors_file = $this->data_path.'/'.self::VISITORS_FILE; } public function trackHit() { $page = self::$grav['page']; $relative_url = str_replace($this->config->get('system.base_url_relative'), '', $page->url()); // Don't track error pages or pages that have no route if ($page->template() == 'error' || !$page->route()) { return; } // Make sure no 'widcard-style' ignore matches this url foreach ((array) $this->config->get('plugins.admin.popularity.ignore') as $ignore) { if (fnmatch($ignore, $relative_url)) { return; } } // initial creation if it doesn't exist if (!file_exists($this->data_path)) { mkdir($this->data_path); $this->flushPopularity(); } // Update the data we want to track $this->updateDaily(); $this->updateMonthly(); $this->updateTotals($page->route()); $this->updateVisitors(self::$grav['uri']->ip()); } protected function updateDaily() { if (!$this->daily_data) { $this->daily_data = $this->getData($this->daily_file); } $day_month_year = date(self::DAILY_FORMAT); // get the daily access count if (array_key_exists($day_month_year, $this->daily_data)) { $this->daily_data[$day_month_year] = intval($this->daily_data[$day_month_year]) + 1; } else { $this->daily_data[$day_month_year] = 1; } // keep correct number as set by history $count = intval($this->config->get('plugins.admin.popularity.history.daily', 7)); $total = count($this->daily_data); $this->daily_data = array_slice($this->daily_data, $total - $count, $count); file_put_contents($this->daily_file, json_encode($this->daily_data)); } protected function updateMonthly() { if (!$this->monthly_data) { $this->monthly_data = $this->getData($this->monthly_file); } $month_year = date(self::MONTHLY_FORMAT); // get the monthly access count if (array_key_exists($month_year, $this->monthly_data)) { $this->monthly_data[$month_year] = intval($this->monthly_data[$month_year]) + 1; } else { $this->monthly_data[$month_year] = 1; } // keep correct number as set by history $count = intval($this->config->get('plugins.admin.popularity.history.monthly', 12)); $total = count($this->monthly_data); $this->monthly_data = array_slice($this->monthly_data, $total - $count, $count); file_put_contents($this->monthly_file, json_encode($this->monthly_data)); } protected function updateTotals($url) { if (!$this->totals_data) { $this->totals_data = $this->getData($this->totals_file); } // get the totals for this url if (array_key_exists($url, $this->totals_data)) { $this->totals_data[$url] = intval($this->totals_data[$url]) + 1; } else { $this->totals_data[$url] = 1; } file_put_contents($this->totals_file, json_encode($this->totals_data)); } protected function updateVisitors($ip) { if (!$this->visitors_data) { $this->visitors_data = $this->getData($this->visitors_file); } // update with current timestamp $this->visitors_data[$ip] = time(); $visitors = $this->visitors_data; arsort($visitors); $count = intval($this->config->get('plugins.admin.popularity.history.visitors', 20)); $this->visitors_data = array_slice($visitors, 0, $count); file_put_contents($this->visitors_file, json_encode($this->visitors_data)); } protected function getData($path) { return (array) @json_decode(file_get_contents($path), true); } public function flushPopularity() { file_put_contents($this->daily_file, array()); file_put_contents($this->monthly_file, array()); file_put_contents($this->totals_file, array()); file_put_contents($this->visitors_file, array()); } }