Subversion Repositories eFlore/Applications.cel

Compare Revisions

No changes between revisions

Ignore whitespace Rev 2993 → Rev 3857

/branches/v3.01-serpe/widget/modules/stats/Stats.php
New file
0,0 → 1,489
<?php
/**
* Widget fournissant des stats graphiques du CEL.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Jean-Pascal MILCENT <jpm@clapas.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright © 2010, Jean-Pascal MILCENT
*/
class Stats extends WidgetCommun {
const PAGE_DEFAUT = 'defaut';
const MODE_DEFAUT = 'defaut';
const MODE_UTILISATEUR = 'utilisateur';
private $page;
private $mode;
/**
* Si spécifié, pas de barre de navigation inter-applications
* Attention, pour l'instant nobar désactive également le bouton pour avoir ses stats personnelles
*/
private $nobar;
/**
* Méthode appelée avec une requête de type GET.
*/
public function executer() {
$retour = null;
extract($this->parametres);
$this->mode = (isset($mode)) ? $mode : self::MODE_DEFAUT;
$this->page = (isset($page)) ? $page : self::PAGE_DEFAUT;
$this->nobar = (isset($nobar)) ? $nobar : false;
$methode = $this->traiterNomMethodeExecuter($this->page);
if (method_exists($this, $methode)) {
$retour = $this->$methode();
} else {
$this->messages[] = "Le type de statistiques '$methode' n'est pas disponible.";
}
 
if (is_null($retour)) {
$info = 'Un problème est survenu : '.print_r($this->messages, true);
$this->envoyer($info);
} else if (is_array($retour) && isset($retour['squelette'])) { // compatibilité avec un retour de HTML direct
$squelette = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR.$retour['squelette'].'.tpl.html';
$html = $this->traiterSquelettePhp($squelette, $retour['donnees']);
$this->envoyer($html);
} else {
$this->envoyer($retour);
}
}
 
/**
* Stats par défaut - exécute tout et met ça dans un squelette Bootstrap
*/
public function executerDefaut() {
$widget = null;
$widget['squelette'] = 'stats_tout'; // squelette bootstrap unifié
$utilisateur_authentifie = false;
 
switch ($this->mode) {
case self::MODE_DEFAUT :
break;
case self::MODE_UTILISATEUR :
$auth = $this->authentifierUtilisateur();
if ($auth) {
$utilisateur_authentifie = true;
$widget['donnees']['utilisateur'] = $this->getAuthIdentifiant();
$widget['donnees']['utilisateur_nom_prenom'] = $this->recupererPrenomNomIdentifie();
}
break;
default :
$this->messages[] = "Le mode '{$this->mode}' est inconnu.";
}
if (!is_null($widget)) {
$widget['donnees']['url_css'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], 'modules/stats/squelettes/css/stats_tout.css');
$widget['donnees']['url_js'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], 'modules/stats/squelettes/js/defaut.js');
$widget['donnees']['url_script_navigation'] = sprintf($this->config['chemins']['baseURLRessources'], 'tb/reseau/navigation.js');
$widget['donnees']['url_js_bootstrap'] = sprintf($this->config['chemins']['baseURLRessources'], 'bootstrap/3.1.0/js/bootstrap.min.js');
$widget['donnees']['url_css_bootstrap'] = sprintf($this->config['chemins']['baseURLRessources'], 'bootstrap/3.1.0/css/bootstrap.min.css');
 
$widget['donnees']['mode_serveur'] = $this->config['parametres']['modeServeur'];
$widget['donnees']['url_image_chargement'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], 'modules/stats/squelettes/img/chargement.gif');
$widget['donnees']['url_widget'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], 'stats');
$widget['donnees']['url_service'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], 'CelStatistique');
$widget['donnees']['filtres'] = $this->parametres;
$widget['donnees']['utilisateur_authentifie'] = $utilisateur_authentifie;
 
$widget['donnees']['prod'] = ($this->config['parametres']['modeServeur'] == "prod");
 
$widget['donnees']['nobar'] = $this->nobar;
}
return $widget;
}
 
