"DATE_FORMAT(log.date,'%Y-%m-%d')", 'ddate' => "DATE_FORMAT(log.date,'%Y-%m-%d')", 'record_id' => "log_docs.record_id" ); protected $cor = array(); protected $jour = array(); protected $month = array(); /** * The name of the database * @var string */ protected $dbname; /** * The periode displayed in a string of the report * @var string */ protected $periode; /** * * @var filter executed on report */ protected $tab_filter = array(); protected $active_column = array(); protected $posting_filter = array(); /** * The ORDER BY filters of the query * by default is empty * @var array */ protected $tab_order = array(); protected $bound = array(); protected $print = true; protected $csv = true; protected $enable_limit = true; /*~*~*~*~*~*~*~*~*~*~*~*~*/ /* METHODS, VARIABLES */ /*~*~*~*~*~*~*~*~*~*~*~*~*/ /** * Constructor * * * @name report::__construct() * @param $arg1 the minimal date of the report * @param $arg2 the maximal date of the report * @param $sbas_id the id of the base where we want to connect */ public function __construct($d1, $d2, $sbas_id, $collist) { $session = session::getInstance(); $this->dmin = $d1; $this->dmax = $d2; $this->sbas_id = $sbas_id; $this->list_coll_id = $collist; $this->user_id = $session->usr_id; $this->periode = phraseadate::getPrettyString(new DateTime($d1)).' - '.phraseadate::getPrettyString(new DateTime($d2)); $this->dbname = phrasea::sbas_names($sbas_id); $this->cor = $this->setCor(); $this->jour = Array( 1 => _('phraseanet::jours:: lundi'), 2 => _('phraseanet::jours:: mardi'), 3 => _('phraseanet::jours:: mercredi'), 4 => _('phraseanet::jours:: jeudi'), 5 => _('phraseanet::jours:: vendredi'), 6 => _('phraseanet::jours:: samedi'), 7 => _('phraseanet::jours:: dimanche')); $this->month = array( _('janvier'), _('fevrier'), _('mars'), _('avril'), _('mai'), _('juin'), _('juillet'), _('aout'), _('septembre'), _('octobre'), _('novembre'), _('decembre') ); } public function setTitle($title) { $this->title = $title; } public function setCsv($bool) { $this->csv = $bool; } public function getTitle() { return $this->title; } public function getDisplay() { return $this->display; } public function getTransQueryString() { return $this->cor_query; } public function getCor() { return $this->cor; } public function getEnableLimit() { return $this->enable_limit; } public function setFilter($filter) { if(is_array($filter)) { $this->tab_filter = $filter; } } public function setActiveColumn($active_column) { if(is_array($active_column)) { $this->active_column = $active_column; } } public function setConfig($bool) { $this->config = $bool; } public function setPrint($bool) { $this->print = $bool; } public function setHasLimit($bool) { $this->enable_limit = $bool; } public function setBound($column, $bool) { if($bool) { $this->bound[$column] = 1; } else { $this->bound[$column] = 0; } } /** * @desc Add an ORDER BY filter to $tab_order * @param string the field where the ORDER BY is carried out * @return void */ public function setOrder($champ, $order) { $this->tab_order['champ'] = $champ; $this->tab_order['order'] = $order; } /** * @desc set $nb_page, $nb_record in order of construct the query LIMIT * @param int $arg1 the number of current page * @param int $arg2 the number of record displayed per pages * @return void */ public function setLimit($page, $limit) { $this->nb_page = $page; $this->nb_record = $limit; } public function setPeriode($periode) { $this->periode = $periode; } public function getReq() { return $this->req; } public function setpostingFilter($filter) { $this->posting_filter = $filter; } protected function setChamp($result_set) { $this->champ = array(); $this->default_display = array(); $conn = connection::getInstance($this->sbas_id); $num_field = $conn->num_fields($result_set); $j = 0; while ($j < $num_field) { array_push($this->champ, $conn->field_name($result_set, $j)); array_push($this->default_display, $conn->field_name($result_set, $j)); $j++; } } protected function setReport() { $this->report['dbid'] = $this->sbas_id; $this->report['periode'] = $this->periode; $this->report['dbname'] = $this->dbname; $this->report['dmin'] = $this->dmin; $this->report['dmax'] = $this->dmax; $this->report['server'] = GV_ServerName; $this->report['filter'] = $this->tab_filter; $this->report['posting_filter'] = $this->posting_filter; $this->report['active_column'] = $this->active_column; $this->report['default_display'] = $this->default_display; $this->report['config'] = $this->config; $this->report['total'] = $this->total; $this->report['display_nav'] = $this->display_nav; $this->report['nb_record'] = $this->nb_record; $this->report['page'] = $this->nb_page; $this->report['previous_page'] = $this->previous_page; $this->report['next_page'] = $this->next_page; $this->report['title'] = $this->title; $this->report['allChamps'] = $this->champ; $this->report['display'] = $this->display; $this->report['result'] = $this->result; $this->report['print'] = $this->print; $this->report['csv'] = $this->csv; } private function setCor() { return array( 'user' => _('report:: utilisateur'), 'coll_id' => _('report:: collections'), 'connexion' => _('report:: Connexion'), 'comment' => _('report:: commentaire'), 'search' => _('report:: question'), 'date' => _('report:: date'), 'ddate' => _('report:: date'), 'fonction' => _('report:: fonction'), 'activite' => _('report:: activite'), 'pays' => _('report:: pays'), 'societe' => _('report:: societe'), 'nb' => _('report:: nombre'), 'pourcent' => _('report:: pourcentage'), 'telechargement' => _('report:: telechargement'), 'record_id' => _('report:: record id'), 'final' => _('report:: type d\'action'), 'xml' => _('report:: sujet'), 'file' => _('report:: fichier'), 'mime' => _('report:: type'), 'size' => _('report:: taille'), 'copyright' => _('report:: copyright'), 'final' => _('phraseanet:: sous definition') ); } protected function setDisplay($tab, $groupby = false) { if($tab == false && $groupby == false) $this->initDefaultConfigColumn($this->default_display); elseif($groupby != false && $tab == false) $this->initDefaultConfigColumn($this->champ); elseif($tab != false) $this->setConfigColumn($tab); } protected function calculatePages($rs) { if($this->nb_record && $this->total > $this->nb_record) { $this->previous_page = $this->nb_page - 1; if($this->previous_page == 0) $this->previous_page = false; $test = ($this->total / $this->nb_record); if($this->nb_page == intval(ceil($test))) { $this->next_page = false; } else { $this->next_page = $this->nb_page + 1; } } } protected function setDisplayNav() { if($this->total > $this->nb_record) $this->display_nav = true; } /** * @desc Initialize the configuration foreach column displayed in the report * @param array $display contain the conf's variables * @return void */ protected function initDefaultConfigColumn($display) { $array = array(); foreach($display as $key => $value) { $array[$value] = array("", 0, 0, 0, 0); } $this->setConfigColumn($array); } protected function constructDateFilter() { $conn = connection::getInstance($this->sbas_id); return((($this->dmin) && ($this->dmax)) ? "(log.date > '".$conn->escape_string($this->dmin)."' AND log.date < '".$conn->escape_string($this->dmax)."') ": ''); } protected function constructUserFilter() { if(sizeof($this->tab_filter) > 0) { $conn = connection::getInstance($this->sbas_id); $filter = ""; foreach ($this->tab_filter as $field => $value) { if(array_key_exists($value['f'], $this->cor_filter)) $value['f'] = $this->cor_query[$value['f']]; if($value['o'] == 'LIKE') $str = $value['f'].' '.$value['o'].' \'%'.$conn->escape_string($value['v']).'%\''; elseif($value['o'] == 'OR') $str = $value['f'].' '.$value['o'].' '.$value['v']; else $str = $value['f'].' '.$value['o'].' \''.$conn->escape_string($value['v']).'\''; $filter .= (($filter) ? ' AND ': '') . $str; } return $filter; } else { return false; } } protected function constructCollUserFilter() { $conn = connection::getInstance($this->sbas_id); $coll_filter = ''; if(($this->user_id != '') && ($this->list_coll_id != '')) { $tab = explode(",", $this->list_coll_id); if(is_array($tab)) { foreach($tab as $val) $coll_filter .= (($coll_filter) ? ' OR ' : '' ) . " position(',".$conn->escape_string($val).",' in concat(',' ,coll_list, ',')) > 0 "; } else $coll_filter = (($coll_filter) ? ' OR ' : '' ) . " position(',".$conn->escape_string($this->list_coll_id).",' in concat(',' ,coll_list, ',')) > 0 "; } return '('.$coll_filter.')'; } protected function constructDlUserFilter() { $conn = connection::getInstance($this->sbas_id); $dl_coll_filter =''; if(($this->user_id != '') && ($this->list_coll_id != '')) { $tab = explode(",", $this->list_coll_id); if(is_array($tab)) { foreach($tab as $val) $dl_coll_filter .= (($dl_coll_filter) ? ' OR ' : '') . "record.coll_id = '".$conn->escape_string($val)."'" ; } else $dl_coll_filter .= (($dl_coll_filter) ? ' OR ' : '') . "record.coll_id = '".$conn->escape_string($this->list_coll_id)."'" ; } return $dl_coll_filter; } protected function constructOrderFilter() { return((sizeof($this->tab_order) > 0) ? $this->cor_query[$this->tab_order['champ']].' '.$this->tab_order['order'] : false); } protected function constructLimitFilter() { if(!$this->nb_page || !$this->nb_record) { return false; } $conn = connection::getInstance($this->sbas_id); $limit_inf = ($conn->escape_string($this->nb_page) - 1) * $conn->escape_string($this->nb_record); $limit_sup = $conn->escape_string($this->nb_record); return $limit_inf.', '.$limit_sup; } /** * @desc Build the entire query filter from $tab_filter, $tab_order, $limit * @return array $tab_filter which contain the final WHERE, ORDER and LIMIT filter */ protected function buildFilter() { $finalfilter = ""; $conn = connection::getInstance($this->sbas_id); $datefilter = $this->constructDateFilter(); $filter = $this->constructUserFilter(); $coll_filter = $this->constructCollUserFilter(); $order = $this->constructOrderFilter(); $limit = $this->constructLimitFilter(); $dl = $this->constructDluserFilter(); if($datefilter) $finalfilter .= $datefilter.' AND '; if($filter) $finalfilter .= $filter.' AND '; if($coll_filter) $finalfilter .= '('.$coll_filter.') AND '; $finalfilter .= 'log.site="'.$conn->escape_string(GV_sit).'"'; $tab_filter = array( 'finalfilter' => $finalfilter ,'datefilter' => $datefilter ,'filter' => $filter ,'collfilter' => $coll_filter ,'order' => $order ,'limit' => $limit ,'dl_coll_filter' => $dl ); return $tab_filter; } /** * @desc Set your own configuration for each column displayed in the html table * @param array $tab contain your conf's variables array( 'field' => array('title of the colum', '1 = order ON / 0 = order OFF', '1 = bound ON / 0 = bound OFF') * @example $tab = array('user' => array('user list', 1, 0), * 'id' => array(user id, 0, 0)); etc .. * @return void */ protected function setConfigColumn($tab) { foreach($tab as $column => $row) { foreach($row as $ind => $value) { $def = false; if(array_key_exists($column, $this->cor)) { $title_text = $this->cor[$column]; $def = true; } empty($row[0]) ? $title = $column : $title = $row[0]; $sort = $row[1]; array_key_exists($column, $this->bound) ? $bound = $this->bound[$column] : $bound = $row[2]; $filter = (isset($row[3]) ? $row[3] : 0); $groupby = $row[4]; $config = array('title' => $title, 'sort' => $sort, 'bound' => $bound, 'filter' => $filter, 'groupby' => $groupby); $def ? $config['title'] = $title_text : ""; $this->display[$column] = $config; } } } /** * @desc Get the collection name by id . * @return array( id_coll => name_coll ) etc.. */ protected function returnCollName() { $sql = " SELECT coll_id as id, htmlname as name FROM coll ORDER BY htmlname"; $id_coll_to_coll_name = array(); $conn = connection::getInstance($this->sbas_id); if(!$conn || !$conn->isok()) throw new Exception('
La base '.phrasea::sbas_names($this->sbas_id).' n\'existe pas'); else { $rs = $conn->query($sql); while($row = $conn->fetch_assoc($rs)) $id_coll_to_coll_name[$row['id']] = $row['name']; } return $id_coll_to_coll_name; } /** * @desc build the final formated array which contains all the result, we construct the html code from this array * @param array $tab pass the configcolumn parameter to this tab * @return the formated array */ public function buildReport($tab = false, $groupby = false, $on = false) { //get connection $conn = connection::getInstance($this->sbas_id); //contruct request $this->buildReq($groupby, $on); //get result set try{ if($rs = $conn->query($this->req)) { //set request field $this->setChamp($rs); //set display $this->setDisplay($tab, $groupby); //construct results $this->buildResult($rs); //calculate prev and next page $this->calculatePages($rs); //do we display navigator ? $this->setDisplayNav(); //assign all variables $this->setReport(); // $conn->free_result($rs); return $this->report; } else { throw new Exception(); } } catch (Exception $e) { echo $e->getMessage()."\n"; } } /** * @desc return the text between the node we are looking for * @param string $unXml the XML string * @param string $champ the node * @return string */ public static function getChamp($unXml,$champ, $attribut = false) { $ret = ""; if($sxe = simplexml_load_string($unXml)) { if($attribut) { foreach($sxe->$champ->attributes() as $a => $b) { if($a == $attribut) { $ret.= $b; } } } else { $z = $sxe->xpath('/description/'.$champ); if(!$z) $z = $sxe->xpath('/record/description/'.$champ); if($z && is_array($z)) { $ret .= $z[0]; } } } $ret = trim($ret); if($ret==""||$ret==null) $ret=""._('report:: non-renseigne').""; return $ret; } /** *@desc get filds to display from structure xml *@param int $sbasid id of current sbas */ public function getResult() { return $this->result; } public static function getPreff($sbasid) { $conn2 = connection::getInstance($sbasid); $tab["struct"]=""; $tab['champs'] = array(); $sql2 = "SELECT value AS struct FROM pref WHERE prop='structure' LIMIT 1"; if($rs2 = $conn2->query($sql2)) { if(($row2 = $conn2->fetch_assoc($rs2)) ) { $tab["struct"] = $row2["struct"]; } $conn2->free_result($rs2); } if($sxe = simplexml_load_string($tab["struct"])) { $z = $sxe->xpath('/record/description'); if($z && is_array($z)) { foreach($z[0] as $ki => $vi) { foreach( $vi->attributes() as $a => $b ) { if($a=="report" && $b==1) $tab['champs'][] = $ki; } } } } return $tab['champs']; } public static function getDateFilter($dmin, $dmax) { return ((($dmin) && ($dmax)) ? "log.date > '$dmin' AND log.date < '$dmax' ": ""); } public static function getCollectionFilter($list_coll_id) { $coll_filter = ""; if(!empty($list_coll_id)) { $tab = explode(",", $list_coll_id); if(is_array($tab)) { foreach($tab as $val) $coll_filter .= (($coll_filter) ? ' OR ' : '' ) . " position(',$val,' in concat(',' ,coll_list, ',')) > 0 "; } else $coll_filter = (($coll_filter) ? ' OR ' : '' ) . " position(',$list_coll_id,' in concat(',' ,coll_list, ',')) > 0 "; } return ('('.$coll_filter.')'); } public static function unite($valeur) { if( $valeur >= pow(1024, 3) ) { $valeur = round( $valeur / pow(1024, 3), 2); return ($valeur . ' go'); } elseif( $valeur >= pow(1024, 2) ) { $valeur = round( $valeur / pow(1024, 2), 2); return ($valeur . ' mo'); } else { $valeur = round( $valeur / 1024, 2); return ($valeur . ' ko'); } } public static function getHost($url) { $parse_url = parse_url(trim($url)); return trim($parse_url['host'] ? $parse_url['host'] : array_shift(explode('/', $parse_url['path'], 2))); } public static function getUsrLogin($id_usr) { $conn = connection::getInstance(); $sql = ' SELECT usr_nom, usr_prenom, usr_mail, usr_login FROM usr WHERE usr_id="'.$conn->escape_string($id_usr).'"'; if($rs = $conn->query($sql)) { if($row = $conn->fetch_assoc($rs)) $login = $row['usr_login']; } return (isset($login) ? $login : _('phraseanet:: inconnu')); } } ?>