Gestion des modules par catalogue

This commit is contained in:
fredtempez 2021-03-06 18:16:52 +01:00
parent f000db5746
commit bb6750def5
19 changed files with 2190 additions and 90 deletions

View File

@ -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([

View File

@ -1,4 +1,3 @@
<?php echo template::formOpen('configModulesGestion'); ?>
<div class="row">
<div class="col2">
<?php echo template::button('configModulesBack', [
@ -8,37 +7,19 @@
'value' => 'Retour'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('configModulesSubmit',[
'value' => 'Valider',
'ico' => 'check'
<div class="col2 offset6">
<?php echo template::button('configModulesUpload', [
'href' => helper::baseUrl() . 'addon/upload',
'value' => 'Téléverser'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configModulesStore', [
'href' => helper::baseUrl() . 'addon/store',
'value' => 'Catalogue'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Installer ou mettre à jour un module </h4>
<div class="row">
<div class="col6 offset3">
<?php echo template::file('configModulesInstallation', [
'label' => 'Archive ZIP :',
'type' => 2
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('configModulesCheck', true, 'Mise à jour forcée', [
'checked' => false,
'help' => 'Permet de forcer une mise à jour même si la version du module est inférieure ou égale à celle du module installé.',
]); ?>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>
<?php if($module::$modInstal): ?>
<?php echo template::table([2, 2, 2, 2, 1, 1, 1, 1], $module::$modInstal, ['Module installé', 'Alias', 'Version', 'Page(s)', 'Supprimer', 'Exporter', 'Importer']); ?>
<?php else: ?>

View File

@ -0,0 +1,3 @@
<?php
echo "<pre>";
Var_dump($module::$storeList);

View File

@ -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 <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @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
*/

View File

@ -0,0 +1,41 @@
<?php echo template::formOpen('configModulesUpload'); ?>
<div class="row">
<div class="col2">
<?php echo template::button('configModulesBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'addon',
'ico' => 'left',
'value' => 'Retour'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('configModulesSubmit',[
'value' => 'Valider',
'ico' => 'check'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Installer ou mettre à jour un module </h4>
<div class="row">
<div class="col6 offset3">
<?php echo template::file('configModulesInstallation', [
'label' => 'Archive ZIP :',
'type' => 2
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('configModulesCheck', true, 'Mise à jour forcée', [
'checked' => false,
'help' => 'Permet de forcer une mise à jour même si la version du module est inférieure ou égale à celle du module installé.',
]); ?>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -0,0 +1,171 @@
<?php
/*
* Fichier stat.php à inclure par le fichier body.inc.html
* Depuis la version 2.2 l'inscription dans body.inc.html est automatique
*/
// Paramètres
$fichiers_json = './site/file/statislite/json/';
$filtres_primaires = './site/file/statislite/filtres_primaires/';
// Initialisation du tableau $_SESSION et $indice ou
// Détection d'inactivité de plus de 10 minutes => 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();
?>

View File

@ -0,0 +1,889 @@
<?php
/**
* 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 <remi.jean@outlook.com>
* @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] = '<!-- Ne pas effacer * Module Statislite inclusion dans body-->';
$str[1] = '<?php if(is_dir("./module/statislite")) include "./module/statislite/include/stat.php"; ?>';
$str[2] = '<!-- Module Statislite fin d\'inclusion -->';
$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');
}
}

View File

@ -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 <remi.jean@outlook.com>
* @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"));
});
});

View File

@ -0,0 +1,216 @@
<?php if($this->getData(['core','dataVersion']) > 10092){
echo '<link rel="stylesheet" href="'. helper::baseUrl(false).'site/data/admin.css">';
}
else{
echo '<link rel="stylesheet" href="'. helper::baseUrl(false).'core/layout/admin.css">';
} ?>
<?php echo template::formOpen('statisliteConfigForm'); ?>
<div class="row">
<div class="col2">
<?php echo template::button('statisliteConfigBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0),
'ico' => 'left',
'value' => 'Retour'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('statisliteConfigSubmit', [
'ico' => ''
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Paramétrage de StatisLight : filtrages</h4>
<div class="row">
<div class="col4">
<?php echo template::select('statisliteConfigTimePageMini', $module::$timePageMini,[
'help' => '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'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('statisliteConfigTimeVisiteMini', $module::$timeVisiteMini,[
'help' => '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'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('statisliteConfigNbPageMini', $module::$nbPageMini,[
'help' => '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'])
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::select('statisliteConfigUsersExclus', $module::$users_exclus,[
'help' => 'Utilisateurs connectés à exclure des statistiques',
'label' => 'Utilisateurs exclus',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'usersExclus'])
]); ?>
</div>
</div>
</div>
<div class="block">
<h4>Paramétrage de StatisLight : affichage graphique </h4>
<div class="row">
<!-- Affichage graphique des pages vues -->
<div class="col4">
<?php echo template::select('statisliteConfigNbAffiPagesVues', $module::$nbaffipagesvues,[
'help' => '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'])
]); ?>
</div>
<!-- Affichage graphique des langues préférées -->
<div class="col4">
<?php echo template::select('statisliteConfigNbAffiLangues', $module::$nbaffilangues,[
'help' => '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'])
]); ?>
</div>
<!-- Affichage graphique des navigateurs -->
<div class="col4">
<?php echo template::select('statisliteConfigNbAffiNavigateurs', $module::$nbaffinavigateurs,[
'help' => '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'])
]); ?>
</div>
</div>
<div class="row">
<!-- Affichage graphique des systèmes d'exploitation -->
<div class="col4">
<?php echo template::select('statisliteConfigNbAffiSe', $module::$nbaffise,[
'help' => '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'])
]); ?>
</div>
</div>
</div>
<div class="block">
<h4>Paramétrage de StatisLight : affichage chronologique des dernières dates</h4>
<div class="row">
<div class="col4">
<?php echo template::select('statisLiteConfigNbAffiDates', $module::$nbAffiDates,[
'help' => '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'])
]); ?>
</div>
</div>
</div>
<div class="block">
<h4>Paramétrage de StatisLight : affichage détaillé des dernières sessions</h4>
<div class="row">
<div class="col4">
<?php echo template::select('statisliteConfigNbEnregSession', $module::$nbEnregSession,[
'help' => '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'])
]); ?>
</div>
</div>
</div>
<div class="block">
<h4>Affichage des sessions rejetées</h4>
<?php if(is_file( $module::$fichiers_json.'robots.json')){
copy( $module::$fichiers_json.'robots.json', $module::$tmp.'robots.json');
echo 'Log des 200 derniers robots : ';
echo '<p><a href="'. helper::baseUrl(false).'site/file/statislite/tmp/robots.json" target="_blank">Fichier robots.json</a></p>';
}
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 '<p><a href="'.helper::baseUrl(false).'site/file/statislite/tmp/sessionInvalide.json" target="_blank">Fichier sessionInvalide.json</a></p>';
}
?>
</div>
<div class="block">
<h4>Sauvegarde, restauration ou réinitialisation des statistiques</h4>
<div class="row">
<div class="col2">
<?php echo template::button('configSauveJson', [
'href' => helper::baseUrl() . $this->getUrl(0) . '/sauveJson',
'ico' => 'download',
'value' => 'Sauvegarder'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::button('configInitJson', [
'class' => 'configInitJson buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/initJson' . '/' . $_SESSION['csrf'],
'ico' => 'cancel',
'value' => 'Réinitialiser'
]); ?>
</div>
</div>
<div class="row">
<!--Sélection d'un fichier de sauvegarde-->
<div class="col8">
<?php if(is_dir( $module::$json_sauve )) {
$dir = $module::$json_sauve;
$files = scandir($dir);
//Ne conserver que les fichiers xxxxxxxxx_cumul.json
foreach( $files as $key=>$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...'
]); ?>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>
<div class="moduleVersion">Module Statislite version
<?php echo $module::STATISLITE_VERSION; ?>
</div>

View File

@ -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;
}

View File

@ -0,0 +1,469 @@
<?php
/*
* Affichage des résultats
*/
/*
* Paramètres réglés en configuration du module
*/
// 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 à 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;
}
?>
<div class="block">
<h4>Visites depuis le <?php echo $cumul['date_debut']; ?></h4>
<div class="row">
<div class="col4"><h3>
<?php echo 'Nombre de pages vues = '.$comptepagestotal;?></h3>
</div>
<div class="col4"><h3>
<?php echo 'Nombre de visites = '.$comptevisitetotal;?></h3>
</div>
<div class="col4"><h3>
<?php echo 'Durée moyenne = '.$dureevisitemoyenne;?></h3>
</div>
</div><br/><br/>
<?php
if($nbaffipagesvues != 0){
// Affichage des pages vues et de leur nombre de clics en prenant en compte cumul.json et sessionLog.json
$pagesvues = array();
foreach($log as $numSession=>$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;
}
?>
<div class="blockgraph">
<div class="stats multicolor">
<h4>Pages vues, comptabilisées une seule fois par session</h4>
<ul>
<?php foreach($pagesvues as $page=>$score){
// Adaptation de la longueur au score
$long =ceil((float)($score/$scoremax)*10)*10;
?> <li><?php echo $page; ?><span class="percent v<?php echo $long; ?>"> <?php echo $score; ?></span></li>
<?php }
?>
</ul>
</div>
</div><br/><br/>
<?php }
// Affichage des langages préférés en prenant en compte cumul.json et sessionLog.json
if($nbaffilangues != 0){
$langues = array();
foreach($log as $numSession=>$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;
}
?>
<div class="blockgraph">
<div class="stats grey_gradiant">
<h4>Langages préférés</h4>
<ul>
<?php foreach($langues as $lang=>$score){
// Adaptation de la longueur au score
$long =ceil((float)($score/$scoremax)*10)*10;
?> <li><?php echo $lang; ?><span class="percent v<?php echo $long; ?>"> <?php echo $score; ?></span></li>
<?php }
?>
</ul>
</div>
</div><br/><br/>
<?php }
// Affichage des navigateurs en prenant en compte cumul.json et sessionLog.json
if($nbaffinavigateurs != 0){
$navigateurs = array();
foreach($log as $numSession=>$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;
}
?>
<div class="blockgraph">
<div class="stats green_gradiant">
<h4>Navigateurs</h4>
<ul>
<?php foreach($navigateurs as $navig=>$score){
// Adaptation de la longueur au score
$long =ceil((float)($score/$scoremax)*10)*10;
?> <li><?php echo $navig; ?><span class="percent v<?php echo $long; ?>"> <?php echo $score; ?></span></li>
<?php }
?>
</ul>
</div>
</div><br/><br/>
<?php }
// Affichage des systèmes d'exploitation en prenant en compte cumul.json et sessionLog.json
if($nbaffise != 0){
$systemes = array();
foreach($log as $numSession=>$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;
}
?>
<div class="blockgraph">
<div class="stats grey_gradiant">
<h4>Systèmes d'exploitation</h4>
<ul>
<?php foreach($systemes as $syse=>$score){
// Adaptation de la longueur au score
$long =ceil((float)($score/$scoremax)*10)*10;
?> <li><?php echo $syse; ?><span class="percent v<?php echo $long; ?>"> <?php echo $score; ?></span></li>
<?php }
?>
</ul>
</div>
</div><br/><br/>
<?php }
// Affichage des pays en prenant en compte cumul.json et sessionLog.json
if($nbaffipays != 0 && $geolocalisation){
$tabpays = array();
foreach($log as $numSession=>$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;
}
?>
<div class="blockgraph">
<div class="stats multicolor">
<h4>Pays</h4>
<ul>
<?php foreach($tabpays as $clefpays=>$score){
// Adaptation de la longueur au score
$long =ceil((float)($score/$scoremax)*10)*10;
?> <li><?php echo $clefpays; ?><span class="percent v<?php echo $long; ?>"> <?php echo $score; ?></span></li>
<?php }
?>
</ul>
</div>
</div><br/>
<?php } ?>
<!-- Fin Affichage des pays-->
<br/><h3>
<div class="row">
<div class="col4">
<?php echo 'Robots détectés : '.$cumul['robots']['ua']; ?>
</div>
<div class="col4">
<?php echo 'Sessions invalides : '.($cumul['robots']['np'] + $cumul['robots']['tv'] + $cumul['robots']['ue']);?>
</div>
</div></h3>
<!-- Fermeture bloc principal -->
</div>
<?php
/*
* Affichage des visites, pages vues, durée des x dernières dates du fichier chrono.json
*
*/
if( $nbAffiDates != 0){
$json = file_get_contents($module::$fichiers_json.'chrono.json');
$chrono = json_decode($json, true);
// Mise à jour sans sauvegarde en prenant en compte sessionLog.json
foreach($log as $numSession=>$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);
?>
<div class="block">
<h4>Affichage chronologique résumé</h4>
<?php
$i = 0;
foreach($chrono as $date=>$value){
$dureeparvisite = '';
if($chrono[$date]['nb_visites'] > 0){
$dureeparvisite = conversionTime( (int)($chrono[$date]['duree'] / $chrono[$date]['nb_visites']));
}
?>
<div class="row">
<div class="col3">
<?php echo '<strong>'.$date.'</strong> : Visites => '.$chrono[$date]['nb_visites']; ?>
</div>
<div class="col2">
<?php echo 'Pages vues => '.$chrono[$date]['nb_pages_vues']; ?>
</div>
<div class="col3">
<?php echo 'Durée totale => '.conversionTime($chrono[$date]['duree']); ?>
</div>
<div class="col4">
<?php if($chrono[$date]['nb_visites'] > 0){ echo 'Durée moyenne par visite => '.$dureeparvisite; }?>
</div>
</div>
<?php
$i++;
if($i >= $nbAffiDates) { break;}
} ?>
</div>
<?php
}
/*
* Affichage détaillé pour les enregistrements du fichier affitampon.json
*
*/
$json = file_get_contents($module::$fichiers_json.'affitampon.json');
$tampon = json_decode($json, true);
// on change les clefs de $tampon : 0,1,2,3,...
$i=0;
$tableau = array();
foreach($tampon as $key=>$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);
?>
<div class="block">
<h4>Affichage détaillé des dernières visites</h4>
<?php
$comptepages = 0;
$comptevisites = 0;
foreach($tableau as $num=>$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 '<strong> - Début de session : '.substr($tableau[$num]['vues'][0], 0 , 19).'</strong><br/>';
if($geolocalisation){
echo ' >><em> Géolocalisation : '.$tableau[$num]['geolocalisation'].'</em><br/>';
}
echo ' - User Agent : '.$tableau[$num]['userAgent'].'<br/>';
echo ' >><em> Système d\'exploitation : '.$tableau[$num]['client'][2].'</em><br/>';
echo ' >><em> Navigateur : '.$tableau[$num]['client'][1].'</em><br/>';
echo ' - Accept Language : '.$tableau[$num]['langage'].'<br/>';
echo ' >><em> Langage préféré : '.$tableau[$num]['client'][0].'</em><br/>';
echo ' - Referer : '.$tableau[$num]['referer'].'<br/>';
echo '<em> - Nombre total de pages vues : '.$nbpageparsession.'</em><br/>';
if($nbpageparsession >= 1){
echo ' - Pages vues (durée) : '.$pagesvues.'<br/>';
}
else{
echo ' - Pages vues : '.$pagesvues.'<br/>';
}
$dureevisite = conversionTime($dureevisite);
if($dureevisite != '0 s'){
echo '<em> - Durée de la visite > à '. $dureevisite.'</em><br/>'.'<br/>';
}
else{
echo ' - Durée de la visite : ?'.'<br/>'.'<br/>';
}
$comptevisites++;
$comptepages = $comptepages + $nbpageparsession;
}
// Affichage du bilan pour la période en cours
echo '<strong>Visites depuis le '.$datedebut.'</strong><br/>'.'<br/>';
echo ' - Nombre total de pages vues : '.$comptepages.'<br/>';
echo ' - Nombre de visites : '.$comptevisites.'<br/>'.'<br/>';
}
?>
</div>
<?php
/* Conversion secondes en heures minutes secondes */
function conversionTime($Seconde){
$Heure = 0;
$Minute = 0;
while ($Seconde >= 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;}
}
?>

View File

@ -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

View File

@ -0,0 +1 @@
/pages_stat|page-a-exclure/i

View File

@ -0,0 +1,5 @@
/votre_IP1|
votre_IP2|
exemple|
255\.255\.255\.255|
/

View File

@ -0,0 +1,10 @@
# Bloque l'accès aux données
<Files *.json>
Order deny,allow
Deny from all
</Files>
# Bloque l'accès htaccess
<Files .htaccess>
Order deny,allow
Deny from all
</Files>

View File

@ -0,0 +1,10 @@
# Bloque l'accès aux données
<Files *.json>
Order deny,allow
Deny from all
</Files>
# Bloque l'accès htaccess
<Files .htaccess>
Order deny,allow
Deny from all
</Files>

View File

@ -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

View File

@ -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

View File

@ -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