From bb6750def52bfd31e9ad995e804c74465951f2ed Mon Sep 17 00:00:00 2001 From: fredtempez Date: Sat, 6 Mar 2021 18:16:52 +0100 Subject: [PATCH] Gestion des modules par catalogue --- core/module/addon/addon.php | 127 ++- core/module/addon/view/index/index.php | 61 +- core/module/addon/view/store/store.php | 3 + core/module/addon/view/upload/upload.css | 18 + core/module/addon/view/upload/upload.php | 41 + module/statislite/include/stat.php | 171 ++++ module/statislite/statislite.php | 889 ++++++++++++++++++ module/statislite/view/config/config.js.php | 22 + module/statislite/view/config/config.php | 216 +++++ module/statislite/view/index/index.css | 120 +++ module/statislite/view/index/index.php | 469 +++++++++ .../filtres_primaires/liste_bot.txt | 34 + .../filtres_primaires/liste_querystring.txt | 1 + .../filtres_primaires/liste_vos_ip.txt | 5 + site/file/statislite/json/.htaccess | 10 + site/file/statislite/json_sauve/.htaccess | 10 + site/file/statislite/langages.txt | 59 ++ site/file/statislite/navigateurs.txt | 12 + site/file/statislite/systemes.txt | 12 + 19 files changed, 2190 insertions(+), 90 deletions(-) create mode 100644 core/module/addon/view/store/store.php create mode 100644 core/module/addon/view/upload/upload.css create mode 100644 core/module/addon/view/upload/upload.php create mode 100644 module/statislite/include/stat.php create mode 100644 module/statislite/statislite.php create mode 100644 module/statislite/view/config/config.js.php create mode 100644 module/statislite/view/config/config.php create mode 100644 module/statislite/view/index/index.css create mode 100644 module/statislite/view/index/index.php create mode 100644 site/file/statislite/filtres_primaires/liste_bot.txt create mode 100644 site/file/statislite/filtres_primaires/liste_querystring.txt create mode 100644 site/file/statislite/filtres_primaires/liste_vos_ip.txt create mode 100644 site/file/statislite/json/.htaccess create mode 100644 site/file/statislite/json_sauve/.htaccess create mode 100644 site/file/statislite/langages.txt create mode 100644 site/file/statislite/navigateurs.txt create mode 100644 site/file/statislite/systemes.txt diff --git a/core/module/addon/addon.php b/core/module/addon/addon.php index a1521575..336c421a 100644 --- a/core/module/addon/addon.php +++ b/core/module/addon/addon.php @@ -22,7 +22,9 @@ class addon extends common { 'index' => self::GROUP_ADMIN, 'moduleDelete' => self::GROUP_ADMIN, 'export' => self::GROUP_ADMIN, - 'import' => self::GROUP_ADMIN + 'import' => self::GROUP_ADMIN, + 'store' => self::GROUP_ADMIN, + 'upload' => self::GROUP_ADMIN ]; // Gestion des modules @@ -31,6 +33,9 @@ class addon extends common { // pour tests public static $valeur = []; + // le catalogue + public static $storeList = ''; + /* * Effacement d'un module installé et non utilisé */ @@ -78,56 +83,11 @@ class addon extends common { } } - - /** - * Gestion des modules + /*** + * Installation manuel d'un module par téléchargement */ - public function index() { - - // Lister les modules - // $infoModules[nom_module]['realName'], ['version'], ['update'], ['delete'], ['dataDirectory'] - $infoModules = helper::getModules(); - - // Clés moduleIds dans les pages - $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); - foreach( $inPages as $key=>$value){ - $inPagesTitle[ $this->getData(['page', $key, 'title' ]) ] = $value; - } - - // Parcourir les données des modules - foreach ($infoModules as $key=>$value) { - // Construire le tableau de sortie - self::$modInstal[] = [ - $key, - $infoModules[$key]['realName'], - $infoModules[$key]['version'], - implode(', ', array_keys($inPagesTitle,$key)), - //array_key_exists('delete',$infoModules[$key]) && $infoModules[$key]['delete'] === true && implode(', ',array_keys($inPages,$key)) === '' - $infoModules[$key]['delete'] === true && implode(', ',array_keys($inPages,$key)) === '' - ? template::button('moduleDelete' . $key, [ - 'class' => 'moduleDelete buttonRed', - 'href' => helper::baseUrl() . $this->getUrl(0) . '/moduleDelete/' . $key . '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel') - ]) - : '', - is_array($infoModules[$key]['dataDirectory']) && implode(', ',array_keys($inPages,$key)) !== '' - ? template::button('moduleExport' . $key, [ - 'class' => 'buttonBlue', - 'href' => helper::baseUrl(). $this->getUrl(0) . '/export/' . $key,// appel de fonction vaut exécution, utiliser un paramètre - 'value' => template::ico('download') - ]) - : '', - is_array($infoModules[$key]['dataDirectory']) && implode(', ',array_keys($inPages,$key)) === '' - ? template::button('moduleExport' . $key, [ - 'class' => 'buttonBlue', - 'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $key.'/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre - 'value' => template::ico('upload') - ]) - : '' - ]; - } - - // Retour du formulaire ? + public function upload() { + // Soumission du formulaire if($this->isPost()) { // Installation d'un module $success = true; @@ -242,6 +202,73 @@ class addon extends common { 'state' => $success ]); } + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Téléverser un module', + 'view' => 'upload' + ]); + } + + /** + * Catalogue des modules sur le site ZwiiCMS.fr + */ + public function store() { + $url = 'http://zwiicms.fr/?modules-2/list'; + self::$storeList = json_decode(helper::urlGetContents($url), true); + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Catalogue de modules', + 'view' => 'store' + ]); + } + + /** + * Gestion des modules + */ + public function index() { + + // Lister les modules + // $infoModules[nom_module]['realName'], ['version'], ['update'], ['delete'], ['dataDirectory'] + $infoModules = helper::getModules(); + + // Clés moduleIds dans les pages + $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); + foreach( $inPages as $key=>$value){ + $inPagesTitle[ $this->getData(['page', $key, 'title' ]) ] = $value; + } + + // Parcourir les données des modules + foreach ($infoModules as $key=>$value) { + // Construire le tableau de sortie + self::$modInstal[] = [ + $key, + $infoModules[$key]['realName'], + $infoModules[$key]['version'], + implode(', ', array_keys($inPagesTitle,$key)), + //array_key_exists('delete',$infoModules[$key]) && $infoModules[$key]['delete'] === true && implode(', ',array_keys($inPages,$key)) === '' + $infoModules[$key]['delete'] === true && implode(', ',array_keys($inPages,$key)) === '' + ? template::button('moduleDelete' . $key, [ + 'class' => 'moduleDelete buttonRed', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/moduleDelete/' . $key . '/' . $_SESSION['csrf'], + 'value' => template::ico('cancel') + ]) + : '', + is_array($infoModules[$key]['dataDirectory']) && implode(', ',array_keys($inPages,$key)) !== '' + ? template::button('moduleExport' . $key, [ + 'class' => 'buttonBlue', + 'href' => helper::baseUrl(). $this->getUrl(0) . '/export/' . $key,// appel de fonction vaut exécution, utiliser un paramètre + 'value' => template::ico('download') + ]) + : '', + is_array($infoModules[$key]['dataDirectory']) && implode(', ',array_keys($inPages,$key)) === '' + ? template::button('moduleExport' . $key, [ + 'class' => 'buttonBlue', + 'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $key.'/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + 'value' => template::ico('upload') + ]) + : '' + ]; + } // Valeurs en sortie $this->addOutput([ diff --git a/core/module/addon/view/index/index.php b/core/module/addon/view/index/index.php index 5248fdc9..f629147b 100644 --- a/core/module/addon/view/index/index.php +++ b/core/module/addon/view/index/index.php @@ -1,44 +1,25 @@ - -
-
- 'buttonGrey', - 'href' => helper::baseUrl(), - 'ico' => 'left', - 'value' => 'Retour' - ]); ?> -
-
- 'Valider', - 'ico' => 'check' - ]); ?> -
-
-
-
-
-

Installer ou mettre à jour un module

-
-
- 'Archive ZIP :', - 'type' => 2 - ]); ?> -
-
-
-
- false, - 'help' => 'Permet de forcer une mise à jour même si la version du module est inférieure ou égale à celle du module installé.', - ]); ?> -
-
-
-
+
+
+ 'buttonGrey', + 'href' => helper::baseUrl(), + 'ico' => 'left', + 'value' => 'Retour' + ]); ?>
- +
+ helper::baseUrl() . 'addon/upload', + 'value' => 'Téléverser' + ]); ?> +
+
+ helper::baseUrl() . 'addon/store', + 'value' => 'Catalogue' + ]); ?> +
+
diff --git a/core/module/addon/view/store/store.php b/core/module/addon/view/store/store.php new file mode 100644 index 00000000..82fb415a --- /dev/null +++ b/core/module/addon/view/store/store.php @@ -0,0 +1,3 @@ +"; +Var_dump($module::$storeList); \ No newline at end of file diff --git a/core/module/addon/view/upload/upload.css b/core/module/addon/view/upload/upload.css new file mode 100644 index 00000000..5a91e7a7 --- /dev/null +++ b/core/module/addon/view/upload/upload.css @@ -0,0 +1,18 @@ +/** + * This file is part of Zwii. + * + * For full copyright and license information, please see the LICENSE + * file that was distributed with this source code. + * + * @author Rémi Jean + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + */ + + +/** NE PAS EFFACER +* admin.css +*/ \ No newline at end of file diff --git a/core/module/addon/view/upload/upload.php b/core/module/addon/view/upload/upload.php new file mode 100644 index 00000000..73294c48 --- /dev/null +++ b/core/module/addon/view/upload/upload.php @@ -0,0 +1,41 @@ + +
+
+ 'buttonGrey', + 'href' => helper::baseUrl() . 'addon', + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
+
+ 'Valider', + 'ico' => 'check' + ]); ?> +
+
+
+
+
+

Installer ou mettre à jour un module

