New file |
0,0 → 1,272 |
<?php |
/** |
* Service fournissant des urls vers des images de graphiques sur les statistiques de l'application COEL. |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* Cas d'utilisation : |
* /CoelStatistique/MonTypeDeStat : retourne l'url du graphique pour le type de statistique demandé |
* |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.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 2009 |
*/ |
class CoelStatistique extends Coel { |
|
private $parametres = array(); |
|
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($param) { |
$info = null; |
|
if (isset($param[0])) { |
$service_demande = array_shift($param); |
$this->parametres = $param; |
$methode = 'get'.$service_demande; |
if (method_exists($this, $methode)) { |
$info = $this->$methode(); |
} |
} else { |
$this->messages[] = "Le service COEL Statistique nécessite un paramètre."; |
} |
|
print $info; |
} |
|
private function getAccueil() { |
$html = '<h2>Bienvenue</h2>'. |
'<p>Vous utilisez Coel</p>'; |
return $html; |
} |
|
private function getNombreDonnees() { |
// Récupération des données |
$types = array( array('Commentaires', 'coel_commentaire', 'ccm_id_commentaire'), |
array('Publications', 'coel_publication', 'cpu_id_publication'), |
array('Personnes', 'coel_personne', 'cp_id_personne'), |
array('Collections', 'coel_collection', 'cc_id_collection'), |
array('Structures', 'coel_structure', 'cs_id_structure')); |
$donnees = array(); |
foreach ($types as $info) { |
list($type, $table, $champ) = $info; |
$donnees[$type] = $this->executerRequeteNombre($table, $champ); |
} |
|
// Post traitement des données de la base de données |
$titre = str_replace(' ', '+', 'Nombre de données'); |
asort($donnees); |
$valeurs = implode(',', $donnees); |
arsort($donnees); |
$etiquettes = implode('|', array_keys($donnees)); |
|
// Construire de l'url de l'image |
$url = 'http://chart.apis.google.com/chart?'. |
'cht=bhs'. |
'&chs=250x180'. |
'&chco=4D89F9'. |
'&chd=t:'.$valeurs. |
'&chds=0,'.max($donnees). |
'&chxt=y'. |
'&chxl='.'0 :|'.$etiquettes.'|'. |
'&chm=N ** ,000000,0,-1,10'. |
'&chtt='.$titre; |
return '<img src="'.$url.'"/>'; |
} |
|
private function getMesDonnees() { |
$personne_id = (isset($this->parametres[0]) ? $this->parametres[0] : null); |
// Récupération des données |
$types = array( 'Commentaires' => '107', |
'Publications' => '118, 119', |
'Personnes' => '113, 114', |
'Collections' => '101, 102, 103, 104, 105, 106', |
'Structures' => '120, 121, 122, 123'); |
$etats = array( 1 => 'Ajouts', |
2 => 'Modifications', |
3 => 'Suppressions'); |
$donnees = array(); |
foreach ($types as $type => $table_identifiants) { |
foreach ($etats as $etat_id => $etat_type) { |
$donnees[$etat_type][$type] = $this->executerRequeteNombreDansHistorique($table_identifiants, $etat_id, $personne_id); |
} |
} |
|
// Post traitement des données de la base de données |
$titre = str_replace(' ', '+', 'Ma participation'); |
$max_global = array(); |
$ensembles_donnees = array(); |
foreach ($donnees as $ensemble_donnees) { |
$ensembles_donnees[] = implode(',', array_reverse($ensemble_donnees)); |
|
// Gestion de l'échelle |
foreach ($ensemble_donnees as $type => $val) { |
if (!isset($max_global[$type])) { |
$max_global[$type] = 0; |
} |
$max_global[$type] += $val; |
} |
} |
$maximum = max($max_global); |
$moitier = round(($maximum / 2), 1); |
$valeurs = implode('|', $ensembles_donnees); |
$etiquettes = implode('|', array_keys($types)); |
$legende = implode('|', $etats); |
$etiquettes_x = "0|$moitier|$maximum"; |
|
// Construire de l'url de l'image |
$url = 'http://chart.apis.google.com/chart?'. |
'cht=bhs'. |
'&chs=300x180'. |
'&chbh=a,2,4'. |
'&chco=66B032,FABC02,FE2712'. |
'&chdl='.$legende. |
'&chdlp=b'. |
'&chd=t:'.$valeurs. |
'&chds=0,'.$maximum. |
'&chxt=y,x'. |
'&chxl='.'0:|'.$etiquettes.'|1:|'.$etiquettes_x. |
'&chm=N,000000,0,-1,10,1|N,000000,1,-1,10,1|N,000000,2,-1,10,1'. |
'&chtt='.$titre; |
return '<img src="'.$url.'"/>'; |
} |
|
private function getTypeDepot() { |
// Récupération des données |
$requete = 'SELECT cmlv_nom AS type, COUNT(cc_ce_type_depot) AS nbre '. |
'FROM coel_collection '. |
' LEFT JOIN coel_meta_liste_valeur ON (cc_ce_type_depot = cmlv_id_valeur) '. |
'GROUP BY cc_ce_type_depot'; |
try { |
$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC); |
if ($infos === false) { |
$this->messages[] = "La requête a retourné aucun résultat."; |
} |
} catch (PDOException $e) { |
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage()); |
} |
|
// Post traitement des données de la base de données |
$titre = str_replace(' ', '+', 'Type de dépôt|des collections'); |
$donnees = array(); |
foreach ($infos as $info) { |
$donnees[$info['type']] = $info['nbre']; |
} |
asort($donnees); |
$valeurs = implode(',', $donnees); |
arsort($donnees); |
$etiquettes = implode('|', array_keys($donnees)); |
|
// Construire de l'url de l'image |
$url = 'http://chart.apis.google.com/chart?'. |
'cht=bhs'. |
'&chs=250x170'. |
'&chco=4D89F9'. |
'&chd=t:'.$valeurs. |
'&chds=0,'.(max($donnees)+5). |
'&chxt=y'. |
'&chxl='.'0 :|'.$etiquettes.'|'. |
'&chm=N *,000000,0,-1,10'. |
'&chtt='.$titre. |
'&chts=000000,12'; |
|
// Retour du html contenant l'image |
return '<img src="'.$url.'"/>'; |
} |
|
private function getNombreCollectionParStructure() { |
// Récupération des données |
$requete = 'SELECT COUNT(cc_id_collection) AS nbre '. |
'FROM coel_collection '. |
'GROUP BY cc_ce_structure'; |
try { |
$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC); |
if ($infos === false) { |
$this->messages[] = "La requête a retourné aucun résultat."; |
} |
} catch (PDOException $e) { |
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage()); |
} |
|
// Post traitement des données de la base de données |
$titre = str_replace(' ', '+', 'Nombre de collections|par institution'); |
$donnees = array( '1 collection' => 0, |
'2 collections' => 0, |
'Entre 3 et 10' => 0, |
'Entre 11 et 50' => 0, |
'Plus de 50' => 0); |
foreach ($infos as $info) { |
$nbre = $info['nbre']; |
if ($nbre == 1) { |
$donnees['1 collection']++; |
} else if ($nbre == 2) { |
$donnees['2 collections']++; |
} else if ($nbre >= 3 && $nbre <= 10) { |
$donnees['Entre 3 et 10']++; |
} else if ($nbre >= 11 && $nbre <= 50) { |
$donnees['Entre 11 et 50']++; |
} else if ($nbre > 50) { |
$donnees['Plus de 50']++; |
} |
|
} |
|
$donnees_tmp = $donnees; |
$donnees = array(); |
foreach ($donnees_tmp as $cle => $valeur) { |
$donnees[$cle.' ('.$valeur.')'] = $valeur; |
} |
asort($donnees); |
$valeurs = implode(',', $donnees); |
//arsort($donnees); |
$etiquettes = implode('|', array_keys($donnees)); |
//$legende = implode('|', array_keys($donnees)); |
|
// Construire de l'url de l'image |
$url = 'http://chart.apis.google.com/chart?'. |
'cht=p3'. |
'&chs=350x150'. |
'&chco=4D89F9'. |
'&chd=t:'.$valeurs. |
'&chds=0,'.max($donnees). |
'&chl='.$etiquettes. |
'&chtt='.$titre. |
'&chts=000000,12'; |
|
// Retour du html contenant l'image |
return '<img src="'.$url.'"/>'; |
} |
|
private function executerRequeteNombreDansHistorique($table_identifiants, $etat, $personne_id = null) { |
$requete = "SELECT COUNT(cmhl_date_modification) AS nbre ". |
"FROM coel_meta_historique_ligne ". |
"WHERE cmhl_ce_table IN ($table_identifiants) ". |
" AND cmhl_ce_etat = $etat ". |
(isset($personne_id) ? " AND cmhl_ce_modifier_par = $personne_id " : ''); |
try { |
$nbre = $this->bdd->query($requete)->fetchColumn(); |
if ($nbre === false) { |
$this->messages[] = "La requête a retourné aucun résultat."; |
} |
} catch (PDOException $e) { |
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage()); |
} |
return $nbre; |
} |
|
private function executerRequeteNombre($table, $champ) { |
$requete = "SELECT COUNT($champ) AS nbre FROM $table"; |
try { |
$nbre = $this->bdd->query($requete)->fetchColumn(); |
if ($nbre === false) { |
$this->messages[] = "La requête a retourné aucun résultat."; |
} |
} catch (PDOException $e) { |
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage()); |
} |
return $nbre; |
} |
} |