public function executerNombres() {
$widget = null;
switch ($this->mode) {
case self::MODE_DEFAUT :
$widget['donnees'] = (array) $this->recupererStatsTxtNombres();
break;
case self::MODE_UTILISATEUR :
if ($this->authentifierUtilisateur()) {
$widget['donnees'] = (array) $this->recupererStatsTxtNombres();
$widget['donnees']['utilisateur'] = $this->getAuthIdentifiant();
$widget['donnees']['utilisateur_nom_prenom'] = $this->recupererPrenomNomIdentifie();
}
break;
default:
$this->messages[] = "Le mode '{$this->mode}' est inconnu.";
}
if (!is_null($widget)) {
$widget['squelette'] = 'nombres';
$widget['donnees']['filtres'] = $this->parametres;
}
return $widget;
}
public function executerListeTaxonsNbrePhotos() {
$widget = null;
switch ($this->mode) {
case self::MODE_DEFAUT :
$widget['donnees']['taxons'] = $this->recupererStatsTxtListeTaxonsNbrePhotos();
break;
case self::MODE_UTILISATEUR :
if ($this->authentifierUtilisateur()) {
$widget['donnees']['taxons'] = $this->recupererStatsTxtListeTaxonsNbrePhotos();
$widget['donnees']['utilisateur'] = $this->getAuthIdentifiant();
$widget['donnees']['utilisateur_nom_prenom'] = $this->recupererPrenomNomIdentifie();
}
break;
default:
$this->messages[] = "Le mode '{$this->mode}' est inconnu.";
}
if (!is_null($widget)) {
$widget['squelette'] = 'liste_taxons_nbre_photos';
$widget['donnees']['filtres'] = $this->parametres;
}
 
return $widget;
}
public function executerListeUtilisateursNbrePhotos() {
$widget = null;
$utilisateurs = $this->recupererStatsTxtListeUtilisateursNbrePhotos();
if (isset($utilisateurs)) {
$noms = $this->recupererUtilisateursNomPrenom(array_keys($utilisateurs));
foreach ($utilisateurs as $courriel => $infos) {
if (array_key_exists($courriel, $noms)) {
$nom_infos = (array) $noms[$courriel];
$nom_fmt = $nom_infos['prenom'].' '.$nom_infos['nom'];
$widget['donnees']['utilisateurs'][$nom_fmt] = $infos;
}
}
}
$widget['donnees']['filtres'] = $this->parametres;
$widget['squelette'] = 'liste_utilisateurs_nbre_photos';
return $widget;
}
 
/**
* Aligne les contributeurs contre un mur et... euh... hum;
* Appelle le service pour obtenir les n principaux contributeurs depuis x jours,
* en termes d'observations ajoutées, d'images ajoutées, ou les deux
* Paramètres : "jours" (int), "nombre" (int), "critere" ("obs" ou "img" ou "")
* @return array
*/
public function executerGrandsContributeurs() {
$widget = null;
$widget['donnees'] = (array) $this->recupererStatsTxtGrandsContributeurs();
if (!is_null($widget)) {
$widget['squelette'] = 'grands_contributeurs';
$widget['donnees']['url_service'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], 'CelStatistique');
}
return $widget;
}
 
public function executerObservationsActivite() {
$html = "";
$html .= '<div class="flottant-gauche">'
.'<h2>Observations - Activité</h2>';
 
$url_service = sprintf($this->config['chemins']['baseURLServicesCelTpl'], 'CelStatistique');
$i = 1;
switch ($this->mode) {
case self::MODE_DEFAUT :
$html .= '<img class="stats" src="' . $url_service . '/UtilisationJournaliere/' . date("Y-m-d", (time() - 86400))
. '?serveur=' . $i++ . '" alt="Intensité d\'utilisation pour la journée d\'hier" />'
.'<img class="stats" src="' . $url_service . '/UtilisationJournaliere'
. '?serveur=' . $i++ . '" alt="Intensité d\'utilisation pour aujourd\'hui" />';
break;
case self::MODE_UTILISATEUR :
if ($this->authentifierUtilisateur()) {
$utilisateur = $this->getAuthIdentifiant();
$utilisateur_nom_prenom = $this->recupererPrenomNomIdentifie();
$html .= '<h4>utilisateur: ' . $utilisateur_nom_prenom . '</h4>';
$html .= '<img class="stats" src="' . $url_service . '/UtilisationJournaliere/' . date("Y-m-d", (time() - 86400))
. '?serveur=' . $i++ . '&utilisateur=' . $utilisateur . '" alt="Intensité d\'utilisation pour la journée d\'hier" />'
.'<img class="stats" src="' . $url_service . '/UtilisationJournaliere'
. '?serveur=' . $i++ . '&utilisateur=' . $utilisateur . '" alt="Intensité d\'utilisation pour aujourd\'hui" />';
} else {
$html .= "Impossible d'authentifier l'utilisateur";
}
break;
default:
$this->messages[] = "Le mode '{$this->mode}' est inconnu.";
}
 
$html .= '</div>';
return $html;
}
 
