Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 2170 → Rev 2171

/branches/v1.11-magnesium/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;
}
}
/branches/v1.11-magnesium/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));
 
}
}
/branches/v1.11-magnesium/commun/Messagerie.php
New file
0,0 → 1,128
<?php
namespace TelaBotanica\Del\Commun;
class Messagerie {
 
private $conteneur = null;
 
public function __construct($conteneur) {
$this->conteneur = $conteneur;
}
 
public function envoyerHtml($destinataires, $sujet, $messageHtml, $messageTxt = '') {
if ($messageTxt == '') {
$messageSansHtml = $this->supprimerHtml($messageHtml);
$messageTxt = $this->nettoyerTxt($messageSansHtml);
}
$encodage = $this->conteneur->getParametre('encodage_appli');
mb_internal_encoding($encodage);
// tentative d'acceptation des sujets longs (+ 76 caractères) par les clients mail tatillons
$sujetEncode = mb_encode_mimeheader($sujet, mb_internal_encoding(), "B", "\n");
 
$emailExpediteur = $this->conteneur->getParametre('adresse_expediteur_recapitulatif');
$dateHeure = date('r');
$uid = md5(uniqid(rand()));
$limite = "_----------=_parties_$uid";
$eol = "\n";// ATTENTION : avec Qmail laisser seulement \n car il remplace automatiquement par \r\n
 
// Définition d'un mail en texte simple et html
// multipart/alternative signifie même contenu de la forme la plus simple à la plus complexe
$entetes = 'X-Sender: <http://www.tela-botanica.org>'.$eol.
'X-Mailer: PHP-DEL-SCRIPTS'.$eol.
'X-auth-smtp-user: '.$emailExpediteur.$eol.
'X-abuse-contact: '.$emailExpediteur.$eol.
'Date: '.$dateHeure.$eol.
'From: '.$emailExpediteur.$eol.
'Reply-To: '.$this->conteneur->getParametre('adresse_reponse').$eol.
'MIME-Version: 1.0'.$eol.
"Content-Type: multipart/alternative; boundary=\"$limite\";".$eol.$eol;
 
// le message en html est préféré s'il est lisible
$contenu =
"--$limite".$eol.
"Content-Type: text/plain; charset=\"$encodage\";".$eol.
"Content-Transfer-Encoding: 8bit;".$eol.$eol.
"$messageTxt".$eol.$eol.
"--$limite".$eol.
"Content-Type: text/html; charset=\"$encodage\";".$eol.
"Content-Transfer-Encoding: 8bit;".$eol.$eol.
"$messageHtml".$eol.
"--".$limite."--".$eol.$eol;
 
$envoieStatut = $this->envoyer($destinataires, $entetes, $sujetEncode, $contenu);
 
return $envoieStatut;
}
 
public function envoyerTxt($destinataires, $sujet, $messageTxt) {
$emailExpediteur = $this->conteneur->getParametre('adresse_expediteur_recapitulatif');
$encodage = $this->conteneur->getParametre('encodage_appli');
mb_internal_encoding($encodage);
$sujetEncode = mb_encode_mimeheader($sujet, mb_internal_encoding(), "B", "\n");
$dateHeure = date('r');
$eol = "\n";// ATTENTION : avec Qmail laisser seulement \n car il remplace automatiquement par \r\n
 
// Définition d'un mail en texte simple et html
// multipart/alternative signifie même contenu de la forme la plus simple à la plus complexe
$entetes = 'X-Sender: <http://www.tela-botanica.org>'.$eol.
'X-Mailer: PHP-DEL-SCRIPTS'.$eol.
'X-auth-smtp-user: '.$emailExpediteur.$eol.
'X-abuse-contact: '.$emailExpediteur.$eol.
'Date: '.$dateHeure.$eol.
'From: '.$emailExpediteur.$eol.
'Reply-To: '.$this->conteneur->getParametre('adresse_reponse').$eol.
'MIME-Version: 1.0'.$eol.
"Content-Type: text/plain; charset=\"$encodage\";".$eol.$eol;
 
// le message en html est préféré s'il est lisible
$contenu = $messageTxt.$eol.$eol;
 
$envoieStatut = $this->envoyer($destinataires, $entetes, $sujetEncode, $contenu);
 
return $envoieStatut;
}
 
private function envoyer($destinataires, $entetes, $sujet, $contenu) {
$envoieStatut = mail(
$destinataires,
$sujet,
$contenu,
$entetes
);
return $envoieStatut;
}
 
/** Transforme automatiquement le message html en message txt.
*
* Réalise un stip_tags et avant ça un remplacement des liens sur mesure pour les mettre au format email txt.
*/
private function supprimerHtml($messageHtml) {
$html = $this->ajouterHrefDansBalise($messageHtml);
$messageSansHtml = strip_tags($html);
return $messageSansHtml;
}
 
/**
* Extrait la valeur de l'attribut href des balises HTML de liens (a) et ajoute le lien entre
* chevrons (<>) dans le contenu de la balise "a".
*/
private function ajouterHrefDansBalise($html) {
libxml_use_internal_errors(true);
$dom = new \DOMDocument();
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
if ($node->hasAttribute( 'href' )) {
$href = $node->getAttribute('href');
$node->nodeValue = $node->nodeValue." ( $href )";
}
}
$html = $dom->saveHtml();
return $html;
}
 
private function nettoyerTxt($message) {
$messageSansTab = preg_replace('/\t+/', '', $message);
$messageSansRetourMultiple = preg_replace('/\n+/', "\n", $messageSansTab);
$messageTxt = html_entity_decode($messageSansRetourMultiple, null, 'UTF-8');
return $messageTxt;
}
}
/branches/v1.11-magnesium/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;
}
}