+
+
+ 'Archive ZIP :', + 'type' => 2 + ]); ?> +
+
+
+
+ false, + 'help' => 'Permet de forcer une mise à jour même si la version du module est inférieure ou égale à celle du module installé.', + ]); ?> +
+
+
+
+
+ \ No newline at end of file diff --git a/module/statislite/include/stat.php b/module/statislite/include/stat.php new file mode 100644 index 00000000..4266dbc5 --- /dev/null +++ b/module/statislite/include/stat.php @@ -0,0 +1,171 @@ + nouvel indice +if(!isset($_SESSION['indice']) || Time() - $_SESSION['actif'] > 600 ){ + $_SESSION['indice'] = bin2hex(openssl_random_pseudo_bytes(16)); + $_SESSION['actif'] = Time(); + unset($_SESSION['filtrage']); +} +$indice = $_SESSION['indice']; + +// Identification de l'utilisateur +$zwii_user_id = 'visiteur'; +if(isset($_COOKIE['ZWII_USER_ID'])){ + $zwii_user_id = $_COOKIE['ZWII_USER_ID']; +} +// Nouvel user_id suite à une connexion ou à une déconnexion => nouvel indice +if(isset($log[$indice]['user_id'])){ + if($zwii_user_id != $log[$indice]['user_id']){ + $_SESSION['indice'] = bin2hex(openssl_random_pseudo_bytes(16)); + $indice = $_SESSION['indice']; + $_SESSION['actif'] = Time(); + unset($_SESSION['filtrage']); + } +} + + + +// Lecture de l'adresse IP +// Si internet partagé +if (isset($_SERVER['HTTP_CLIENT_IP'])) { + $ip = $_SERVER['HTTP_CLIENT_IP']; +} +// Si derrière un proxy +elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { + $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; +} +// Sinon : IP normale +else { + if(isset($_SERVER['REMOTE_ADDR'])){ + $ip = $_SERVER['REMOTE_ADDR']; + } + else{ + $ip = ''; + } +} + +// Si filtre_primaire.json n'existe pas on le crée +if(!is_file($fichiers_json.'filtre_primaire.json')){ + $json = '{}'; + $fp= json_decode($json, true); + $fp['robots'] = array( 'ua' => 0, 'ip'=> 0); + $json = json_encode($fp); + file_put_contents($fichiers_json.'filtre_primaire.json',$json); +} + +// Filtrage des robots, test uniquement une fois en début de session +if(!isset($_SESSION['filtrage'])){ + + // Filtrage par HTTP_USER_AGENT + // liste_bot.txt à mettre à jour avec les données du site http://d1.a.free.fr/downloads.php + $user_agent = strtolower($_SERVER['HTTP_USER_AGENT']); + $UAbot = 0; + if(is_file($filtres_primaires.'liste_bot.txt')){ + $regex = file_get_contents($filtres_primaires.'liste_bot.txt'); + $UAbot=preg_match( $regex, $user_agent ); + } + //UA vide c'est considéré comme un robot + if ($user_agent == ""){ + $UAbot=1; + } + + // Filtrage par vos IP uniquement (CNIL) + $IPbot = 0; + if(is_file($filtres_primaires.'liste_vos_ip.txt')){ + $regex = file_get_contents($filtres_primaires.'liste_vos_ip.txt'); + $IPbot = preg_match( $regex, $ip ); + } + + $resultat = 0; + // Formation du résultat 1, 0 + if ($UAbot==1 || $IPbot==1){ + $resultat=1; + // comptage des 'robots' par type UA ou IP + if($UAbot == 1){ + $type = 'ua'; + // Enregistrement dans le fichier robots.json + if(is_file($fichiers_json.'robots.json')){ + $json = file_get_contents($fichiers_json.'robots.json'); + } + else{ + $json = '{}'; + } + $robots = json_decode($json, true); + $robots[date('Y/m/d H:i:s')] = $_SERVER['HTTP_USER_AGENT']; + // Limitation aux 200 derniers robots + if( count($robots) > 200){ + foreach($robots as $key=>$value){ + unset($robots[$key]); + break; + } + } + $json = json_encode($robots); + file_put_contents($fichiers_json.'robots.json',$json); + + } + else{ + $type = 'ip'; + } + $json = file_get_contents($fichiers_json.'filtre_primaire.json'); + $fp = json_decode($json, true); + $fp['robots'][$type] = $fp['robots'][$type] + 1; + $json = json_encode($fp); + file_put_contents($fichiers_json.'filtre_primaire.json',$json); + } + + $_SESSION['filtrage'] = $resultat; +} + +// Filtrage par QUERY STRING +$QSbot = 0; +if(is_file($filtres_primaires.'liste_querystring.txt')){ + $regex = file_get_contents($filtres_primaires.'liste_querystring.txt'); + $QSbot=preg_match( $regex, $_SERVER['QUERY_STRING'] ); +} + +// Si c'est un vrai visiteur et que la page n'est pas exclue on enregistre date et query string +if($_SESSION['filtrage'] == 0 && $QSbot == 0){ + + // Lecture et décodage du fichier json en cours + if(is_file($fichiers_json.'sessionLog.json')){ + $json = file_get_contents($fichiers_json.'sessionLog.json'); + if(strlen($json) < 20 ){ + $json = '{}'; + } + } + else{ + $json = '{}'; + } + $log = json_decode($json, true); + + //Initialisation si c'est un nouvel indice + if(!isset($log[$indice])){ + $log[$indice] = array('ip' => $ip, 'user_id'=> $zwii_user_id, 'userAgent' => $_SERVER['HTTP_USER_AGENT'], 'langage' => $_SERVER['HTTP_ACCEPT_LANGUAGE'], 'referer' => $_SERVER['HTTP_REFERER'], 'vues' => array(), 'client' => array() ); + } + // Ajout de la vue sous la forme date et page vue + $indice2 = count($log[$indice]['vues']); + if( $_SERVER['QUERY_STRING'] != ''){ + $log[$indice]['vues'][$indice2] = date('Y/m/d H:i:s').' * '.$_SERVER['QUERY_STRING']; + } + else{ + $log[$indice]['vues'][$indice2] = date('Y/m/d H:i:s').' * Page d\'accueil'; + } + + // Encodage et sauvegarde + $json = json_encode($log); + file_put_contents($fichiers_json.'sessionLog.json',$json); +} + +// Vatiable de session utilisée pour détecter l'activité +$_SESSION['actif'] = Time(); + +?> \ No newline at end of file diff --git a/module/statislite/statislite.php b/module/statislite/statislite.php new file mode 100644 index 00000000..57654e58 --- /dev/null +++ b/module/statislite/statislite.php @@ -0,0 +1,889 @@ + + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @license GNU General Public License, version 3 + * @link http://zwiicms.com/ + * + * Module StatisLite, un analyseur d'audience léger + * Développé par Sylvain Lelièvre + */ + +class statislite extends common { + + public static $actions = [ + 'config' => self::GROUP_MODERATOR, + 'initJson' => self::GROUP_MODERATOR, + 'sauveJson' => self::GROUP_MODERATOR, + 'index' => self::GROUP_VISITOR + ]; + + // Temps minimum de la visite + public static $timeVisiteMini = [ + '10' => '10 secondes', + '20' => '20 secondes', + '30' => '30 secondes', + '40' => '40 secondes', + '60' => '1 minute', + '120' => '2 minutes' + ]; + + // Temps minimum de vue d'une page + public static $timePageMini = [ + '3' => '3 secondes', + '5' => '5 secondes', + '10' => '10 secondes', + '20' => '20 secondes', + '40' => '40 secondes', + '60' => '1 minute' + ]; + + // Nombre de pages minimum visionnées + public static $nbPageMini = [ + '1' => '1 page', + '2' => '2 pages', + '3' => '3 pages', + '4' => '4 pages', + '5' => '5 pages' + ]; + + // Utilisateurs connectés à exclure des statistiques + public static $users_exclus = [ + '4' => 'aucun', + '1' => 'tous', + '2' => 'editeurs et administrateurs', + '3' => 'administrateurs' + ]; + + // Nombre de visites affichées dans affichage détaillé + public static $nbEnregSession = [ + '5' => '5 visites', + '10' => '10 visites', + '20' => '20 visites', + '50' => '50 visites', + '100' => '100 visites' + ]; + + // Nombre de dates affichées dans affichage chronologique + public static $nbAffiDates = [ + '0' => 'aucune', + '5' => '5 dates', + '10' => '10 dates', + '20' => '20 dates', + '1000' => 'toutes les dates' + ]; + + // Nombre de pages vues affichées graphiquement + public static $nbaffipagesvues = [ + '0' => 'aucune', + '5' => '5 pages', + '10' => '10 pages', + '20' => '20 pages', + '1000' => 'toutes les pages' + ]; + + // Nombre de langues affichées graphiquement + public static $nbaffilangues = [ + '0' => 'aucune', + '5' => '5 langues', + '10' => '10 langues', + '20' => '20 langues', + '1000' => 'toutes les langues' + ]; + + // Nombre de navigateurs affichés graphiquement + public static $nbaffinavigateurs = [ + '0' => 'aucun', + '5' => '5 navigateurs', + '10' => '10 navigateurs', + '20' => '20 navigateurs', + '1000' => 'tous les navigateurs' + ]; + + // Nombre de systèmes d'exploitation affichés graphiquement + public static $nbaffise = [ + '0' => 'aucun', + '5' => '5 systèmes', + '10' => '10 systèmes', + '20' => '20 systèmes', + '1000' => 'tous les systèmes' + ]; + + // Nombre de pays affichés graphiquement + public static $nbaffipays = [ + '0' => 'aucun', + '5' => '5 pays', + '10' => '10 pays', + '20' => '20 pays', + '1000' => 'tous les pays' + ]; + + // Variables transmises à view/index/index.php + public static $comptepages = 0; + public static $comptevisite = 0; + public static $dureevisites = 0; + public static $fichiers_json = './site/file/statislite/json/'; + public static $tmp = './site/file/statislite/tmp/'; + public static $base = './site/file/statislite/'; + public static $json_sauve = './site/file/statislite/json_sauve/'; + public static $filtres_primaires = './site/file/statislite/filtres_primaires/'; + + // Temps entre 2 mises à jour de cumul.json et chrono.json (11 minutes) + public static $timemaj = 660; + + const STATISLITE_VERSION = '2.5'; + + /** + * Configuration + */ + public function config() { + + // Ajout dans le fichier site/file/statislite/filtres_primaires/liste_querystring.txt de pages à exclure des statistiques + if( is_file( self::$filtres_primaires.'liste_querystring.txt')){ + $qs = file_get_contents(self::$filtres_primaires.'liste_querystring.txt'); + $qsnew = str_replace('pages_stat',$this->getUrl(0).'|page\/edit\/'.$this->getUrl(0).'|'.$this->getUrl(0).'\/config', $qs); + file_put_contents( self::$filtres_primaires.'liste_querystring.txt', $qsnew); + } + + // Soumission du formulaire + if($this->isPost()) { + $this->setData(['module', $this->getUrl(0), 'config',[ + 'timeVisiteMini' => $this->getInput('statisliteConfigTimeVisiteMini', helper::FILTER_STRING_SHORT, true), + 'timePageMini' => $this->getInput('statisliteConfigTimePageMini', helper::FILTER_STRING_SHORT, true), + 'nbPageMini' => $this->getInput('statisliteConfigNbPageMini', helper::FILTER_STRING_SHORT, true), + 'usersExclus' => $this->getInput('statisliteConfigUsersExclus', helper::FILTER_STRING_SHORT, true), + 'nbEnregSession' => $this->getInput('statisliteConfigNbEnregSession', helper::FILTER_STRING_SHORT, true), + 'geolocalisation' => $this->getInput('statisliteConfigGeolocalisation', helper::FILTER_BOOLEAN), + 'nbaffipagesvues' => $this->getInput('statisliteConfigNbAffiPagesVues'), + 'nbaffilangues' => $this->getInput('statisliteConfigNbAffiLangues'), + 'nbaffinavigateurs' => $this->getInput('statisliteConfigNbAffiNavigateurs'), + 'nbaffise' => $this->getInput('statisliteConfigNbAffiSe'), + 'nbaffipays' => $this->getInput('statisliteConfigNbAffiPays'), + 'nbaffidates' => $this->getInput('statisLiteConfigNbAffiDates'), + 'config' => true + ]]); + + // Inclusion dans body.inc.html + $str=[]; + $str[0] = ''; + $str[1] = ''; + $str[2] = ''; + $strbody =''; + foreach($str as $key=>$value){ + $strbody = $strbody.$value."\r\n"; + } + // Si le fichier body.inc.html existe + if( file_exists('./site/data/body.inc.html' )){ + $file = file_get_contents( './site/data/body.inc.html' ); + // Les chaînes ne sont pas trouvées + if( strpos( $file, $str[0]) === false || strpos( $file, $str[2]) === false || strpos($file,$str[1]) === false ){ + file_put_contents( './site/data/body.inc.html', $file."\r\n".$strbody); + } + } + else{ + file_put_contents( './site/data/body.inc.html', $strbody ); + } + + // Restauration si le fichier sélectionné est un fichier cumul.json + $file_cumul = $this->getInput('configRestoreJson', helper::FILTER_STRING_SHORT); + if( strpos( $file_cumul, 'cumul.json' ) === 15){ + // Sauvegarde de sécurité des fichiers json + $this->sauvegardeJson(); + $date = substr( $file_cumul, 0 , 15); + $nameFile = [ '0'=>'cumul.json', '1'=>'affitampon.json', '2'=>'chrono.json', '3'=>'robots.json', '4'=>'sessionInvalide.json', '5'=>'sessionLog.json', ]; + foreach( $nameFile as $key=>$file){ + if( is_file( self::$json_sauve.$date.$file )){ + file_put_contents(self::$fichiers_json.$file, file_get_contents(self::$json_sauve.$date.$file)); + } + } + } + + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl().$this->getUrl(), + 'notification' => 'Modifications enregistrées', + 'state' => true + ]); + } + else{ + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Configuration du module', + 'view' => 'config' + ]); + } + } + + + /** + * Fonction initJson() + */ + public function initJson() { + // Jeton incorrect + if ($this->getUrl(2) !== $_SESSION['csrf']) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config', + 'notification' => 'Action non autorisée' + ]); + } else { + // Sauvegarde de sécurité des fichiers json + $this->sauvegardeJson(); + // Réinitialisation des fichiers json + $this -> initcumul(); + $this -> initchrono(); + file_put_contents( self::$fichiers_json.'robots.json', '{}'); + file_put_contents( self::$fichiers_json.'sessionInvalide.json', '{}'); + file_put_contents( self::$fichiers_json.'affitampon.json', '{}'); + file_put_contents( self::$fichiers_json.'sessionLog.json', '{}'); + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config', + 'notification' => 'Réinitialisation des fichiers json effectuée', + 'state' => true + ]); + + } + } + + + /** + * Fonction sauveJson() + */ + public function sauveJson() { + // Sauvegarde des fichiers json + $this->sauvegardeJson(); + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config', + 'notification' => 'Sauvegarde des fichiers json effectuée', + 'state' => true + ]); + + } + + + /** + * Fonction index() + */ + public function index() { + + // Si le module n'existe pas, on le crée avec des valeurs par défaut + if( $this->getData(['module', $this->getUrl(0), 'config', 'config']) !== true){ + $this->setData(['module', $this->getUrl(0), 'config',[ + 'timeVisiteMini' => '30', + 'timePageMini' => '5', + 'nbPageMini' => '2', + 'usersExclus' => '3', + 'nbEnregSession' => '5', + 'geolocalisation' => false, + 'nbaffipagesvues' => '10', + 'nbaffilangues' => '5', + 'nbaffinavigateurs' => '5', + 'nbaffise' => '5', + 'nbaffipays' => '5', + 'nbaffidates' => '5', + 'config' => false + ]]); + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl().$this->getUrl(0).'/config', + 'notification' => 'Module initialisé avec les valeurs par défaut', + 'state' => true + ]); + } + else{ + + + /* + * Paramètres réglés en configuration du module + */ + // Temps minimum à passer sur le site en secondes pour valider une visite + $timeVisiteMini = $this->getData(['module', $this->getUrl(0), 'config', 'timeVisiteMini' ]); + // Temps minimum à passer sur une page pour la considérer comme vue + $timePageMini = $this->getData(['module', $this->getUrl(0), 'config', 'timePageMini' ]); + // Nombre de pages vues dans le site minimum + $nbpagemini = $this->getData(['module', $this->getUrl(0), 'config', 'nbPageMini' ]); + // Utilisateurs connectés à exclure des statistiques + $usersExclus = $this->getData(['module', $this->getUrl(0), 'config', 'usersExclus' ]); + // Affichage graphique : nombre de pages vues à afficher en commençant par la plus fréquente de 0 à toutes + $nbaffipagesvues = $this->getData(['module', $this->getUrl(0), 'config', 'nbaffipagesvues']); + // Affichage graphique : nombre de langues à afficher en commençant par la plus fréquente de 0 à toutes + $nbaffilangues = $this->getData(['module', $this->getUrl(0), 'config', 'nbaffilangues']); + // Affichage graphique : nombre de navigateurs à afficher en commençant par le plus fréquent de 0 à toutes + $nbaffinavigateurs = $this->getData(['module', $this->getUrl(0), 'config', 'nbaffinavigateurs']); + // Affichage graphique : nombre de systèmes d'exploitation à afficher en commençant par le plus fréquent de 0 à toutes + $nbaffise = $this->getData(['module', $this->getUrl(0), 'config', 'nbaffise']); + // Affichage graphique : nombre de pays à afficher en commençant par le plus fréquent de 0 à toutes + $nbaffipays = $this->getData(['module', $this->getUrl(0), 'config', 'nbaffipays']); + // Nombre de sessions affichées dans l'affichage détaillé + $nbEnregSession = $this->getData(['module', $this->getUrl(0), 'config', 'nbEnregSession' ]); + // Nombre de dates affichées dans l'affichage chronologique + $nbAffiDates = $this->getData(['module', $this->getUrl(0), 'config', 'nbaffidates' ]); + // option avec geolocalisation + $geolocalisation = $this->getData(['module', $this->getUrl(0), 'config', 'geolocalisation' ]); + + // Initialisations variables + //self::$base = './site/file/statislite/'; + self::$comptevisite = 0; + self::$comptepages = 0; + self::$dureevisites = 0; + $datedebut = date('Y/m/d H:i:s'); + + // Initialisation du fichier cumul.json + if(! is_file(self::$fichiers_json.'cumul.json')){ + $this -> initcumul(); + } + + // Initialisation du fichier chrono.json avec pour clef la date, pour valeurs le nombre visites, le nombre de pages vues, la durée totale + if(! is_file(self::$fichiers_json.'chrono.json')){ + $this -> initchrono(); + } + + // Lecture et décodage du fichier sessionLog.json + if( is_file(self::$fichiers_json.'sessionLog.json')){ + $json = file_get_contents(self::$fichiers_json.'sessionLog.json'); + } + else{ + $json = '{}'; + } + $log = json_decode($json, true); + + // Recherche de la première date dans le fichier sessionLog.json + foreach($log as $numSession=>$values){ + $datedebut = substr($log[$numSession]['vues'][0], 0 , 19); + break; + } + + // Remplacement du nom de vue 'Page d'accueil' par le nom de la page d'accueil + foreach($log as $numSession=>$values){ + foreach($values['vues'] as $key=>$value){ + if( substr($value, 22 , strlen($value)) == 'Page d\'accueil'){ + $log[$numSession]['vues'][$key] = substr($value, 0 , 19).' * '.$this->getData(['config','homePageId']); + } + } + } + + /* + * Filtrage des vues et des visites dans le fichier sessionLog.json + * vues invalidées si : temps passé sur une page < $timePageMini ou 2 pages consécutives de même nom (si au moins 2 pages vues) + * vues invalidées si : elles ne correspondent pas à une page existante (le nom de la vue doit commencer par le nom d'une page existante) + * visites invalidées si: nombre de pages vues < $nbpagemini ou temps de visite < $timeVisiteMini. + * visites invalidées si : utilisateur connecté exclu des statistiques + * Comptage des vues par session et des visites validées, + * Comptage des sessions invalidées par $nbpagemini, $timeVisiteMini ou $usersExclus. + */ + + foreach($log as $numSession=>$values){ + $nbpageparsession = count($log[$numSession]['vues']); + // Eliminer les vues dont le nom ne commence pas par un nom de page existante + $pages = $this->getData(['page']); + foreach($pages as $page => $pageId) { + if ($this->getData(['page',$page,'block']) === 'bar' || + $this->getData(['page',$page,'disable']) === true) { + unset($pages[$page]); + } + } + $renum = false; + foreach($log[$numSession]['vues'] as $key => $nom_vue){ + $nom = substr($nom_vue, 22); + if(strpos($nom,'/') === false){ + $debut_nom = $nom; + } + else{ + $debut_nom = substr($nom, 0, strpos($nom,'/')); + } + $occurence = false; + foreach($pages as $page => $pageId){ + if($debut_nom == $page){ + $occurence = true; + } + } + if($occurence === false){ + unset($log[$numSession]['vues'][$key]); + $renum = true; + } + } + if($renum){ + $i = 0; + $tableau[$numSession] = array('vues' => array() ); + foreach($log[$numSession]['vues'] as $key=>$value){ + $tableau[$numSession]['vues'][$i] = $value; + $i++; + } + $log[$numSession]['vues'] = $tableau[$numSession]['vues']; + $nbpageparsession = count($log[$numSession]['vues']); + } + // Eliminer les vues dont la durée est inférieure à $timePageMini et les vues n portant le même nom que la vue n+1 + // si il y a au moins 2 pages vues dans la session + $renum = false; + if( $nbpageparsession > 1){ + for($i = 0; $i < $nbpageparsession - 1; $i++){ + if( strtotime(substr($log[$numSession]['vues'][$i + 1], 0 , 19)) - strtotime(substr($log[$numSession]['vues'][$i], 0 , 19)) < $timePageMini + || substr($log[$numSession]['vues'][$i+1], 22 , strlen($log[$numSession]['vues'][$i+1])) == substr($log[$numSession]['vues'][$i], 22 , strlen($log[$numSession]['vues'][$i]))){ + unset($log[$numSession]['vues'][$i]); + $renum = true; + } + } + } + // Si nécessaire renuméroter les clefs du tableau $log[$numSession]['vues'] : 0,1,2 etc... + if($renum){ + $i = 0; + $tableau[$numSession] = array('vues' => array() ); + foreach($log[$numSession]['vues'] as $key=>$value){ + $tableau[$numSession]['vues'][$i] = $value; + $i++; + } + $log[$numSession]['vues'] = $tableau[$numSession]['vues']; + $nbpageparsession = count($log[$numSession]['vues']); + } + $ip = $log[$numSession]['ip']; + $datetimei = strtotime(substr($log[$numSession]['vues'][0], 0 , 19)); + // Si $nbpageparsession <=1 on force la valeur de $datetimef + if($nbpageparsession <= 1){ + $datetimef = $datetimei + $timeVisiteMini; + } + else{ + $datetimef = strtotime(substr($log[$numSession]['vues'][$nbpageparsession - 1], 0 , 19)); + } + $dureesession = $datetimef - $datetimei; + // Recherche du groupe (0,1,2,3) correspondant à l'utilisateur connecté + $groupe_user_connected = 0; + $user_connected = $log[$numSession]['user_id']; + if( null !== $this->getData(['user', $user_connected,'group'])){ + if($user_connected != 'visiteur'){ + $groupe_user_connected = $this->getData(['user', $user_connected, 'group']); + } + } + // Si le nombre de pages vues dans la session est >= $nbpagemini et si la durée de la session est >= $timeVisiteMini + // et si l'utilisateur connecté n'est pas exclu des statistiques + if( $nbpageparsession >= $nbpagemini && $dureesession >= $timeVisiteMini + && $groupe_user_connected < $usersExclus ){ + // Mises à jour des variables pour affichage des statistiques + self::$comptepages = self::$comptepages + $nbpageparsession; + self::$comptevisite++; + self::$dureevisites = self::$dureevisites + $dureesession; + // Modification des élèments null en '' + if( is_null($log[$numSession]['referer'])){$log[$numSession]['referer'] = '';} + if( is_null($log[$numSession]['langage'])){$log[$numSession]['langage'] = '';} + if( is_null($log[$numSession]['userAgent'])){$log[$numSession]['userAgent'] = '';} + // Recherche de $log[$numSession]['client'][0] : langage préféré + $log[$numSession]['client'][0] = $this->langage($log[$numSession]['langage']); + // Recherche de $log[$numSession]['client'][1] : navigateur + $log[$numSession]['client'][1] = $this->navigateur($log[$numSession]['userAgent']); + // Recherche de $log[$numSession]['client'][2] : système d'exploitation + $log[$numSession]['client'][2] = $this->systeme($log[$numSession]['userAgent']); + // Geolocalisation si elle n'a pas été faite et si l'IP n'est pas déjà détruite + if(isset($log[$numSession]['ip'])){ + if($geolocalisation && ! isset($log[$numSession]['geolocalisation'])){ + $geo = $this->geolocalise($log[$numSession]['ip']); + $log[$numSession]['geolocalisation'] = $geo['country_name'].' - '.$geo['city']; + } + // CNIL : ne pas mémoriser d'adresse IP + unset($log[$numSession]['ip']); + } + } + // Sinon on supprime cet enregistrement de sessionLog.json et on l'enregistre dans sessionInvalide.json + // puis on enregistre dans cumul.json le résultat du filtrage par nombre de pages,temps de visite ou utilisateur exclu + else{ + // Lecture et décodage du fichier sessionInvalide.json + if( is_file(self::$fichiers_json.'sessionInvalide.json') ){ + $json = file_get_contents(self::$fichiers_json.'sessionInvalide.json'); + } + else{ + $json = '{}'; + } + $poub = json_decode($json, true); + $poub[$numSession] = $log[$numSession]; + // CNIL : même dans le fichier sessionInvalide.json on ne conserve pas d'IP + unset($poub[$numSession]['ip']); + unset($poub[$numSession]['client']); + // Limitation de la taille du fichier sessionInvalide.json à 200 enregistrements + if(count($poub) > 200){ + foreach($poub as $key=>$value){ + unset($poub[$key]); + break; + } + } + // Encodage et sauvegarde du fichier sessionInvalide.json + $json = json_encode($poub); + file_put_contents(self::$fichiers_json.'sessionInvalide.json',$json); + // Suppression de la session + unset($log[$numSession]); + // Enregistrement dans cumul.json du résultat du filtrage + // np + tv + ue >= nombre de sessionInvalide car une même session peut être éliminée plusieurs fois + // A chaque fois np tv ou ue s'incrémente mais la sessionInvalide de même numéro de session est simplement modifiée + if($nbpageparsession < $nbpagemini){ + $type = 'np'; + } + elseif($dureesession < $timeVisiteMini){ + $type = 'tv'; + } + else{ + $type = 'ue'; + } + $json = file_get_contents(self::$fichiers_json.'cumul.json'); + $cumul = json_decode($json, true); + $cumul['robots'][$type] = $cumul['robots'][$type] + 1; + $json = json_encode($cumul); + file_put_contents(self::$fichiers_json.'cumul.json',$json); + } + } + + + /* + * Mise à jour du dossier affitampon.json destiné à l'affichage détaillé + * + */ + if( is_file(self::$fichiers_json.'affitampon.json')){ + $json = file_get_contents(self::$fichiers_json.'affitampon.json'); + } + else{ + $json='{}'; + } + $tampon = json_decode($json, true); + foreach($log as $numSession=>$values){ + $tampon[$numSession] = $log[$numSession]; + } + // Fichier limité à 200 enregistrements + if( count($tampon) > 200){ + foreach($tampon as $key=>$value){ + unset($tampon[$key]); + if(count($tampon) <= 200){ break; } + } + } + $json = json_encode($tampon); + file_put_contents(self::$fichiers_json.'affitampon.json',$json); + + + /* + * Sauvegarde des données de sessionLog.json vers cumul.json et chrono.json + * Réalisée si le dernier clic pour chaque session de sessionLog.json date de plus de $timemaj >= 10 minutes + * Objectif conserver dans sessionLog.json les sessions qui sont encore peut être actives + * Sauvegarde des données de filtre_primaire.json vers cumul.json + */ + + $json = file_get_contents(self::$fichiers_json.'cumul.json'); + $cumul = json_decode($json, true); + + // Sauvegarde des données de filtre_primaire.json vers cumul.json + $json = file_get_contents(self::$fichiers_json.'filtre_primaire.json'); + $fp = json_decode($json, true); + $cumul['robots']['ua'] = $cumul['robots']['ua'] + $fp['robots']['ua']; + $cumul['robots']['ip'] = $cumul['robots']['ip'] + $fp['robots']['ip']; + $fp['robots']['ua'] = 0; + $fp['robots']['ip'] = 0; + $json = json_encode($fp); + file_put_contents(self::$fichiers_json.'filtre_primaire.json',$json); + + // Sauvegarde des données de sessionLog.json vers cumul.json et chrono.json + foreach($log as $numSession=>$values){ + $nbpageparsession = count($log[$numSession]['vues']); + $nbpagesvalides = $nbpageparsession; + $tab = $log; + if( (time() - strtotime(substr($log[$numSession]['vues'][$nbpageparsession -1], 0, 19))) > self::$timemaj){ + // Comptage du nombre de pages dans la session en ne comptant qu'une fois les pages de même nom + // $nbpagesvalides sera utilisé par cumul.json et chrono.json, $tab est utilisé pour la maj du tableau $cumul['pages'] + if($nbpageparsession >= 2){ + foreach($tab[$numSession]['vues'] as $key=>$value){ + $nom = substr($value, 22 , strlen($value)); + //$date = strtotime(substr($value, 0 , 19)); ajouter dans le if && ( strtotime(substr($tab[$numSession]['vues'][$i], 0 , 19)) - $date) < 60) + for($i=$key + 1 ; $i < $nbpageparsession; $i++){ + if( substr($tab[$numSession]['vues'][$i], 22 , strlen($tab[$numSession]['vues'][$i])) == $nom){ + unset($tab[$numSession]['vues'][$i]); + } + } + } + $nbpagesvalides = count($tab[$numSession]['vues']); + } + // Mise à jour du tableau $cumul + $cumul['nb_clics'] = $cumul['nb_clics'] + $nbpagesvalides; + $cumul['nb_visites']++; + $cumul['date_fin'] = substr( $log[$numSession]['vues'][$nbpageparsession - 1], 0, 19); + $datetimei = strtotime(substr($log[$numSession]['vues'][0], 0 , 19)); + $datetimef = strtotime(substr($log[$numSession]['vues'][$nbpageparsession - 1], 0 , 19)); + $dureesession = $datetimef - $datetimei; + $cumul['duree_visites'] = $cumul['duree_visites'] + $dureesession; + + //langage préféré + if($log[$numSession]['client'][0] != 'fichier langages.txt absent'){ + $clefreconnue = false; + foreach($cumul['clients']['langage'] as $key => $value){ + // Si la clef == l'enregistrement dans log de la langue préférée on incrémente la valeur + if( $key == $log[$numSession]['client'][0]){ + $cumul['clients']['langage'][$key]++; + $clefreconnue = true; + } + } + // Si une clef valide n'a pas été trouvée on la crée avec une valeur initialisée à 1 + if(!$clefreconnue){ + $cumul['clients']['langage'][$log[$numSession]['client'][0]] = 1; + } + } + + // Navigateur + if($log[$numSession]['client'][1] != 'fichier navigateurs.txt absent'){ + $clefreconnue = false; + foreach($cumul['clients']['navigateur'] as $key => $value){ + // Si la clef == l'enregistrement dans log du navigateur on incrémente la valeur + if( $key == $log[$numSession]['client'][1]){ + $cumul['clients']['navigateur'][$key]++; + $clefreconnue = true; + } + } + // Si une clef valide n'a pas été trouvée on la crée avec une valeur initialisée à 1 + if(!$clefreconnue){ + $cumul['clients']['navigateur'][$log[$numSession]['client'][1]] = 1; + } + } + + // Systèmes d'exploitation + if($log[$numSession]['client'][2] != 'fichier systemes.txt absent'){ + $clefreconnue = false; + foreach($cumul['clients']['systeme'] as $key => $value){ + // Si la clef == l'enregistrement dans log du systeme on incrémente la valeur + if( $key == $log[$numSession]['client'][2]){ + $cumul['clients']['systeme'][$key]++; + $clefreconnue = true; + } + } + // Si une clef valide n'a pas été trouvée on la crée avec une valeur initialisée à 1 + if(!$clefreconnue){ + $cumul['clients']['systeme'][$log[$numSession]['client'][2]] = 1; + } + } + + // Geolocalisation + if($log[$numSession]['geolocalisation'] != 'Fichier - clef_ipapi_com.txt - absent , .'){ + // Extraction du pays + $postiret = strpos($log[$numSession]['geolocalisation'], '-'); + $pays = substr($log[$numSession]['geolocalisation'], 0, $postiret - 1); + $clefreconnue = false; + foreach($cumul['clients']['localisation'] as $key => $value){ + // Si la clef == l'enregistrement dans log de la geolocalisation on incrémente la valeur + if( $key == $pays){ + $cumul['clients']['localisation'][$key]++; + $clefreconnue = true; + } + } + // Si une clef valide n'a pas été trouvée on la crée avec une valeur initialisée à 1 + if(!$clefreconnue){ + $cumul['clients']['localisation'][$pays] = 1; + } + } + + // Mise à jour des variables liées au fichier sessionLog.json + self::$comptepages = self::$comptepages - $nbpageparsession; + self::$comptevisite--; + self::$dureevisites = self::$dureevisites - ( $datetimef - $datetimei ); + + // Enregistrement des pages vues dans $cumul à partir de $tab + foreach($tab[$numSession]['vues'] as $vues=>$values){ + $page = substr($values, 22, strlen($values)); + if(isset($cumul['pages'][$page])){ + $cumul['pages'][$page] = $cumul['pages'][$page] + 1; + } + else{ + $cumul['pages'][$page] = 1; + } + } + + // Mise à jour du fichier chrono.json + $dateclef = substr($log[$numSession]['vues'][0], 0 , 10); + $json = file_get_contents(self::$fichiers_json.'chrono.json'); + $chrono = json_decode($json, true); + if( ! isset($chrono[$dateclef])){ + $chrono[$dateclef] = array( 'nb_visites' => 0, 'nb_pages_vues' => 0, 'duree' =>0); + } + $chrono[$dateclef]['nb_visites']++; + $chrono[$dateclef]['nb_pages_vues'] = $chrono[$dateclef]['nb_pages_vues'] + $nbpagesvalides; + $chrono[$dateclef]['duree'] = $chrono[$dateclef]['duree'] + $dureesession; + // Tri du tableau par clefs en commençant par la date la plus récente + krsort($chrono); + // Limitation aux 100 dernières dates + if( count($chrono) > 100){ + $derniereclef = ''; + foreach($chrono as $key => $value){ + $derniereclef = $key; + } + unset($chrono[$derniereclef]); + } + // Encodage et sauvegarde de chrono.json + $json = json_encode($chrono); + file_put_contents(self::$fichiers_json.'chrono.json',$json); + + // Suppression des données sauvegardées + unset($log[$numSession]); + } + } + // Mise à jour des fichiers sessionLog.json et cumul.json + $json = json_encode($log); + file_put_contents(self::$fichiers_json.'sessionLog.json',$json); + $json = json_encode($cumul); + file_put_contents(self::$fichiers_json.'cumul.json',$json); + + + // Valeurs en sortie + $this->addOutput([ + 'showBarEditButton' => true, + 'showPageContent' => true, + 'view' => 'index' + ]); + } + } + + + /* + * Fonctions + */ + + /* Recherche de la langue préférée*/ + private function langage($lang){ + $langsigle = strtolower(substr($lang, 0, 2)); + // Ouvrir le fichier langages.txt et le transformer en array() + if(is_file(self::$base.'langages.txt')){ + $chaine = file_get_contents(self::$base.'langages.txt'); + // Suppression des lf + $chaine1 = str_replace("\r", '', $chaine); + $chaine = str_replace("\n", '', $chaine); + $langues = explode('*', $chaine); + foreach($langues as $souschaine){ + $tablang = explode(',' , $souschaine); + if($tablang[0] == $langsigle){ + return $tablang[1]; + } + } + return 'non reconnu'; + } + else{ + return 'fichier langages.txt absent'; + } + } + + /* Recherche du navigateur */ + private function navigateur($navig){ + $navig = strtolower($navig); + // Ouvrir le fichier navigateurs.txt et le transformer en array() + if(is_file(self::$base.'navigateurs.txt')){ + $chaine = file_get_contents(self::$base.'navigateurs.txt'); + // Suppression des cr lf + $chaine1 = str_replace("\r", '', $chaine); + $chaine = str_replace("\n", '', $chaine1); + $navigateurs = explode('*', $chaine); + foreach($navigateurs as $souschaine){ + $tabnavig = explode(',' , $souschaine); + if(strpos($navig, $tabnavig[0]) !== false){ + return $tabnavig[1]; + } + } + return 'non reconnu'; + } + else{ + return 'fichier navigateurs.txt absent'; + } + } + + /* Recherche du système d'exploitation */ + private function systeme($se){ + $se = strtolower($se); + // Ouvrir le fichier systemes.txt et le transformer en array() + if(is_file(self::$base.'systemes.txt')){ + $chaine = file_get_contents(self::$base.'systemes.txt'); + // Suppression des cr lf + $chaine1 = str_replace("\r", '', $chaine); + $chaine = str_replace("\n", '', $chaine1); + $systemes = explode('*', $chaine); + foreach($systemes as $souschaine){ + $tabse = explode(',' , $souschaine); + if(strpos($se, $tabse[0]) !== false){ + return $tabse[1]; + } + } + return 'non reconnu'; + } + else{ + return 'fichier systemes.txt absent'; + } + } + + + /* Geolocalisation */ + + private function geolocalise($ip){ + // Géolocalisation avec le site www.ipapi.com qui offre 10000 requêtes / mois + if( is_file(self::$base.'clef_ipapi_com.txt')){ + $access_key = file_get_contents(self::$base.'clef_ipapi_com.txt'); + // Requête + $ch = curl_init('http://api.ipapi.com/'.$ip.'?access_key='.$access_key.''); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + //Enregistrement des données + $json = curl_exec($ch); + curl_close($ch); + // Decode JSON response: + $api_result = json_decode($json, true); + } + else{ + $api_result = array( 'country_name'=>'Fichier ','city'=> 'clef_ipapi_com.txt ','latitude'=> 'absent','longitude' => '.'); + } + return $api_result; + } + + /* Initialisation de cumul.json */ + private function initcumul(){ + $json = '{}'; + $cumul = json_decode($json, true); + $cumul['nb_clics'] = 0; + $cumul['nb_visites'] = 0; + $cumul['duree_visites'] = 0; + $cumul['clients'] = array( 'systeme' => array(), 'navigateur' => array(), 'langage' => array(), 'localisation' => array()); + // $cumul['robots'] comptabilise toutes les visites (sessions) exclues + // 'ua' pour user agent de robot, 'ip' pour ip exclu, 'np' pour nombre de pages vues insuffisantes + // 'tv' pour temps de visite trop court, 'ue' pour utilisateur exclu + $cumul['robots'] = array( 'ua' => 0, 'ip'=> 0, 'np'=> 0, 'tv'=> 0, 'ue'=>0); + // Si sessionLog.json existe et n'est pas vide date_debut sera sa première date sinon ce sera la date actuelle + $cumul['date_debut'] = date('Y/m/d H:i:s'); + if(is_file(self::$fichiers_json.'sessionLog.json')){ + $json = file_get_contents(self::$fichiers_json.'sessionLog.json'); + $log = json_decode($json, true); + foreach($log as $numSession=>$values){ + if(isset($log[$numSession]['vues'][0])){ + $cumul['date_debut'] = substr($log[$numSession]['vues'][0], 0 , 19); + } + break; + } + } + $cumul['date_fin'] = date('Y/m/d H:i:s'); + $cumul['pages'] = array(); + $json = json_encode($cumul); + file_put_contents(self::$fichiers_json.'cumul.json',$json); + } + + /* Initilaisation de chrono.json */ + private function initchrono(){ + $json = '{}'; + $chrono = json_decode($json, true); + $chrono[date('Y/m/d')] = array( 'nb_visites' => 0, 'nb_pages_vues' => 0, 'duree' =>0); + $json = json_encode($chrono); + file_put_contents(self::$fichiers_json.'chrono.json',$json); + } + + /* Sauvegarde des fichiers json */ + private function sauvegardeJson(){ + $date = date('YmdHis'); + if( is_file( self::$fichiers_json.'robots.json' )) copy( self::$fichiers_json.'robots.json', self::$json_sauve.$date.'_robots.json'); + if( is_file( self::$fichiers_json.'affitampon.json' )) copy( self::$fichiers_json.'affitampon.json', self::$json_sauve.$date.'_affitampon.json'); + if( is_file( self::$fichiers_json.'chrono.json' )) copy( self::$fichiers_json.'chrono.json', self::$json_sauve.$date.'_chrono.json'); + if( is_file( self::$fichiers_json.'sessionInvalide.json' )) copy( self::$fichiers_json.'sessionInvalide.json', self::$json_sauve.$date.'_sessionInvalide.json'); + if( is_file( self::$fichiers_json.'cumul.json' )) copy( self::$fichiers_json.'cumul.json', self::$json_sauve.$date.'_cumul.json'); + if( is_file( self::$fichiers_json.'sessionLog.json' )) copy( self::$fichiers_json.'sessionLog.json', self::$json_sauve.$date.'_sessionLog.json'); + + } + +} + diff --git a/module/statislite/view/config/config.js.php b/module/statislite/view/config/config.js.php new file mode 100644 index 00000000..79c4cd3e --- /dev/null +++ b/module/statislite/view/config/config.js.php @@ -0,0 +1,22 @@ +/** + * This file is part of Zwii. + * + * For full copyright and license information, please see the LICENSE + * file that was distributed with this source code. + * + * @author Rémi Jean + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + */ + + +/** + * Confirmation de réinitialisation + */ +$(".configInitJson").on("click", function() { + var _this = $(this); + return core.confirm("Êtes-vous sûr de vouloir réinitialiser, remettre à 0, toutes les statistiques ?", function() { + $(location).attr("href", _this.attr("href")); + }); +}); \ No newline at end of file diff --git a/module/statislite/view/config/config.php b/module/statislite/view/config/config.php new file mode 100644 index 00000000..30f34b6b --- /dev/null +++ b/module/statislite/view/config/config.php @@ -0,0 +1,216 @@ +getData(['core','dataVersion']) > 10092){ + echo ''; +} +else{ + echo ''; +} ?> + + +
+
+ 'buttonGrey', + 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
+
+ '' + ]); ?> +
+
+
+
+
+