public function executerObservationsDonnees() {
$html = "";
$html .= '<div class="flottant-gauche">'
.'<h2>Observations - Activité</h2>';
$url_service = sprintf($this->config['chemins']['baseURLServicesCelTpl'], 'CelStatistique');
$i = 1;
switch ($this->mode) {
case self::MODE_DEFAUT :
$html .= '<img class="stats" src="' . $url_service . '/NbreObsPublicVsPrivee'
. '?serveur=' . $i++ . '" alt="Nombre d\'observations publiques versus privées" />'
.'<img class="stats" src="' . $url_service . '/NbreObsIdVsTest'
. '?serveur=' . $i++ . '" alt="Nombre d\'observations identifiées versus tests" />'
.'<img class="stats" src="' . $url_service . '/NbreObsDetermineeVsInconnue'
. '?serveur=' . $i++ . '" alt="Nombre d\'observations déterminées versus inconnues" />'
. '<br/>'
.'<img class="stats" src="' . $url_service . '/NbreObsAvecIndicationGeo'
. '?serveur=' . $i++ . '" alt="Nombre d\'observations avec indications géographiques" />';
break;
case self::MODE_UTILISATEUR :
if ($this->authentifierUtilisateur()) {
$utilisateur = $this->getAuthIdentifiant();
$utilisateur_nom_prenom = $this->recupererPrenomNomIdentifie();
$html .= '<h4>utilisateur: ' . $utilisateur_nom_prenom . '</h4>';
$html .= '<img class="stats" src="' . $url_service . '/NbreObsPublicVsPrivee'
. '?serveur=' . $i++ . '&utilisateur=' . $utilisateur . '" alt="Nombre d\'observations publiques versus privées" />'
.'<img class="stats" src="' . $url_service . '/NbreObsIdVsTest'
. '?serveur=' . $i++ . '&utilisateur=' . $utilisateur . '" alt="Nombre d\'observations identifiées versus tests" />'
.'<img class="stats" src="' . $url_service . '/NbreObsDetermineeVsInconnue'
. '?serveur=' . $i++ . '&utilisateur=' . $utilisateur . '" alt="Nombre d\'observations déterminées versus inconnues" />'
. '<br/>'
.'<img class="stats" src="' . $url_service . '/NbreObsAvecIndicationGeo'
. '?serveur=' . $i++ . '&utilisateur=' . $utilisateur . '" alt="Nombre d\'observations avec indications géographiques" />';
} else {
$html .= "Impossible d'authentifier l'utilisateur";
}
break;
default:
$this->messages[] = "Le mode '{$this->mode}' est inconnu.";
}
$html .= '</div>';
return $html;
}
 
public function executerObservationsEvolution() {
$html = "";
$html .= '<div class="flottant-gauche">'
.'<h2>Observations - Activité</h2>';
$url_service = sprintf($this->config['chemins']['baseURLServicesCelTpl'], 'CelStatistique');
$i = 1;
switch ($this->mode) {
case self::MODE_DEFAUT :
$html .= '<img class="stats" src="' . $url_service . '/EvolObsParMoisGlissant'
. '?serveur=' . $i++ . '" alt="Évolutions des observation sur le dernier mois glissant" />'
.'<img class="stats" src="' . $url_service . '/EvolObsParMois'
. '?serveur=' . $i++ . '" alt="Évolutions des observation par mois" />'
. '<br/>'
.'<img class="stats" src="' . $url_service . '/EvolObsParAn'
. '?serveur=' . $i++ . '" alt="Évolutions des observation par an" />';
break;
case self::MODE_UTILISATEUR :
if ($this->authentifierUtilisateur()) {
$utilisateur = $this->getAuthIdentifiant();
$utilisateur_nom_prenom = $this->recupererPrenomNomIdentifie();
$html .= '<h4>utilisateur: ' . $utilisateur_nom_prenom . '</h4>';
$html .= '<img class="stats" src="' . $url_service . '/EvolObsParMoisGlissant'
. '?serveur=' . $i++ . '&utilisateur=' . $utilisateur . '" alt="Évolutions des observation sur le dernier mois glissant" />'
.'<img class="stats" src="' . $url_service . '/EvolObsParMois'
. '?serveur=' . $i++ . '&utilisateur=' . $utilisateur . '" alt="Évolutions des observation par mois" />'
. '<br/>'
.'<img class="stats" src="' . $url_service . '/EvolObsParAn'
. '?serveur=' . $i++ . '&utilisateur=' . $utilisateur . '" alt="Évolutions des observation par an" />';
} else {
$html .= "Impossible d'authentifier l'utilisateur";
}
break;
default:
$this->messages[] = "Le mode '{$this->mode}' est inconnu.";
}
$html .= '</div>';
return $html;
}
 
public function executerUtilisateurs() {
$html = "";
$html .= '<div class="flottant-gauche">'
.'<h2>Observations - Activité</h2>';
 
$url_service = sprintf($this->config['chemins']['baseURLServicesCelTpl'], 'CelStatistique');
$i = 1;
switch ($this->mode) {
case self::MODE_DEFAUT :
$html .= '<img class="stats" src="' . $url_service . '/NuagePointsObsParHeureEtJourSemaine'
. '?serveur=' . $i++ . '" alt="Nuage de points d\'observation par heure et jour de la semaine" />'
. '<img class="stats" src="' . $url_service . '/NbreObsParUtilisateur'
. '?serveur=' . $i++ . '" alt="Nombre d\'observations par utilisateur" />'
. '<img class="stats" src="' . $url_service . '/NbreObsParUtilisateurEtTest'
. '?serveur=' . $i++ . '" alt="Nombre d\'observations par utilisateur et test" />'
. '<img class="stats" src="' . $url_service . '/EvolUtilisateurParMois'
. '?serveur=' . $i++ . '" alt="Évolution des utilisateurs par mois" />'
. '<img class="stats" src="' . $url_service . '/NuagePointsObsAnciennete'
. '?serveur=' . $i++ . '" alt="Répartition des utilisateurs en fonction du nombre d\'observations et de l\'ancienneté" />';
break;
case self::MODE_UTILISATEUR :
if ($this->authentifierUtilisateur()) {
$utilisateur = $this->getAuthIdentifiant();
$html .= '<img class="stats" src="' . $url_service . '/NuagePointsObsParHeureEtJourSemaine'
. '?serveur=' . $i++ . '&utilisateur=' . $utilisateur . '" alt="Nuage de points d\'observation par heure et jour de la semaine" />';
} else {
$html .= "Impossible d'authentifier l'utilisateur";
}
break;
default:
$this->messages[] = "Le mode '{$this->mode}' est inconnu.";
}
 
$html .= '</div>';
return $html;
}
 
