defined('WYSIJA') or die('Restricted access'); class WYSIJA_module_statistics_model extends WYSIJA_model { const STATS_DATE_OF_CREATION = 'STATS_DATE_OF_CREATION'; /** * Time to live of stats data */ const STATS_DATA_LIFE_TIME = 3600; // 1h * 60mins * 60s /** * Time to live of stats's table (structure) */ const STATS_TABLE_LIFE_TIME = 86400; // 24h * 60mins * 60s const STATS_PREFIX = 'sc_'; // prefix of stat tables public function __construct() { parent::__construct(); $this->clean_up_out_of_date_tables(); } /** * * @param array $params array of input params */ public function get_hash(Array $params) { $hash = md5(get_class($this) . json_encode($params)); return substr($hash, 0, 8);// Only get 8 first characters to not make table name too long (less than 64) } /** * set a date of creating temporary tables, useful for caching * @return type */ protected function set_date_of_creation() { $config = WYSIJA::get('config', 'model'); return $config->save(array(self::STATS_DATE_OF_CREATION => time())); } /** * Check if cache life time is out of date * @return boolean */ protected function is_data_out_of_date() { $config = WYSIJA::get('config', 'model'); $date_of_creation = $config->getValue(self::STATS_DATE_OF_CREATION); return (time() - $date_of_creation >= self::STATS_DATA_LIFE_TIME); } /** * Get the list of tables which are out of date, based on create_time * @return type */ protected function get_out_of_date_tables() { $query = ' SELECT TABLE_NAME as table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA IN (SELECT DATABASE()) AND (TABLE_NAME LIKE "[wysija]'.self::STATS_PREFIX.'%" OR TABLE_NAME LIKE "[wysija]stats_cache_%") AND TIMESTAMPDIFF(SECOND,CREATE_TIME, NOW()) >= '.self::STATS_TABLE_LIFE_TIME.'; '; return $this->get_results($query); } /** * Auto cleanup out-of-date tables */ protected function clean_up_out_of_date_tables() { $tables = $this->get_out_of_date_tables(); if (!empty($tables) && is_array($tables)) { $_temp = array(); foreach ($tables as $table) if (!empty($table['table_name'])) $_temp[] = $table['table_name']; } if (!empty($_temp)) { $query = 'DROP TABLE IF EXISTS `'. implode('`,`', $_temp).'`'; $this->get_results($query); } } /** * Check if a table exists * @param string $table_name table name * @return boolean */ protected function does_table_exists($table_name = null) { if (empty($table_name) OR !is_string($table_name)) return false; $query = "SHOW TABLES LIKE '$table_name'"; $result = $this->get_results($query); return !empty($result) ? true : false; } /** * Generate a table name, based on input params * @param type $params */ protected function get_table_name($params) { $hash = $this->get_hash($params); return '[wysija]' . self::STATS_PREFIX . $hash; } /** * Generate a cached table * @param type $table_name * @param array $queries_create_table query to create a new cached table * @param array $queries_insert_data query to collect and insert data to the newly created/truncated table * @return boolean */ protected function generate_table($table_name, Array $queries_create_table, Array $queries_insert_data) { $is_out_of_date = $this->is_data_out_of_date(); $does_table_exists = $this->does_table_exists($table_name); if (!$is_out_of_date && $does_table_exists) return true; if ($does_table_exists) { $this->query('TRUNCATE TABLE `' . $table_name . '`'); } else { foreach ($queries_create_table as $query_create_table) $this->query($query_create_table); } foreach ($queries_insert_data as $query_insert_data) $this->query($query_insert_data); if ($is_out_of_date) { $this->set_date_of_creation(); } return true; } } defined('WYSIJA') or die('Restricted access'); class WYSIJA_module_statistics extends WYSIJA_module{ const GROUP_BY_YEAR = 1; const GROUP_BY_MONTH = 2; const GROUP_BY_DATE = 3; const GROUP_BY_HOUR = 4; const GROUP_BY_MINUTE = 5; const ORDER_BY_SENT = 1; const ORDER_BY_OPEN = 2; const ORDER_BY_CLICK = 3; const ORDER_BY_UNSUBSCRIBE = 4; const ORDER_DIRECTION_ASC = 1; const ORDER_DIRECTION_DESC = 2; const SWITCHING_DATE_TO_MONTH_THRESHOLD = 90;// if the days between FROM and TO is greater than this value, we will group data by month instead of by date. Useful for charts. const DEFAULT_TOP_RECORDS = 5; // default number of how many first records we should retrieve public function __construct() { parent::__construct(); $this->data['messages'] = $this->init_messages(); } protected function init_messages() { return array( 'data_not_available' => __("There's no stats to load!", WYSIJA) ); } } defined('WYSIJA') or die('Restricted access'); abstract class WYSIJA_module_statisticschart extends WYSIJA_module_statistics{ public function __construct() { parent::__construct(); $this->data['js_date_format'] = 'yy/mm/dd'; } public function init(){ } } defined('WYSIJA') or die('Restricted access'); abstract class WYSIJA_module_statisticstable extends WYSIJA_module_statistics{ } Радионица на Филозофском факултету – Универзитет у Бањој луци – Универзитетски центар за помоћ студентима са посебним потребама
Универзитет у Бањој луци - Универзитетски центар за помоћ студентима са посебним потребама