Paramétrage de StatisLight : filtrages

+
+
+ 'Temps minimum à passer sur une page pour valider la vue', + 'label' => 'Temps minimum sur une page', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'timePageMini']) + ]); ?> +
+
+ 'Temps minimum à passer sur le site pour valider la visite', + 'label' => 'Temps minimum de la visite', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'timeVisiteMini']) + ]); ?> +
+
+ 'Nombre minimum de pages vues pour valider une visite. Pour le réglage \'1 page\' les contrôles de temps ne pourront pas se faire.', + 'label' => 'Nombre minimum de pages vues', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'nbPageMini']) + ]); ?> +
+
+
+
+ 'Utilisateurs connectés à exclure des statistiques', + 'label' => 'Utilisateurs exclus', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'usersExclus']) + ]); ?> +
+
+
+ +
+

Paramétrage de StatisLight : affichage graphique

+
+ + +
+ 'Sélection du nombre de pages vues affichées en commençant par la plus fréquente.', + 'label' => 'Nombre de pages affichées', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'nbaffipagesvues']) + ]); ?> +
+ + + +
+ 'Sélection du nombre de langues préférées affichées en commençant par la plus fréquente.', + 'label' => 'Nombre de langues affichées', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'nbaffilangues']) + ]); ?> +
+ + + +
+ 'Sélection du nombre de navigateurs affichés en commençant par le plus fréquent.', + 'label' => 'Nombre de navigateurs affichées', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'nbaffinavigateurs']) + ]); ?> +
+
+
+ + +
+ 'Sélection du nombre de systèmes d\'exploitation affichés en commençant par le plus fréquent.', + 'label' => 'Nombre de systèmes d\'exploitation affichés', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'nbaffise']) + ]); ?> +
+ +
+
+ +
+