public function executerImages() {
$html = "";
$html .= '<div class="flottant-gauche">'
.'<h2>Observations - Activité</h2>';
$url_service = sprintf($this->config['chemins']['baseURLServicesCelTpl'], 'CelStatistique');
$i = 1;
switch ($this->mode) {
case self::MODE_DEFAUT :
$html .= '<img class="stats" src="' . $url_service . '/EvolImgParMois'
. '?serveur=' . $i++ . '" alt="Évolutions du dépôt d\'images par mois" />'
. '<img class="stats" src="' . $url_service . '/EvolImgLieesParMois'
. '?serveur=' . $i++ . '" alt="Évolutions des images liées aux observations par mois" />';
break;
case self::MODE_UTILISATEUR :
if ($this->authentifierUtilisateur()) {
$utilisateur = $this->getAuthIdentifiant();
$html .= '<img class="stats" src="' . $url_service . '/EvolImgParMois'
. '?serveur=' . $i++ . '&utilisateur=' . $utilisateur . '" alt="Évolutions du dépôt d\'images par mois" />'
. '<img class="stats" src="' . $url_service . '/EvolImgLieesParMois'
. '?serveur=' . $i++ . '&utilisateur=' . $utilisateur . '" alt="Évolutions des images liées aux observations par mois" />';
} else {
$html .= "Impossible d'authentifier l'utilisateur";
}
break;
default:
$this->messages[] = "Le mode '{$this->mode}' est inconnu.";
}
$html .= '</div>';
return $html;
}
 
private function recupererPrenomNomIdentifie() {
$nom = '';
if ($this->getAuthIdentifiant() != null) {
$infos_utilisateur = $this->recupererUtilisateursNomPrenom(array($this->getAuthIdentifiant()));
if (array_key_exists($this->getAuthIdentifiant(), $infos_utilisateur)) {
$utilisateur = (array) $infos_utilisateur[$this->getAuthIdentifiant()];
$nom = $utilisateur['prenom'].' '.$utilisateur['nom'];
} else {
$nom = $this->getAuthIdentifiant();
}
}
return $nom;
}
private function recupererStatsTxtNombres() {
// Récupération des données au format Json
$service = "CelStatistiqueTxt/Nombres";
$parametres = array();
if (isset($this->parametres['mode']) && $this->parametres['mode'] == self::MODE_UTILISATEUR && $this->getAuthIdentifiant() != null) {
$parametres[] = 'utilisateur='.$this->getAuthIdentifiant();
}
if (isset($this->parametres['num_taxon'])) {
$parametres[] = 'num_taxon='.$this->parametres['num_taxon'];
}
if (isset($this->parametres['taxon'])) {
$parametres[] = 'taxon='.$this->parametres['taxon'];
}
$service .= (count($parametres) > 0) ? '?'.implode('&', $parametres) : '';
$url = sprintf($this->config['chemins']['baseURLServicesCelTpl'], $service);
$json = $this->getDao()->consulter($url);
return (array) json_decode($json);
}
private function recupererStatsTxtListeTaxonsNbrePhotos() {
// Récupération des données au format Json
$service = "CelStatistiqueTxt/ListeTaxonsNbrePhotos";
$parametres = array();
if (isset($this->parametres['mode']) && $this->parametres['mode'] == self::MODE_UTILISATEUR && $this->getAuthIdentifiant() != null) {
$parametres[] = 'utilisateur='.$this->getAuthIdentifiant();
}
if (isset($this->parametres['num_taxon'])) {
$parametres[] = 'num_taxon='.$this->parametres['num_taxon'];
}
if (isset($this->parametres['taxon'])) {
$parametres[] = 'taxon='.$this->parametres['taxon'];
}
if (isset($this->parametres['start'])) {
$parametres[] = 'start='.$this->parametres['start'];
}
if (isset($this->parametres['limit'])) {
$parametres[] = 'limit='.$this->parametres['limit'];
}
$service .= (count($parametres) > 0) ? '?'.implode('&', $parametres) : '';
$url = sprintf($this->config['chemins']['baseURLServicesCelTpl'], $service);
$json = $this->getDao()->consulter($url);
return (array) json_decode($json);
}
private function recupererStatsTxtListeUtilisateursNbrePhotos() {
// Récupération des données au format Json
$service = "CelStatistiqueTxt/ListeUtilisateursNbrePhotos";
if (isset($this->parametres['mode']) && $this->parametres['mode'] == self::MODE_UTILISATEUR && $this->getAuthIdentifiant() != null) {
$this->getDao()->ajouterParametre('utilisateur', $this->getAuthIdentifiant());
}
if (isset($this->parametres['num_taxon'])) {
$this->getDao()->ajouterParametre('num_taxon', $this->parametres['num_taxon']);
}
if (isset($this->parametres['taxon'])) {
$this->getDao()->ajouterParametre('taxon', $this->parametres['taxon']);
}
if (isset($this->parametres['start'])) {
$this->getDao()->ajouterParametre('start', $this->parametres['start']);
}
if (isset($this->parametres['limit'])) {
$this->getDao()->ajouterParametre('limit', $this->parametres['limit']);
}
if (isset($this->parametres['tag'])) {
$this->getDao()->ajouterParametre('tag', $this->parametres['tag']);
}
$url = sprintf($this->config['chemins']['baseURLServicesCelTpl'], $service);
$json = $this->getDao()->consulter($url);
return (array) json_decode($json);
}
 
