/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. 'œ' |
$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)); |
} |
} |