Paramétrage de StatisLight : affichage chronologique des dernières dates

+
+
+ 'Choix du nombre de dates affichées en commençant par la plus récente, avec pour chacune les nombres de visites et de pages vues, les durées totale et moyenne par visite. ', + 'label' => 'Nombre de dates affichées', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'nbaffidates']) + ]); ?> +
+
+ +
+ +
+

Paramétrage de StatisLight : affichage détaillé des dernières sessions

+
+
+ 'Choix du nombre de visites affichées de manière détaillée en commençant par la plus récente. ', + 'label' => 'Nombre de visites affichées', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'nbEnregSession']) + ]); ?> +
+
+ +
+ +
+

Affichage des sessions rejetées

+ Fichier robots.json

'; + } + if(is_file( $module::$fichiers_json.'sessionInvalide.json')){ + copy( $module::$fichiers_json.'sessionInvalide.json', $module::$tmp.'sessionInvalide.json'); + echo 'Log des 200 dernières sessions invalidées : '; + echo '

Fichier sessionInvalide.json

'; + } + ?> +
+ +
+

Sauvegarde, restauration ou réinitialisation des statistiques

+
+
+ helper::baseUrl() . $this->getUrl(0) . '/sauveJson', + 'ico' => 'download', + 'value' => 'Sauvegarder' + ]); ?> +
+
+ 'configInitJson buttonRed', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/initJson' . '/' . $_SESSION['csrf'], + 'ico' => 'cancel', + 'value' => 'Réinitialiser' + ]); ?> +
+
+ +
+ +
+ $val){ + if( strpos($val, 'cumul.json') === false){ + unset( $files[$key]); + } + } + if (count($files) === 0 ){ + $files = array(0 => 'Pas de fichier de sauvegarde'); + } + else{ + $files[0] = 'Votre choix...'; + // clef = valeur pour renvoyer le nom du fichier et non la clef de type numméro + $files= array_combine($files,$files); + } + } + else { + $files = array(0 => 'Dossier votre_site/site/file/statislite/json_sauve inexistant'); + } + echo template::select('configRestoreJson', $files, [ + 'help' => 'Vous pouvez sélectionner ici un fichier de restauration, puis enregistrez la configuration. Une sauvegarde de sécurité des statistiques actuelles est réalisée.', + 'id' => 'config_restauration', + 'disabled' => $readonly, + 'label' => 'Sélection d\'un fichier pour restauration des statistiques', + 'selected' => 'Votre choix...' + ]); ?> +
+
+ +
+ +
+ +
+ + + +
Module Statislite version n° + +
diff --git a/module/statislite/view/index/index.css b/module/statislite/view/index/index.css new file mode 100644 index 00000000..3a53c5c6 --- /dev/null +++ b/module/statislite/view/index/index.css @@ -0,0 +1,120 @@ +/* css pour index de statislite */ + + +.stats ul { + width: 80%; + list-style: none; + margin: 20px 20px; +} + +.stats .percent { + display: block; + height: 1.5em; + line-height: 1.5em; + margin: 5px 10px; + padding: 0 5px; + text-align: right; + /*color: #fff;*/ + font-weight: bold; + font-family: monospace; + -moz-border-radius: 5px; + border-bottom: 1px solid #aaa; + border-right: 1px solid #aaa; + cursor: default; +} + +.v100 { width: 100%; } +.v90 { width: 90%; } +.v80 { width: 80%; } +.v70 { width: 70%; } +.v60 { width: 60%; } +.v50 { width: 50%; } +.v40 { width: 40%; } +.v30 { width: 30%; } +.v20 { width: 20%; } +.v10 { width: 10%; } + +/* Multicolore */ +.multicolor .v100 { background-color: #970000; color : #68ffff} +.multicolor .v90 { background-color: #ff0000; color : #00ffff} +.multicolor .v80 { background-color: #ff6600; color : #30ffff} +.multicolor .v70 { background-color: #ff9c00; color : #00ffff} +.multicolor .v60 { background-color: #ffd800; color : #0027ff} +.multicolor .v50 { background-color: #eaff00; color : #1500ff} +.multicolor .v40 { background-color: #baff00; color : #4500ff} +.multicolor .v30 { background-color: #78ff00; color : #8700ff} +.multicolor .v20 { background-color: #12ff00; color : #ed00ff} +.multicolor .v10 { background-color: #00ff60; color : #ff009f} + +/* Dégradé vert */ +.green_gradiant .v100 { background-color: #1d290a; color : #ffffff} +.green_gradiant .v90 { background-color: #2b3c0f; color : #ffffff} +.green_gradiant .v80 { background-color: #405a17; color : #ffffff} +.green_gradiant .v70 { background-color: #52741d; color : #ffffff} +.green_gradiant .v60 { background-color: #628a23; color : #ffffff} +.green_gradiant .v50 { background-color: #72a128; color : #ffffff} +.green_gradiant .v40 { background-color: #7eb22d; color : #000000} +.green_gradiant .v30 { background-color: #8fc932; color : #000000} +.green_gradiant .v20 { background-color: #99dd38; color : #000000} +.green_gradiant .v10 { background-color: #aff73e; color : #000000} + +/* Dégradé rouge */ +.red_gradiant .v100 { background-color: #290c0c; } +.red_gradiant .v90 { background-color: #481515; } +.red_gradiant .v80 { background-color: #661e1e; } +.red_gradiant .v70 { background-color: #862727; } +.red_gradiant .v60 { background-color: #a02f2f; } +.red_gradiant .v50 { background-color: #bd3838; } +.red_gradiant .v40 { background-color: #d84040; } +.red_gradiant .v30 { background-color: #eb4545; } +.red_gradiant .v20 { background-color: #ff4b4b; } +.red_gradiant .v10 { background-color: #ff6565; } + +/* Unicolore vert */ +.green_uni .percent { background-color: #83df00; } + +/* Dégradé gris */ +.grey_gradiant .v100 { background-color: #000000; color : #ffffff} +.grey_gradiant .v90 { background-color: #252525; color : #ffffff} +.grey_gradiant .v80 { background-color: #373737; color : #ffffff} +.grey_gradiant .v70 { background-color: #505050; color : #ffffff} +.grey_gradiant .v60 { background-color: #656565; color : #ffffff} +.grey_gradiant .v50 { background-color: #7e7e7e; color : #000000} +.grey_gradiant .v40 { background-color: #8f8f8f; color : #000000} +.grey_gradiant .v30 { background-color: #a5a5a5; color : #000000} +.grey_gradiant .v20 { background-color: #bcbcbc; color : #000000} +.grey_gradiant .v10 { background-color: #c8c8c8; color : #000000} + +/* +.block { + border: 1px solid #D8DFE3; +} +*/ + +/* Couleur du texte h4 et de son fond*/ +.block h4 +{ + color: rgba(33, 34, 35, 1); + background-color: #ECEFF1; +} + +.blockgraph{ + border: 1px solid #D8DFE3; + margin: 10px, 10px; + padding: 0; + background-color: #ffffff; +} + +.blockgraph h4{ + margin: 0; + padding: 10px; + color: rgba(33, 34, 35, 1); + background-color: #ECEFF1; +} + +.blockgraph li{ + color: black; +} + + + diff --git a/module/statislite/view/index/index.php b/module/statislite/view/index/index.php new file mode 100644 index 00000000..9e815d00 --- /dev/null +++ b/module/statislite/view/index/index.php @@ -0,0 +1,469 @@ +getData(['module', $this->getUrl(0), 'config', 'nbaffipagesvues']); + // Affichage graphique : nombre de langues à afficher en commençant par la plus fréquente, de 0 à toutes + $nbaffilangues = $this->getData(['module', $this->getUrl(0), 'config', 'nbaffilangues']); + // Affichage graphique : nombre de navigateurs à afficher en commençant par le plus fréquent, de 0 à toutes + $nbaffinavigateurs = $this->getData(['module', $this->getUrl(0), 'config', 'nbaffinavigateurs']); + // Affichage graphique : nombre de systèmes d'exploitation à afficher en commençant par le plus fréquent, de 0 à tous + $nbaffise = $this->getData(['module', $this->getUrl(0), 'config', 'nbaffise']); + // Affichage graphique : nombre de pays à afficher en commençant par le plus fréquent, de 0 à tous + $nbaffipays = $this->getData(['module', $this->getUrl(0), 'config', 'nbaffipays']); + // Nombre de sessions affichées dans l'affichage détaillé + $nbEnregSession = $this->getData(['module', $this->getUrl(0), 'config', 'nbEnregSession' ]); + // Nombre de dates affichées dans l'affichage chronologique + $nbAffiDates = $this->getData(['module', $this->getUrl(0), 'config', 'nbaffidates' ]); + // option avec geolocalisation + $geolocalisation = $this->getData(['module', $this->getUrl(0), 'config', 'geolocalisation' ]); + + + /* + * Affichage cumulé depuis le début de l'analyse soit depuis l'initialisation du fichier cumul.json + * le reset se fait actuellement uniquement par la suppression du fichier cumul.json + */ + $json = file_get_contents($module::$fichiers_json.'sessionLog.json'); + $log = json_decode($json, true); + $json = file_get_contents($module::$fichiers_json.'cumul.json'); + $cumul = json_decode($json, true); + $comptepagestotal = $module::$comptepages + $cumul['nb_clics']; + $comptevisitetotal = $module::$comptevisite + $cumul['nb_visites']; + $dureevisitestotal = $module::$dureevisites + $cumul['duree_visites']; + if($comptevisitetotal != 0){ + $dureevisitemoyenne = conversionTime((int)($dureevisitestotal / $comptevisitetotal)); + } + else{ + $dureevisitemoyenne = 0; + } + ?> +
+

Visites depuis le

+
+

+

+
+

+

+
+

+

+
+


+ $val){ + foreach($log[$numSession]['vues'] as $vues=>$values){ + $page = substr($values, 22, strlen($values)); + if(isset($pagesvues[$page])){ + $pagesvues[$page] = $pagesvues[$page] + 1; + } + else{ + $pagesvues[$page] = 1; + } + } + } + foreach($cumul['pages'] as $page=>$values){ + if(isset($pagesvues[$page])){ + $pagesvues[$page] = $pagesvues[$page] + $values; + } + else{ + $pagesvues[$page] = $values; + } + } + arsort($pagesvues); + if($nbaffipagesvues != 1000){ + $pagesvues = array_slice($pagesvues, 0, $nbaffipagesvues, true); + } + foreach($pagesvues as $key => $value){ + $scoremax = $pagesvues[$key]; + break; + } + ?> +
+
+

Pages vues, comptabilisées une seule fois par session

+
    + $score){ + // Adaptation de la longueur au score + $long =ceil((float)($score/$scoremax)*10)*10; + ?>
  • + +
+
+


+ $val){ + $lang = $log[$numSession]['client'][0]; + if($log[$numSession]['client'][0] != 'fichier langages.txt absent'){ + if(isset($langues[$lang])){ + $langues[$lang] = $langues[$lang] + 1; + } + else{ + $langues[$lang] = 1; + } + } + } + foreach($cumul['clients']['langage'] as $lang=>$values){ + if(isset($langues[$lang])){ + $langues[$lang] = $langues[$lang] + $values; + } + else{ + $langues[$lang] = $values; + } + } + arsort($langues); + if($nbaffilangues != 1000){ + $langues = array_slice($langues, 0, $nbaffilangues, true); + } + foreach($langues as $key => $value){ + $scoremax = $langues[$key]; + break; + } + ?> +
+
+