private function recupererStatsTxtGrandsContributeurs() {
// Récupération des données au format Json
$service = "CelStatistiqueTxt/GrandsContributeurs";
 
if (isset($this->parametres['nombre'])) {
$this->getDao()->ajouterParametre('nombre', $this->parametres['nombre']);
}
if (isset($this->parametres['jours'])) {
$this->getDao()->ajouterParametre('jours', $this->parametres['jours']);
}
if (isset($this->parametres['critere'])) {
$this->getDao()->ajouterParametre('critere', $this->parametres['critere']);
}
$url = sprintf($this->config['chemins']['baseURLServicesCelTpl'], $service);
$json = $this->getDao()->consulter($url);
 
return (array) json_decode($json);
}
}
?>
/branches/v3.01-serpe/widget/modules/stats/squelettes/liste_taxons_nbre_photos.tpl.html
New file
0,0 → 1,11
<h2>Liste des taxons possédant le plus grand nombre de photographies publiques</h2>
<?=(isset($utilisateur_nom_prenom) ? '<h4>utilisateur: ' . $utilisateur_nom_prenom . '</h4>' : '')?>
<?php include('filtres.tpl.html') ?>
<div class="flottant-gauche">
<p>Classement / Nom retenu du taxon / Nombre de photographies</p>
<ol>
<?php foreach ($taxons as $taxon => $nbre) : ?>
<li><?=$taxon?> : <?=$nbre?></li>
<?php endforeach; ?>
</ol>
</div>
/branches/v3.01-serpe/widget/modules/stats/squelettes/liste_utilisateurs_nbre_photos.tpl.html
New file
0,0 → 1,15
<h2>Liste des utilisateurs possédant le plus grand nombre de photographies publiques</h2>
<?=(isset($utilisateur_nom_prenom) ? '<h4>utilisateur: ' . $utilisateur_nom_prenom . '</h4>' : '')?>
<?php include('filtres.tpl.html') ?>
<div class="flottant-gauche">
<?php if (isset($utilisateurs)) : ?>
<p>Classement / Utilisateur / Nombre de photographies</p>
<ol>
<?php foreach ($utilisateurs as $nomPrenom => $nbre) : ?>
<li><?=$nomPrenom?> : <?=$nbre?></li>
<?php endforeach; ?>
</ol>
<?php else : ?>
<p>Aucun résultat ne correspond à vos filtres</p>
<?php endif; ?>
</div>
/branches/v3.01-serpe/widget/modules/stats/squelettes/nombres.tpl.html
New file
0,0 → 1,12
<h2>Nombres</h2>
<?=(isset($utilisateur_nom_prenom) ? '<h4>utilisateur: ' . $utilisateur_nom_prenom . '</h4>' : '')?>
<?php include('filtres.tpl.html') ?>
<ul>
<li>Nombre d'observations publiques / total : <strong><?=number_format($observationsPubliques, 0, ',', ' ')?></strong> / <strong><?=number_format($observations, 0, ',', ' ')?></strong></li>
<li>Nombre d'images : <strong><?=number_format($images, 0, ',', ' ')?></strong></li>
<li>Nombre d'images liées aux observations : <strong><?=number_format($imagesLiees, 0, ',', ' ')?></strong></li>
<li>Nombre d'observations liées aux images : <strong><?=number_format($observationsLiees, 0, ',', ' ')?></strong></li>
<li>Moyenne images par observation : <strong><?=number_format($moyImagesParObs, 2, ',', ' ')?></strong></li>
<li title="Hors observations géoréférencées mais non liées à une commune.">Nombre de communes possédant des observations : <strong><?=number_format($communes, 0, ',', ' ')?></strong></li>
<li>Nombre d'observations par communes (mini / moyenne / maxi) : <strong><?=number_format($observationsParCommunesMin, 0, ',', ' ')?></strong> / <strong><?=number_format($observationsParCommunesMoyenne, 2, ',', ' ')?></strong> / <strong><?=number_format($observationsParCommunesMax, 0, ',', ' ')?></strong></li>
</ul>
/branches/v3.01-serpe/widget/modules/stats/squelettes/grands_contributeurs.tpl.html
New file
0,0 → 1,29
<h2>Les <?= $donnees['entete']->nombre ?> plus importants contributeurs depuis <?= $donnees['entete']->jours ?> jours</h2>
<table class="table">
<tr>
<td>Contributeur(trice)</td>
<?php if($donnees['entete']->critere != "img"): ?>
<td>Nombre d'observations</td>
<?php endif; ?>
<?php if($donnees['entete']->critere != "obs"): ?>
<td>Nombre d'images</td>
<?php endif; ?>
<?php if($donnees['entete']->critere == null): ?>
<td>Somme des données publiées</td>
<?php endif; ?>
</tr>
<?php foreach($donnees['resultats'] as $util): ?>
<tr>
<td><?= $util->intitule_utilisateur ?></td>
<?php if($donnees['entete']->critere != "img"): ?>
<td><?= $util->nombreObs ?></td>
<?php endif; ?>
<?php if($donnees['entete']->critere != "obs"): ?>
<td><?= $util->nombreImg ?></td>
<?php endif; ?>
<?php if($donnees['entete']->critere == null): ?>
<td><?= $util->somme ?></td>
<?php endif; ?>
</tr>
<?php endforeach; ?>
</table>
/branches/v3.01-serpe/widget/modules/stats/squelettes/css/stats_tout.css
New file
0,0 → 1,110
/* Copié depuis http://getbootstrap.com/examples/dashboard/ */
 
