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