Langages préférés

+
    + $score){ + // Adaptation de la longueur au score + $long =ceil((float)($score/$scoremax)*10)*10; + ?>
  • + +
+
+


+ $val){ + $nav = $log[$numSession]['client'][1]; + if($log[$numSession]['client'][1] != 'fichier navigateurs.txt absent'){ + if(isset($navigateurs[$nav])){ + $navigateurs[$nav] = $navigateurs[$nav] + 1; + } + else{ + $navigateurs[$nav] = 1; + } + } + } + foreach($cumul['clients']['navigateur'] as $navig=>$values){ + if(isset($navigateurs[$navig])){ + $navigateurs[$navig] = $navigateurs[$navig] + $values; + } + else{ + $navigateurs[$navig] = $values; + } + } + arsort($navigateurs); + if($nbaffinavigateurs != 1000){ + $navigateurs = array_slice($navigateurs, 0, $nbaffinavigateurs, true); + } + foreach($navigateurs as $key => $value){ + $scoremax = $navigateurs[$key]; + break; + } + ?> +
+
+

Navigateurs

+
    + $score){ + // Adaptation de la longueur au score + $long =ceil((float)($score/$scoremax)*10)*10; + ?>
  • + +
+
+


+ $val){ + $syse = $log[$numSession]['client'][2]; + if($log[$numSession]['client'][2] != 'fichier systemes.txt absent'){ + if(isset($systemes[$syse])){ + $systemes[$syse] = $systemes[$syse] + 1; + } + else{ + $systemes[$syse] = 1; + } + } + } + foreach($cumul['clients']['systeme'] as $syse=>$values){ + if(isset($systemes[$syse])){ + $systemes[$syse] = $systemes[$syse] + $values; + } + else{ + $systemes[$syse] = $values; + } + } + arsort($systemes); + if($nbaffise != 1000){ + $systemes = array_slice($systemes, 0, $nbaffise, true); + } + foreach($systemes as $key => $value){ + $scoremax = $systemes[$key]; + break; + } + ?> +
+
+