body {
/* padding-top: 50px; */
}
.sub-header {
border-bottom: 1px solid #EEEEEE;
padding-bottom: 10px;
}
 
.container-stats {
padding-left: 0;
padding-right: 0;
}
 
.sidebar {
display: none;
}
.sidebar {
background-color: #F5F5F5;
border-right: 1px solid #EEEEEE;
display: block;
overflow-x: hidden;
overflow-y: auto;
padding-top: 20px;
padding-right: 0;
/*position: fixed;
left: 0;
bottom: 0;
top: 51px;
margin-top: 20px;*/
z-index: 1;
}
.nav-sidebar {
margin-bottom: 20px;
margin-left: -20px;
/*margin-right: -21px;*/
}
.nav-sidebar li {
float: left;
width: 100%;
}
 
.nav li a:focus {
background-color: #428BCA;
}
 
@media screen and (max-width: 1000px) {
.nav-sidebar {
margin-bottom: 0;
}
.nav-sidebar li {
width: 200px;
}
.nav-sidebar li a {
font-size : 12px;
padding-top : 5px;
padding-bottom: 5px;
}
.sidebar {
padding-top: 0;
}
}
 
.nav-sidebar > li > a {
padding-left: 20px;
padding-right: 20px;
}
.nav-sidebar > .active > a {
background-color: #428BCA;
color: #FFFFFF;
}
.main {
padding: 20px;
}
@media (min-width: 768px) {
.main {
padding-left: 40px;
padding-right: 40px;
}
}
.main .page-header {
margin-top: 0;
}
.placeholders {
margin-bottom: 30px;
text-align: center;
}
.placeholders h4 {
margin-bottom: 0;
}
.placeholder {
margin-bottom: 20px;
}
.placeholder img {
border-radius: 50%;
display: inline-block;
}
 
/* Styles non liés à bootstrap */
 
.flottant-gauche, .flottant-gauche img {
float: left;
}
 
