Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 1890 → Rev 1891

/tags/v1.5-carbone/commun/MotsClesImage.php
New file
0,0 → 1,40
<?php
namespace TelaBotanica\Del\Commun;
/**
* @author Raphaël Droz <raphael@tela-botanica.org>
* @author Aurélien PERONNET <aurelien@tela-botanica.org>
* @copyright Copyright (c) 2013, Tela Botanica (accueil@tela-botanica.org)
* @license Licence CECILL http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt
* @license Licence GNU-GPL http://www.gnu.org/licenses/gpl.html
* @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Images
*/
class MotsClesImage {
 
// cf: images/VotesImage.php
static function updateStats($db, $id_image) {
$id_image = intval($id_image);
if (!$id_image) {
$msg = "Ne peut mettre à jour les statistiques de vote";
throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
}
 
// on utilise toujours cette table de stats (ListeImages) pour les mots-clef "actif".
$requete = 'UPDATE del_image_stat '.
"SET nb_tags = (SELECT COUNT(id_tag) FROM del_image_tag WHERE ce_image = $id_image AND actif = 1) ".
"WHERE ce_image = $id_image ".
' -- '.__FILE__.' : '.__LINE__;
$db->requeter($requete);
}
 
//TODO: déplacer les fonctions ci dessus et dessous dans une classe utilitaire
static function normaliserMotCle($motCle, $charset='utf-8') {
$motCle = trim($motCle);
$str = htmlentities($motCle, ENT_NOQUOTES, $charset);
$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. '&oelig;'
$str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères
$str = str_replace(array(' ', '-', "'"), '_', $str);// supprime les espaces, tirets et simple-quotes en underscores
//TODO Voir si on doit mettre en minuscule : $str = mb_strtolower($str);
return $str;
}
}
/tags/v1.5-carbone/commun/Utilisateurs.php
New file
0,0 → 1,64
<?php
namespace TelaBotanica\Del\Commun;
 
class Utilisateurs {
 
/**
* Récupère toutes les informations (incluant le pseudo) sur une liste d'utilisateurs,
* à partir de leurs courriels
* Retourne un tableau dont les clefs sont les courriels et les valeurs sont un
* tableau d'attributs
*
* @param array $courriels la liste des courriels pour lesquels récupérer l'identité
* @param string $baseUrlServiceAnnuaire le squelette d'URL du service d'annuaire à appeler
*/
static function identiteUtilisateurs(array $courriels, $baseUrlServiceAnnuaire) {
// Récupération des données au format Json @TODO POST plutôt que GET car limite de taille !
$service = "identite-par-courriel/".implode(',', $courriels);
$url = sprintf($baseUrlServiceAnnuaire, $service);
 
$json = file_get_contents($url);
$utilisateurs = json_decode($json, true);
 
return $utilisateurs;
}
 
/**
* D'après l'identité complète d'un utilisateur, retourne l'identité à afficher, càd par ordre de préférence décroissant:
* - son pseudo s'il en a un
* - ses prénom et nom s'ils au moins un des deux est renseigné
* - son adresse courriel tronquée
*
* Si $identité est "vide" (empty()), retourne NULL
* Si $identité n'est pas un tableau, on considère que c'est une adresse courriel et on la retourne tronquée
*
* @param mixed $identite
*/
static function identiteAAfficher($identite) {
$retour = null;
if (! empty($identite)) {
if (is_array($identite)) { // cas général
// y a-t-il un pseudo ?
if (isset($identite['pseudo']) && $identite['pseudo'] != '') {
$retour = $identite['pseudo'];
} else {
// prénom et nom, si la personne est inscrite (on sait jamais)
// et si au moins un des deux est rempli
if ((isset($identite['prenom']) && $identite['prenom'] != '') || (isset($identite['nom']) && $identite['nom'] != '')) {
$retour = $identite['prenom'];
if ($retour != '') {
$retour .= ' ';
}
$retour .= $identite['nom'];
}
}
} else {
$posArobase = strpos($identite, "@");
if ($posArobase > 0) { // courriel
$retour = substr($identite, 0, $posArobase + 1) . "...";
}
}
}
return $retour;
}
}
/tags/v1.5-carbone/commun/Stats.php
New file
0,0 → 1,63
<?php
namespace TelaBotanica\Del\Commun;
 
class Stats {
 
static function updateStats($db, $id_image, $id_proto) {
// @TODO Attention aux situations de concurrence possible - nécessite une
// transaction mais la flemme de tout mettre en InnoDB
$id_image = intval($id_image);
$id_proto = intval($id_proto);
if (!$id_image || !$id_proto) throw new Exception("Ne peut mettre à jour les statistiques de vote",
RestServeur::HTTP_CODE_ERREUR);
 
// 1) choper tous les votes pour le protocole choisi
$votes = $db->requeter(sprintf(
' SELECT ce_image, ce_protocole, valeur, ce_utilisateur'.
' FROM del_image_vote'.
' WHERE ce_image = %d AND ce_protocole = %d',
$id_image, $id_proto));
 
// 2) calculer la moyenne pondérée, le nombre de points
// @ACHTUNG_ALARM attention à ce que cette méthode corresponde avec les
// calculs dans GWT, notamment l'échelle de points !!
$nbPoints = 0;
$nbVotes = 0;
//$echelle = array(-1, 0, 1, 4, 20);
$echelle = array(1, 10, 100, 1000, 10000);
$notesParOccurrences = array();
$utilisateurs = array();
foreach ($votes as $vote) {
if (! in_array($vote['ce_utilisateur'], $utilisateurs)) {
// un seul vote par utilisateur sur un protocole donné !!
$utilisateurs[] = $vote['ce_utilisateur'];
$note = $vote['valeur'];
$nbPoints += $echelle[$note - 1];
if (array_key_exists($note, $notesParOccurrences)) {
$notesParOccurrences[$note]++;
} else {
$notesParOccurrences[$note] = 1;
}
$nbVotes++;
}
}
$moyennePonderee = 0;
$diviseur = 0;
foreach ($notesParOccurrences as $n => $o) {
$moyennePonderee += ($n * $o * $o);
$diviseur += ($o * $o);
}
if ($diviseur > 0) {
$moyennePonderee = $moyennePonderee / $diviseur;
}
 
// 3) mise à jour de la table stats
$db->requeter(sprintf(
' INSERT INTO del_image_stat (ce_image, ce_protocole, moyenne, nb_votes, nb_points)'.
' VALUES (%d, %d, %s, %d, %d)'.
' ON DUPLICATE KEY UPDATE moyenne = %s, nb_votes = %d, nb_points = %d',
$id_image, $id_proto, number_format($moyennePonderee, 3, '.', ''), $nbVotes, $nbPoints,
number_format($moyennePonderee, 3, '.', ''), $nbVotes, $nbPoints));
 
}
}