Systèmes d'exploitation

+
    + $score){ + // Adaptation de la longueur au score + $long =ceil((float)($score/$scoremax)*10)*10; + ?>
  • + +
+
+


+ $val){ + if($log[$numSession]['geolocalisation'] != 'Fichier - clef_ipapi_com.txt - absent , .'){ + // Extraction du pays + $postiret = strpos($log[$numSession]['geolocalisation'], '-'); + $pays = substr($log[$numSession]['geolocalisation'], 0, $postiret - 1); + if(isset($tabpays[$pays])){ + $tabpays[$pays] = $tabpays[$pays] + 1; + } + else{ + $tabpays[$pays] = 1; + } + } + } + foreach($cumul['clients']['localisation'] as $pays=>$values){ + if(isset($tabpays[$pays])){ + $tabpays[$pays] = $tabpays[$pays] + $values; + } + else{ + $tabpays[$pays] = $values; + } + } + arsort($tabpays); + if($nbaffipays != 1000){ + $tabpays = array_slice($tabpays, 0, $nbaffipays, true); + } + foreach($tabpays as $key => $value){ + $scoremax = $tabpays[$key]; + break; + } + ?> +
+
+

Pays

+
    + $score){ + // Adaptation de la longueur au score + $long =ceil((float)($score/$scoremax)*10)*10; + ?>
  • + +
+
+

+ + + +

+
+
+ +
+
+ +
+

+ +
+ + + $val){ + $datetimei = strtotime(substr($log[$numSession]['vues'][0], 0 , 19)); + $nbpageparsession = count($log[$numSession]['vues']); + // Si $nbpageparsession <=1 on force la valeur de $datetimef + if($nbpageparsession <= 1){ + $datetimef = $datetimei + $timeVisiteMini; + } + else{ + $datetimef = strtotime(substr($log[$numSession]['vues'][$nbpageparsession - 1], 0 , 19)); + } + $dureesession = $datetimef - $datetimei; + $dateclef = substr($log[$numSession]['vues'][0], 0 , 10); + if( ! isset($chrono[$dateclef])){ + $chrono[$dateclef] = array( 'nb_visites' => 0, 'nb_pages_vues' => 0, 'duree' =>0); + } + $chrono[$dateclef]['nb_visites']++; + $chrono[$dateclef]['nb_pages_vues'] = $chrono[$dateclef]['nb_pages_vues'] + $nbpageparsession; + $chrono[$dateclef]['duree'] = $chrono[$dateclef]['duree'] + $dureesession; + } + // Tri du tableau par clefs en commençant par la date la plus récente + krsort($chrono); + ?> +
+

Affichage chronologique résumé

+ $value){ + $dureeparvisite = ''; + if($chrono[$date]['nb_visites'] > 0){ + $dureeparvisite = conversionTime( (int)($chrono[$date]['duree'] / $chrono[$date]['nb_visites'])); + } + ?> +
+
+ '.$date.' : Visites => '.$chrono[$date]['nb_visites']; ?> +
+
+ '.$chrono[$date]['nb_pages_vues']; ?> +
+
+ '.conversionTime($chrono[$date]['duree']); ?> +
+
+ 0){ echo 'Durée moyenne par visite => '.$dureeparvisite; }?> +
+
+ = $nbAffiDates) { break;} + } ?> +
+ $value){ + $tableau[$i] = $value; + $i++; + } + $tampon = $tableau; + $nbsessiontampon = count($tampon); + $tableau = array(); + for($i=0; $i < $nbEnregSession; $i++){ + $tableau[$i] = $tampon[$nbsessiontampon - 1 - $i]; + if($nbsessiontampon - 1 - $i == 0){ break;} + } + if( isset($tableau[0]['vues'][0])){ + // Recherche de la première date dans le fichier courant + $datedebut = date('Y/m/d H:i:s'); + $datedebut = substr($tableau[count($tableau) - 1]['vues'][0], 0 , 19); + ?> +
+

Affichage détaillé des dernières visites

+ $values){ + $pagesvues =''; + $nbpageparsession = count($tableau[$num]['vues']); + $datetimei = strtotime(substr($tableau[$num]['vues'][0], 0 , 19)); + $datetimef = strtotime(substr($tableau[$num]['vues'][$nbpageparsession - 1], 0 , 19)); + $dureevisite = 0; + for( $i=0 ; $i < $nbpageparsession - 1 ; $i++){ + $nompage = substr($tableau[$num]['vues'][$i], 22 , strlen($tableau[$num]['vues'][$i])); + $dureepage = strtotime(substr($tableau[$num]['vues'][$i + 1], 0 , 19)) - strtotime(substr($tableau[$num]['vues'][$i], 0 , 19)); + $pagesvues .= $nompage.' ('.$dureepage.' s) - '; + $dureevisite = $dureevisite + $dureepage; + } + $pagesvues .= substr($tableau[$num]['vues'][$nbpageparsession - 1], 22 , strlen($tableau[$num]['vues'][$nbpageparsession - 1])); + // Affichages + echo ' - Début de session : '.substr($tableau[$num]['vues'][0], 0 , 19).'
'; + if($geolocalisation){ + echo ' >> Géolocalisation : '.$tableau[$num]['geolocalisation'].'
'; + } + echo ' - User Agent : '.$tableau[$num]['userAgent'].'
'; + echo ' >> Système d\'exploitation : '.$tableau[$num]['client'][2].'
'; + echo ' >> Navigateur : '.$tableau[$num]['client'][1].'
'; + echo ' - Accept Language : '.$tableau[$num]['langage'].'
'; + echo ' >> Langage préféré : '.$tableau[$num]['client'][0].'
'; + echo ' - Referer : '.$tableau[$num]['referer'].'
'; + echo ' - Nombre total de pages vues : '.$nbpageparsession.'
'; + if($nbpageparsession >= 1){ + echo ' - Pages vues (durée) : '.$pagesvues.'
'; + } + else{ + echo ' - Pages vues : '.$pagesvues.'
'; + } + $dureevisite = conversionTime($dureevisite); + if($dureevisite != '0 s'){ + echo ' - Durée de la visite > à '. $dureevisite.'
'.'
'; + } + else{ + echo ' - Durée de la visite : ?'.'
'.'
'; + } + $comptevisites++; + $comptepages = $comptepages + $nbpageparsession; + } + + // Affichage du bilan pour la période en cours + echo 'Visites depuis le '.$datedebut.'
'.'
'; + echo ' - Nombre total de pages vues : '.$comptepages.'
'; + echo ' - Nombre de visites : '.$comptevisites.'
'.'
'; + } + ?> +
+ = 3600) + {$Heure = $Heure + 1; $Seconde = $Seconde - 3600;} + while ($Seconde >= 60) + {$Minute = $Minute + 1; $Seconde = $Seconde - 60;} + if ($Heure > 0) + {$Convert = $Heure.' h '.$Minute.' min '.$Seconde.' s'; return $Convert;} + elseif ($Minute > 0) + {$Convert = $Minute.' min '.$Seconde.' s'; return $Convert;} + else + {$Convert = $Seconde.' s'; return $Convert;} + } +?> + + + + + diff --git a/site/file/statislite/filtres_primaires/liste_bot.txt b/site/file/statislite/filtres_primaires/liste_bot.txt new file mode 100644 index 00000000..8e488600 --- /dev/null +++ b/site/file/statislite/filtres_primaires/liste_bot.txt @@ -0,0 +1,34 @@ +/google desktop|bot|spider|crawler|yahoo|findlinks| +search|;anonymous\.|alef\/|amagit| +answerbus|appie |appengine-google|apple(syndication|-pubsub)|ask jeeves| +barkrowler|berlin-fu-cow|biglotron|binlar|blog(dimension|lines)| +book(dog|mark)|bubing|butterfly|c4pc|caretcursor| +charlotte|csci_|ccubee|ce-preload|checker| +covario|crawl(y| annu)|curl\/|custo |darxi| +datacha0s|daumoa|dailyperfect|del\.icio\.us\b|depspid| +developers\.google\.com\/\+\/web\/snippet\/|digger|earthcom|ejupiter|ets v5| +europarchive|extractor|facebookexternalhit|fast[ mb-]|favorg| +feed(burner|fetcher)|(\b|c)fetch(\b|p|e)|finder|fleck|flyindex| +forvohun|funnelback|gigablastopensource|gnomit|goldfire server| +google-site(maps|-verification)|google-structureddatatestingtool|google (web preview|favicon)|grub|gt::www\/1\.02| +helix|heritrix|htdig|httping v2.5|httrack| +ia_archiver|ichiro|ina dlweb|indocrew|integromedb| +internetseer|interseek|ip\*works|jakarta|java\/| +l\.webis|larbin|libwww-p|link(dex| check(er)?|aider|fluence)|ltx| +lwp|mail\.ru|mama (casper|cyber)|mediapartners|metaspinner| +microsoft data access|minirank|morfeus |\+msie\+6\.0|msnptc| +net(sprint|vibes )|newsg8|newt activex|ng\/2|nnn\/ttt| +nutch(-|\d)|\bodp\b|oneriot|ozelot|(page_|slurpy )verifier| +page(bull|peeker)|panopta\.com|panscient|pflab|^php(\/| v)| +picmole|pi-?monster|pompos|powermarks|program shareware| +python|quantcast|qwantify|robozilla|(aide|magpie| )rss( |\/)| +rssingbot|rtgi|sagool|sbider|scooter| +scoutjet|scrapy|scrubby|shelob|silk| +siteexplorer|(sky|synaptic)walker|sohu |survey|sygol| +synapse|szukaj|t-h-u-n-d-e-r-s-t-o-n-e|tagyu|telnet0.| +\btest(\b|_)|tfc |theophrastus|thumb|twitturl| +unicorn|urlbase|vagabondo|validat(o|eu)r|voltron| +voracious|voyager\/|vse|wauuu|web( ?index|cow|moni|capture|pix|copier|stripper|corp|scan|mastercoffee|-sniffer)| +wget|wwwster|wysigot|xenu|xirq| +yacy|yandex|yellowjacket|yeti|yoono| +zion\/|^(dcs|mozilla\/5\.0|msie 6\.0|teoma|megaindex)$/i \ No newline at end of file diff --git a/site/file/statislite/filtres_primaires/liste_querystring.txt b/site/file/statislite/filtres_primaires/liste_querystring.txt new file mode 100644 index 00000000..9555bc1e --- /dev/null +++ b/site/file/statislite/filtres_primaires/liste_querystring.txt @@ -0,0 +1 @@ +/pages_stat|page-a-exclure/i \ No newline at end of file diff --git a/site/file/statislite/filtres_primaires/liste_vos_ip.txt b/site/file/statislite/filtres_primaires/liste_vos_ip.txt new file mode 100644 index 00000000..22d89cd4 --- /dev/null +++ b/site/file/statislite/filtres_primaires/liste_vos_ip.txt @@ -0,0 +1,5 @@ +/votre_IP1| +votre_IP2| +exemple| +255\.255\.255\.255| +/ diff --git a/site/file/statislite/json/.htaccess b/site/file/statislite/json/.htaccess new file mode 100644 index 00000000..066047df --- /dev/null +++ b/site/file/statislite/json/.htaccess @@ -0,0 +1,10 @@ +# Bloque l'accès aux données + + Order deny,allow + Deny from all + +# Bloque l'accès htaccess + + Order deny,allow + Deny from all + \ No newline at end of file diff --git a/site/file/statislite/json_sauve/.htaccess b/site/file/statislite/json_sauve/.htaccess new file mode 100644 index 00000000..066047df --- /dev/null +++ b/site/file/statislite/json_sauve/.htaccess @@ -0,0 +1,10 @@ +# Bloque l'accès aux données + + Order deny,allow + Deny from all + +# Bloque l'accès htaccess + + Order deny,allow + Deny from all + \ No newline at end of file diff --git a/site/file/statislite/langages.txt b/site/file/statislite/langages.txt new file mode 100644 index 00000000..546a2723 --- /dev/null +++ b/site/file/statislite/langages.txt @@ -0,0 +1,59 @@ +fr,français* +en,anglais* +de,allemand* +pt,portugais* +it,italien* +es,espagnol* +da,danois* +ca,catalan* +br,breton* +co,corse* +oc,occitan* +an,aragonais* +eo,esperanto* +ar,arabe* +bg,bulgare* +be,biélorusse* +bs,bosnien* +cs,tchèque* +cy,gallois* +el,grec* +et,estonien* +eu,basque* +fi,finois* +fo,féroïen* +ga,irlandais* +gd,écossais* +gl,galicien* +he,hébreu* +hi,hindi* +hr,croate* +hu,hongrois* +hy,arménien* +is,islandais* +ja,japonais* +ka,géorgien* +kl,groenlandais* +la,latin* +lb,luxembourgeois* +lt,lituanien* +lv,letton* +mk,macédonien* +mo,moldave* +no,norvégien* +nb,norvégien* +nn,norvégien* +nl,néerlandais* +pl,polonais* +ro,roumain* +ru,russe* +sc,sarde* +sh,serbo-croate* +sk,slovaque* +sl,slovène* +sq,albanais* +sr,serbe* +sv,suédois* +tr,turque* +uk,ukrainien* +zh,chinois \ No newline at end of file diff --git a/site/file/statislite/navigateurs.txt b/site/file/statislite/navigateurs.txt new file mode 100644 index 00000000..0668adb0 --- /dev/null +++ b/site/file/statislite/navigateurs.txt @@ -0,0 +1,12 @@ +firefox,Firefox* +firebird,Firebird* +msie,Internet Explorer* +microsoft internet explorer,Internet Explorer* +opera,Opera*opr,Opera* +ucbrowser,UC Browser* +chromium,Chromium* +chrome,Chrome* +safari,Safari* +edge,Edge* +trident,Trident Internet Explorer* +ne_rien_ecrire,dessous \ No newline at end of file diff --git a/site/file/statislite/systemes.txt b/site/file/statislite/systemes.txt new file mode 100644 index 00000000..1af33277 --- /dev/null +++ b/site/file/statislite/systemes.txt @@ -0,0 +1,12 @@ +android 4,Android 4* +android 5,Android 5*android 6,Android 6*android 7,Android 7*android 8,Android 8* +android 9,Android 9*android 10,Android 10*android 11,Android 11* +android,Android* +linux,Linux* +cros,Chrome OS* +windows nt 5.1,Windows XP*windows nt 5.2,Windows XP 64*windows nt 6.0,Windows Vista.1*windows nt 6.1,Windows 7* +windows nt 6.2,Windows 8*windows nt 6.3,Windows 8.1*windows nt 10.0,Windows 10* +win,Windows* +ipad,Ipad Apple*iphone, Iphone Apple*mac os x,Apple Macintosh Mac OS X* +mac,Apple Macintosh* +ne_rien_ecrire,dessous \ No newline at end of file