img.stats {
border: 1px solid #000000;
display: block;
margin: 0.5em;
}
/branches/v3.01-serpe/widget/modules/stats/squelettes/filtres.tpl.html
New file
0,0 → 1,14
<?php if (array_key_exists('taxon', $filtres) || array_key_exists('num_taxon', $filtres) || array_key_exists('tag', $filtres)) : ?>
<h2>Filtes actifs</h2>
<ul>
<?php if (array_key_exists('taxon', $filtres)) : ?>
<li>nom du taxon=<?=$filtres['taxon']?></li>
<?php endif; ?>
<?php if (array_key_exists('num_taxon', $filtres)) : ?>
<li>numéro du taxon=<?=$filtres['num_taxon']?></li>
<?php endif; ?>
<?php if (array_key_exists('tag', $filtres)) : ?>
<li>Mots-clés des images=<?=$filtres['tag']?></li>
<?php endif; ?>
</ul>
<?php endif; ?>
/branches/v3.01-serpe/widget/modules/stats/squelettes/stats_utilisateur.tpl.html
New file
0,0 → 1,78
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<meta http-equiv="Content-style-type" content="text/css" />
<meta http-equiv="Content-script-type" content="text/javascript" />
<meta http-equiv="Content-language" content="fr" />
<meta name="revisit-after" content="15 days" />
<meta name="robots" content="index,follow" />
<meta name="author" content="Jean-Pascal MILCENT" />
<meta name="keywords" content="Statistiques, CEL, Tela Botanica, graphiques" />
<meta name="description" content="Graphiques et statistiques sur les observations et images du Carnet en Ligne (CEL)" />
<title>Statistiques du Carnet En Ligne</title>
<style>
img{display:block;margin:0.5em;border:1px solid black;}
hr.nettoyeur {clear:both;width:0;}
.flottant-gauche img{float:left;}
</style>
<!-- Stats : Google Analytics -->
<script type="text/javascript">
//<![CDATA[
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-20092557-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
//]]>
</script>
</head>
<body>
<?php $i=0;?>
<h1>Statistiques du CEL de <?=$utilisateur_nom_prenom?></h1>
<div class="flottant-gauche">
<?php include('nbres.tpl.html')?>
</div>
<div class="flottant-gauche">
<h2>Observations - Activité</h2>
<img src="<?=$url_service?>/UtilisationJournaliere/<?=date("Y-m-d", (time() - 86400))?>?serveur=<?=$i++?>&amp;utilisateur=<?=$utilisateur?>" alt="Intensité d'utilisation pour la journée d'hier" />
<img src="<?=$url_service?>/UtilisationJournaliere?serveur=<?=$i++?>&amp;utilisateur=<?=$utilisateur?>" alt="Intensité d'utilisation pour aujourd'hui" />
</div>
<hr class="nettoyeur" />
<div class="flottant-gauche">
<h2>Observations - Données</h2>
<img src="<?=$url_service?>/NbreObsPublicVsPrivee?serveur=<?=$i++?>&amp;utilisateur=<?=$utilisateur?>" alt="Nombre d'observations publiques versus privées" />
<img src="<?=$url_service?>/NbreObsDetermineeVsInconnue?serveur=<?=$i++?>&amp;utilisateur=<?=$utilisateur?>" alt="Nombre d'observations déterminées versus inconnues" />
<hr class="nettoyeur" />
<img src="<?=$url_service?>/NbreObsAvecIndicationGeo?serveur=<?=$i++?>&amp;utilisateur=<?=$utilisateur?>" alt="Nombre d'observations avec indications géographiques" />
</div>
<hr class="nettoyeur" />
<div>
<h2>Observations - Évolution</h2>
<img src="<?=$url_service?>/EvolObsParMoisGlissant?serveur=<?=$i++?>&amp;utilisateur=<?=$utilisateur?>" alt="Évolutions des observation sur le dernier mois glissant" />
<img src="<?=$url_service?>/EvolObsParMois?serveur=<?=$i++?>&amp;utilisateur=<?=$utilisateur?>" alt="Évolutions des observation par mois" />
<img src="<?=$url_service?>/EvolObsParAn?serveur=<?=$i++?>&amp;utilisateur=<?=$utilisateur?>" alt="Évolutions des observation par an" />
</div>
<hr class="nettoyeur" />
<div class="flottant-gauche">
<h2>Utilisateurs</h2>
<img src="<?=$url_service?>/NuagePointsObsParHeureEtJourSemaine?serveur=<?=$i++?>&amp;utilisateur=<?=$utilisateur?>" alt="Nuage de points d'observation par heure et jour de la semaine" />
</div>
<hr class="nettoyeur" />
<div>
<h2>Images</h2>
<img src="<?=$url_service?>/EvolImgParMois?serveur=<?=$i++?>&amp;utilisateur=<?=$utilisateur?>" alt="Évolutions du dépôt d'images par mois" />
<img src="<?=$url_service?>/EvolImgLieesParMois?serveur=<?=$i++?>&amp;utilisateur=<?=$utilisateur?>" alt="Évolutions des images liées aux observations par mois" />
</div>
<hr class="nettoyeur" />
<div class="flottant-gauche">
<?php include('navigation.tpl.html') ?>
</div>
</body>
</html>
/branches/v3.01-serpe/widget/modules/stats/squelettes/stats_tout.tpl.html
New file
0,0 → 1,116
<!doctype html>
<html lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<meta http-equiv="Content-style-type" content="text/css" />
<meta http-equiv="Content-script-type" content="text/javascript" />
<meta http-equiv="Content-language" content="fr" />
<meta name="revisit-after" content="15 days" />
<meta name="robots" content="index,follow" />
<meta name="author" content="Tela Botanica" />
<meta name="keywords" content="Statistiques, CEL, Tela Botanica, graphiques" />
<meta name="description" content="Graphiques et statistiques sur les observations et images du Carnet en Ligne (CEL)" />
 
<!-- OpenGraph pour Facebook, Pinterest, Google+ -->
<meta property="og:type" content="website" />
<meta property="og:title" content="Statistiques du CeL" />
<meta property="og:site_name" content="Tela Botanica" />
<meta property="og:description" content="Statistiques générales et personnelles sur les données du Carnet en Ligne (observations, images, utilisateurs)" />
<meta property="og:image" content="https://resources.tela-botanica.org/tb/img/256x256/carre_englobant.png" />
<meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="256" />
<meta property="og:image:height" content="256" />
<meta property="og:locale" content="fr_FR" />
 
<link rel="stylesheet" type="text/css" href="https://resources.tela-botanica.org/bootstrap/3.1.0/css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="<?=$url_css?>" media="screen" />
 
<script src="https://resources.tela-botanica.org/jquery/1.9.1/jquery.min.js"></script>
<script src="https://resources.tela-botanica.org/bootstrap/3.1.0/js/bootstrap.min.js"></script>
<script src="<?=$url_js?>"></script>
 
<?php if ($nobar === false): ?>
<script src="<?=$url_script_navigation?>"></script>
<?php endif; ?>
 
<title>Statistiques du Carnet En Ligne</title>
 
<!-- Stats : Google Analytics -->
<script>
// répercussion de la config PHP pour ne solliciter GA qu'en prod
var prod = false;
<?php if ($prod): ?>
prod = true;
<?php endif; ?>
 
if (prod) {
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-57885-8', 'auto');
}
</script>
</head>
 
<body>
<?php if ($nobar === false): ?>
<div id="tb-navigation" data-courant="widget-cel-stats" data-squelette="bootstrap3" data-mode="<?=$mode_serveur?>">
<form class="navbar-form navbar-left">
<?php if ($utilisateur_authentifie): ?>
<button class="btn btn-default" disabled><?=$utilisateur?></button>
<a id="mode-stats" class="btn btn-success" href="?mode=defaut" data-mode-courant="utilisateur">Statistiques globales</a>
<?php else: ?>
<a id="mode-stats" class="btn btn-success" href="?mode=utilisateur" data-mode-courant="defaut">Statistiques personnelles</a>
<?php endif; ?>
</form>
</div>
<?php endif; ?>
 
<div class="container-fluid container-stats">
<div class="col-md-2 sidebar" id="colonne-menu" data-url-widget="<?=$url_widget?>">
<ul class="nav nav-sidebar">
<li class="active"><a href="#" data-portion="nombres">Nombres</a></li>
<li><a href="#" data-portion="observations-activite">Observations - activité</a></li>
<li><a href="#" data-portion="observations-donnees">Observations - données</a></li>
<li><a href="#" data-portion="observations-evolution">Observations - évolution</a></li>
<li><a href="#" data-portion="utilisateurs">Utilisateurs</a></li>
<li><a href="#" data-portion="images">Images</a></li>
<li><a href="#" data-portion="grandscontributeurs">Grands contributeurs récents</a></li>
<li><a href="#" data-portion="listetaxonsnbrephotos">Taxons ayant le plus grand nombre de photos</a></li>
<li><a href="#" data-portion="listeutilisateursnbrephotos">Utilisateurs ayant ajouté le plus de photos</a></li>
</ul>
</div>
 
<div class="col-md-offset-2 main">
<h1 class="page-header">Statistiques du Carnet en Ligne</h1>
 
<div id="zone-chargement">
<img src="<?=$url_image_chargement?>" />
</div>
 
<div class="resultat" id="emplacement-resultat-nombres">
</div>
<div class="resultat" id="emplacement-resultat-observations-activite">
</div>
<div class="resultat" id="emplacement-resultat-observations-donnees">
</div>
<div class="resultat" id="emplacement-resultat-observations-evolution">
</div>
<div class="resultat" id="emplacement-resultat-utilisateurs">
</div>
<div class="resultat" id="emplacement-resultat-images">
</div>
<div class="resultat" id="emplacement-resultat-grandscontributeurs">
</div>
<div class="resultat" id="emplacement-resultat-listetaxonsnbrephotos">
</div>
<div class="resultat" id="emplacement-resultat-listeutilisateursnbrephotos">
</div>
 
</div>
</div>
</body>
</html>
/branches/v3.01-serpe/widget/modules/stats/squelettes/img/chargement.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v3.01-serpe/widget/modules/stats/squelettes/img/chargement.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v3.01-serpe/widget/modules/stats/squelettes/js/defaut.js
New file
0,0 → 1,67
$(document).ready(function() {
// config depuis PHP
var urlWidget = $('#colonne-menu').data('url-widget'),
modeUtilisateur = ($('#mode-stats').data('mode-courant') == 'utilisateur');
 
$('#zone-chargement').hide();
 
// écouteurs de clics sur le menu
$('#colonne-menu .nav-sidebar a').click(function() {
var portion = $(this).data('portion'),
idEmplacement = '#emplacement-resultat-' + portion;
 
// attente
$('#zone-chargement').show();
masquerZonesResultat();
 
// stats
if (prod) {
ga('send', 'pageview', 'statistiques/' + portion);
}
 
// rendu du contenu
//alert('déjà chargé? : ' + $(idEmplacement).data('charge') + ' (' + ($(idEmplacement).data('charge') === true) + ')');
if ($(idEmplacement).data('charge')) {
postChargement(idEmplacement, portion);
} else {
// rendu de la portion par le widget
urlPortion = urlWidget + '?page=' + portion;
if (modeUtilisateur) {
urlPortion += '&mode=utilisateur';
}
rendu = $.ajax({
url: urlPortion,
type: 'get',
success: function(data) {
$(idEmplacement).html(data);
postChargement(idEmplacement, portion);
$(idEmplacement).data('charge', 'true');
},
error: function() {
$(idEmplacement).html('Erreur: impossible de charger les statistiques');
postChargement(idEmplacement, portion);
}
});
}
 
// interface
$(this).parent().parent().find('li.active').removeClass('active');
$(this).parent().addClass('active');
 
return false;
});
 
function postChargement(idEmplacement, portion) {
$('#zone-chargement').hide();
// affichage de la portion demandée et masquage des autres
masquerZonesResultat();
$(idEmplacement).show();
}
 
function masquerZonesResultat() {
$('div.resultat').hide();
}
 
// chargement par défaut
$('#colonne-menu a[data-portion="nombres"]').trigger('click');
});