Subversion Repositories eFlore/Applications.del

Compare Revisions

No changes between revisions

Ignore whitespace Rev 1736 → Rev 1737

/trunk/scripts/modules/commentaires/AlerteMailCommentaires.php
16,9 → 16,13
class AlerteMailCommentaires {
 
private $conteneur;
private $testeurCourriel = null;
private $recapitulatifAdmin = [];
private $messageRecapitulatif = null;
 
private $observations_concernees = array();
private $correspondance_id_obs_auteurs = array();
private $utilisateursInfos = array();
 
public function __construct($conteneur) {
$this->conteneur = $conteneur;
26,6 → 30,7
 
public function executer() {
try {
$this->verifierModeUtilisation();
$observations = $this->chargerObservationsCommentees();
if (!empty($observations)) {
$this->formaterObservations($observations);
38,6 → 43,18
}
}
 
private function verifierModeUtilisation() {
$testeurCourriel = $this->conteneur->getParametre('t');
if ($testeurCourriel) {
if (filter_var($testeurCourriel, FILTER_VALIDATE_EMAIL)) {
$this->testeurCourriel = $testeurCourriel;
} else {
$msg = "Veuillez indiquer une adresse de courriel valide à la suite du paramètre «-t».";
new Exception($msg);
}
}
}
 
private function chargerObservationsCommentees() {
// Seuls les utilisateurs ayant explicitement refusé le mail sont ignorés
$preferences = $this->conteneur->getBdd()->proteger('%"mail_notification_mes_obs":"0"%');
73,51 → 90,68
private function formaterObservations($liste_obs) {
foreach ($liste_obs as $obs) {
$id_obs = $obs['id_observation'];
$auteur_obs = $obs['ce_utilisateur'];
$obs['date'] = $this->formaterDateObs($obs['date_observation']);
$obs['lieu'] = $this->formaterLieuObservation($obs);
$obs['lien'] = $this->obtenirLienFicheObs($obs['id_observation']);
$obs['commentaires'] = array();
$this->correspondance_id_obs_auteurs[$id_obs] = $auteur_obs;
$this->observations_concernees[$auteur_obs][$id_obs] = $obs;
$id_auteur_obs = $obs['ce_utilisateur'];
 
$infos = array();
$infos['id'] = $id_obs;
$infos['nom_sci'] = $this->formaterNomSci($obs);
$infos['date'] = $this->formaterDate($obs['date_observation']);
$infos['lieu'] = $this->formaterLieu($obs);
$infos['lien'] = $this->obtenirLienFiche($id_obs);
$infos['commentaires'] = array();
 
$this->correspondance_id_obs_auteurs[$id_obs] = $id_auteur_obs;
$this->observations_concernees[$id_auteur_obs][$id_obs] = $infos;
}
}
 
private function formaterDateObs($date) {
$time = strtotime($date);
return date('d/m/Y', $time);
private function formaterNomSci($obs) {
$nom = 'Espèce indéterminée';
if ($obs['nom_ret'] != '') {
$nom = $obs['nom_ret'];
} else if($obs['nom_sel'] != '') {
$nom = $obs['nom_sel'];
}
return $nom;
}
 
private function formaterLieuObservation($obs) {
$lieux = array();
if (!empty($obs['zone_geo'])) {
$zone_geo = $obs['zone_geo'];
$zone_geo.= (!empty($obs['ce_zone_geo']) ? ' ('.$this->convertirCodeZoneGeoVersDepartement($obs['ce_zone_geo']).')' : '');
$lieux[] = $zone_geo;
private function formaterDate($date) {
$dateFmt = '(date inconnue)';
if ($date != '0000-00-00 00:00:00') {
$time = strtotime($date);
$dateFmt = date('d/m/Y', $time);
}
if (!empty($obs['lieudit'])) {
$lieux[] = $obs['lieudit'];
return $dateFmt;
}
 
private function formaterLieu($obs) {
$lieuInfos = [];
$champsLieu = ['zone_geo', 'lieudit', 'station'];
foreach ($champsLieu as $champ) {
if (trim($obs[$champ]) == '') {
continue;
}
 
$lieuIntitule = $obs[$champ];
if ($champ == 'zone_geo') {
$codeDept = $this->convertirCodeZoneGeoVersDepartement($obs['ce_zone_geo']);
$lieuIntitule .= empty($codeDept) ? '' : " ($codeDept)";
}
$lieuInfos[] = $lieuIntitule;
}
if (!empty($obs['station'])) {
$lieux[] = $obs['station'];
}
return implode(' > ', $lieux);
$lieu = (count($lieuInfos) > 0) ? implode(' > ', $lieuInfos) : '(lieu inconnu)';
return $lieu;
}
 
 
private function convertirCodeZoneGeoVersDepartement($code_zone_geo) {
$code_departement = '';
if ($this->estUnCodeInseeDepartement($code_zone_geo)) {
$code_departement = substr(ltrim($code_zone_geo, 'INSEE-C:'), 0, 2);
if (preg_match('/^INSEE-C:([0-9]){2}[0-9]{3}$/', $code_zone_geo, $match)) {
$code_departement = $match[1];
}
return $code_departement;
}
 
private function estUnCodeInseeDepartement($code_a_tester) {
return preg_match('/^INSEE-C:[0-9]{5}/', $code_a_tester);
}
 
private function obtenirLienFicheObs($id_obs) {
private function obtenirLienFiche($id_obs) {
return sprintf($this->conteneur->getParametre('url_fiche_observation'), $id_obs);
}
 
150,10 → 184,10
protected function formaterCommentaires($liste_commentaires) {
foreach ($liste_commentaires as $commentaire) {
$id_obs = $commentaire['ce_observation'];
if (isset($this->correspondance_id_obs_auteurs[$commentaire['ce_observation']])) {
$auteur_obs = $this->correspondance_id_obs_auteurs[$commentaire['ce_observation']];
if (isset($this->correspondance_id_obs_auteurs[$id_obs])) {
$id_auteur_obs = $this->correspondance_id_obs_auteurs[$id_obs];
$commentaire['auteur'] = $this->formaterAuteur($commentaire);
$this->observations_concernees[$auteur_obs][$id_obs]['commentaires'][] = $commentaire;
$this->observations_concernees[$id_auteur_obs][$id_obs]['commentaires'][] = $commentaire;
}
}
}
163,47 → 197,142
}
 
protected function envoyerMessageAuxDestinataires() {
foreach ($this->observations_concernees as $auteur => $liste_obs) {
$message = $this->formaterMessagePourAuteur($liste_obs, $auteur);
$this->envoyerMessage($message, $auteur);
foreach ($this->observations_concernees as $auteurId => $liste_obs) {
$donnees = $this->formaterDonneesPourMessage($auteurId, $liste_obs);
$messageTxt = $this->formaterMessageTxt($donnees);
$messageHtml = $this->formaterMessageHtml($donnees);
$this->recapitulatifAdmin[$auteurId] = array('txt' => $messageTxt, 'html' => $messageHtml);
 
if ($this->testeurCourriel == null) {
$this->envoyerMessage($messageHtml, $messageTxt, $auteurId);
}
}
if ($this->testeurCourriel == null) {
$this->envoyerMessageRecap();
}
$this->envoyerMessagesTesteur();
}
 
private function formaterMessagePourAuteur($liste_obs, $auteur) {
private function formaterMessageHtml($donnees) {
$squelette = dirname(__FILE__).DS.'squelettes'.DS.'commentaires.tpl.html';
$squelettePhp = $this->conteneur->getSquelettePhp();
$msgHtml = $squelettePhp->analyser($squelette, $donnees);
return $msgHtml;
}
 
private function formaterMessageTxt($donnees) {
$squelette = dirname(__FILE__).DS.'squelettes'.DS.'commentaires.tpl.txt';
$squelettePhp = $this->conteneur->getSquelettePhp();
$msgTxt = $squelettePhp->analyser($squelette, $donnees);
// Nettoyage des tabulations pour indentation du code PHP
$msgTxt = str_replace("\t", '', $msgTxt);
return $msgTxt;
}
 
private function formaterDonneesPourMessage($auteurId, $liste_obs) {
$donnees = array();
// copie de la première obs pour en obtenir le nom et prénom de l'auteur
// (en deux fois pour éviter un warning en mode strict)
$valeurs = array_values($liste_obs);
$premiere_obs = array_shift($valeurs);
$donnees['liste_observations'] = $liste_obs;
$donnees['auteur'] = $auteur;
$donnees['auteur_formate'] = ucfirst($premiere_obs['prenom_utilisateur']).' '.ucfirst($premiere_obs['nom_utilisateur']);
$infosUtilisateur = $this->telechargerUtilisateurInfos($auteurId);
$donnees['auteur_formate'] = $this->formaterIntituleUtilisateur($infosUtilisateur);
return $donnees;
}
 
$messageSquelette = dirname(__FILE__).DS.'squelettes'.DS.'commentaires.tpl.html';
$squelettePhp = $this->conteneur->getSquelettePhp();
return $squelettePhp->analyser($messageSquelette, $donnees);
private function formaterIntituleUtilisateur($infos) {
$intituleUtilisateur = isset($infos->intitule) ? $infos->intitule : '';
return $intituleUtilisateur;
}
 
protected function envoyerMessage($message, $auteur) {
$url_requete = sprintf($this->conteneur->getParametre('url_service_messagerie'), $auteur);
$post = array(
private function envoyerMessage($messageHtml, $messageTxt, $id_destinataire) {
$url = sprintf($this->conteneur->getParametre('url_service_messagerie'), $id_destinataire);
$donnees = array(
'utilisateur_courriel' => $this->conteneur->getParametre('adresse_expediteur_recapitulatif'),
'format' => 'html',
'sujet' => $this->conteneur->getParametre('titre_message_recapitulatif'),
'message' => $message,
'utilisateur_courriel' => $this->conteneur->getParametre('adresse_expediteur_recapitulatif'),
'format' => 'html'
'message' => $messageHtml,
'message_txt' => $messageTxt
);
 
$ch = curl_init();
$options = array(
CURLOPT_URL => $url_requete,
CURLOPT_HEADER => false,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $post,
CURLOPT_RETURNTRANSFER => true
);
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
$clientRest = $this->conteneur->getRestClient();
$clientRest->modifier($url, $donnees);
}
}
?>
 
private function envoyerMessageRecap() {
$msgRecap = $this->obtenirMessageRecap();
$sujet = "IdentiPlante : récapitulatif envoies alertes commentaires";
$messagerie = $this->conteneur->getMessagerie();
$destinataire = $this->conteneur->getParametre('email_recap');
$messagerie->envoyerTxt($destinataire, $sujet, $msgRecap);
}
 
private function obtenirMessageRecap() {
if ($this->messageRecapitulatif == null) {
$msgRecap = '';
$separateur = str_repeat('-', 50);
$utilisateursIntitules = $this->obtenirInfosUtilisateurs();
foreach ($this->recapitulatifAdmin as $utilisateurId => $message) {
$messageTxt = $message['txt'];
$intitule = $utilisateursIntitules[$utilisateurId];
$msgRecap .= "Message envoyé à : $intitule\n\n$messageTxt\n$separateur\n";
}
$intituleRecap = implode("\n", $utilisateursIntitules);
 
$msgTpl = "Messages envoyés aux utilisateurs suivant :\n%s\n%s\n%s";
$this->messageRecapitulatif = sprintf($msgTpl, $intituleRecap, $separateur, $msgRecap);
}
return $this->messageRecapitulatif;
}
 
private function envoyerMessagesTesteur() {
if ($this->testeurCourriel != null) {
$messagerie = $this->conteneur->getMessagerie();
 
$sujet = "TESTEUR : récapitulatif envoies alertes commentaires";
$msgRecap = $this->obtenirMessageRecap();
$messagerie->envoyerTxt($this->testeurCourriel, $sujet, $msgRecap);
 
$message = $this->recapitulatifAdmin[array_rand($this->recapitulatifAdmin)];
$sujet = "TESTEUR : exemple message HTML - alerte commentaire";
$messagerie->envoyerHtml($this->testeurCourriel, $sujet, $message['html'], $message['txt']);
 
$sujet = "TESTEUR : exemple message TXT - alerte commentaire";
$messagerie->envoyerTxt($this->testeurCourriel, $sujet, $message['txt']);
}
}
 
private function obtenirInfosUtilisateurs() {
$idUtilisateurs = array_keys($this->recapitulatifAdmin);
$utilisateursIntitules = [];
foreach ($idUtilisateurs as $utilisateurId) {
$infosUtilisateur = $this->telechargerUtilisateurInfos($utilisateurId);
$intitule = $this->formaterUtilisateurInfos($infosUtilisateur);
$utilisateursIntitules[$utilisateurId] = $intitule;
}
asort($utilisateursIntitules);
return $utilisateursIntitules;
}
 
private function telechargerUtilisateurInfos($utilisateurId) {
if (! isset($this->utilisateursInfos[$utilisateurId])) {
$urlTpl = $this->conteneur->getParametre('url_service_utilisateur');
$url = sprintf($urlTpl, $utilisateurId);
$clientRest = $this->conteneur->getRestClient();
$json = $clientRest->consulter($url);
$infos = json_decode($json);
$this->utilisateursInfos[$utilisateurId] = isset($infos->id) ? $infos : $utilisateurId;
}
return $this->utilisateursInfos[$utilisateurId];
}
 
private function formaterUtilisateurInfos($infos) {
$utilisateurId = isset($infos->id) ? $infos->id : intval($infos);
if (isset($infos->courriel) && isset($infos->intitule)) {
$prenomNom = $infos->nom.' '.$infos->prenom;
$pseudo = empty($infos->pseudo) ? '' : '['.$infos->pseudo.'] ';
$courriel = $infos->courriel;
$intitule = "$prenomNom $pseudo($courriel) - id#$utilisateurId";
} else {
$intitule = "Utilisateur avec id $utilisateurId introuvable";
}
return $intitule;
}
}
/trunk/scripts/modules/commentaires/Commentaires.php
14,6 → 14,9
*/
class Commentaires extends DelScript {
 
protected $parametres_autorises = array(
'-t' => array(false, true, 'pour tester le script indiquer votre e-mail'));
 
public function executer() {
try {
$this->initialiserProjet('commentaires');
/trunk/scripts/modules/commentaires/squelettes/commentaires.tpl.txt
New file
0,0 → 1,24
Bonjour <?= $auteur_formate ?>,
Un Telabotaniste vient de proposer une nouvelle détermination ou de faire un commentaire concernant vos données :
 
<?php foreach ($liste_observations as $observation) : ?>
--> Observation #<?= $observation['id'] ?> - <<?= $observation['lien']; ?>>
* <?= $observation['nom_sci']; ?> observée le <?= $observation['date']; ?> à <?= $observation['lieu']; ?> *
<?php foreach ($observation['commentaires'] as $commentaire) : ?>
<?php if ($commentaire['nom_sel'] == '') : ?>
- <?= $commentaire['auteur'] ?> a écrit "<?= $commentaire['texte'] ?>"
<?php else : ?>
- <?= $commentaire['auteur'] ?> a proposé "<?= $commentaire['nom_sel'] ?>"<?php if ($commentaire['texte'] != '') : ?> et a écrit : "<?= $commentaire['texte'] ?>"<?php endif; ?>
 
<?php endif; ?>
<?php endforeach ; ?>
 
 
<?php endforeach ; ?>
 
Bonne continuation sur nos outils botaniques !
--
L'équipe de Tela Botanica
 
Ce message vous est envoyé par l'intermédiaire de l'application IdentiPlante du réseau Tela Botanica : http://www.tela-botanica.org/appli:identiplante
Si vous ne souhaitez plus recevoir ce courriel décochez la case dans vos préférences sur l'interface d'IdentiPlante.
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/trunk/scripts/modules/commentaires/squelettes/commentaires.tpl.html
54,40 → 54,39
</head>
<body>
<div>
<h1><span class="emphase">IdentiPlante</span> : un telabotaniste vous a aidé </h1>
<h1><span class="emphase">IdentiPlante</span> : un telabotaniste vous a aid&eacute; </h1>
</div>
<div class="description_message">
Bonjour <?= $auteur_formate ?>,<br />
Un Telabotaniste vient de proposer une nouvelle d&eacute;termination ou de faire un commentaire concernant vos données :<br />
<br />
</div>
 
<?php foreach ($liste_observations as $observation) : ?>
<span class="emphase">-&gt;</span> Un Telabotaniste vient de proposer une nouvelle détermination
ou de faire un commentaire concernant votre observation de
<?php $nom_ret = (trim($observation['nom_ret']) != '') ? $observation['nom_ret'] : 'Espèce indéterminée'; ?>
<h3>
<span class="emphase">--&gt;</span>
<a href="<?= $observation['lien']; ?>">
Observation <?= $observation['id_observation'] ?> - <em><?= $nom_ret; ?></em>
</a>
du <?= $observation['date']; ?> à <?= $observation['lieu']; ?>
observation <?= $observation['id'] ?> - <em><?= $observation['nom_sci']; ?></em>
</a>
observ&eacute; le <?= $observation['date']; ?> &agrave; <?= $observation['lieu']; ?>
</h3>
<?php foreach ($observation['commentaires'] as $commentaire) : ?>
<?php if ($commentaire['nom_sel'] == '') { ?>
<div class="commentaire">
- <?= $commentaire['auteur'] ?> a écrit <em>"<?= $commentaire['texte'] ?>"</em>
<?php if ($commentaire['nom_sel'] == '') : ?>
<div class="commentaire">
&nbsp;&nbsp;- <?= $commentaire['auteur'] ?> a &eacute;crit <em>"<?= $commentaire['texte'] ?>"</em>
</div>
<?php } else { ?>
<div class="proposition">
- <?= $commentaire['auteur'] ?> a proposé <em><?= $commentaire['nom_sel'] ?></em><br />
<?php else : ?>
<div class="proposition">
&nbsp;&nbsp;- <?= $commentaire['auteur'] ?> a propos&eacute; <em><?= $commentaire['nom_sel'] ?></em><br />
<?php if ($commentaire['texte'] != '') : ?>
et a écrit : <em>"<?= $commentaire['texte'] ?>"</em>
et a &eacute;crit : <em>"<?= $commentaire['texte'] ?>"</em>
<?php endif; ?>
</div>
<?php } ?>
<?php endif; ?>
<?php endforeach ; ?>
<br />
<?php endforeach ; ?>
 
Bonne continuation sur nos outils botaniques !<br />
L'&eacute;quipe de Tela Botanica<br />
<div>---------</div>
94,12 → 93,11
<br/>
<small>
Ce message vous est envoy&eacute; par l'interm&eacute;diaire de l'application IdentiPlante du r&eacute;seau Tela Botanica.
<a href="http://www.tela-botanica.org/eflore">http://www.tela-botanica.org/appli:identiplante </a>
<a href="http://www.tela-botanica.org/appli:identiplante">http://www.tela-botanica.org/appli:identiplante </a>
</small>
<br />
<small>
Si vous ne souhaitez plus recevoir ce mail d&eacute;cochez la case dans vos pr&eacute;f&eacute;rences
sur l'interface d'IdentiPlante.
Si vous ne souhaitez plus recevoir ce mail d&eacute;cochez la case dans vos pr&eacute;f&eacute;rences sur l'interface d'IdentiPlante.
</small>
</body>
</html>
/trunk/scripts/modules/adeterminer/Adeterminer.php
14,6 → 14,9
*/
class Adeterminer extends DelScript {
 
protected $parametres_autorises = array(
'-t' => array(false, true, 'pour tester le script indiquer votre e-mail'));
 
public function executer() {
try {
$this->initialiserProjet('adeterminer');
/trunk/scripts/modules/adeterminer/AlerteMailADeterminer.php
16,8 → 16,14
class AlerteMailADeterminer {
 
private $conteneur;
private $testeurCourriel = null;
private $recapitulatifAdmin = [];
private $messageRecapitulatif = null;
 
private $observations_concernees = array();
private $messageHtml = null;
private $messageTxt = null;
private $utilisateursInfos = array();
 
public function __construct($conteneur) {
$this->conteneur = $conteneur;
25,11 → 31,12
 
public function executer() {
try {
$this->verifierModeUtilisation();
$observations = $this->chargerObsADeterminer();
if (!empty($observations)) {
$this->formaterObservations($observations);
$message = $this->genererMessage();
$this->envoyerMessageAuxDestinataires($message);
$this->genererMessage();
$this->envoyerMessageAuxDestinataires();
}
} catch (Exception $e) {
$this->traiterErreur($e->getMessage());
36,6 → 43,18
}
}
 
private function verifierModeUtilisation() {
$testeurCourriel = $this->conteneur->getParametre('t');
if ($testeurCourriel) {
if (filter_var($testeurCourriel, FILTER_VALIDATE_EMAIL)) {
$this->testeurCourriel = $testeurCourriel;
} else {
$msg = "Veuillez indiquer une adresse de courriel valide à la suite du paramètre «-t».";
new Exception($msg);
}
}
}
 
protected function chargerObsADeterminer() {
//TODO: optimiser la requête si beaucoup de mails sont envoyés
$requete = "SELECT * ".
58,10 → 77,13
private function formaterObservations($liste_obs) {
foreach ($liste_obs as $obs) {
$id_obs = $obs['id_observation'];
$obs['date'] = $this->formaterDateObs($obs['date_observation']);
$obs['nom_propose'] = $this->formaterNomSci($obs);
$obs['lien'] = $this->obtenirLienFicheObs($id_obs);
$this->observations_concernees[$id_obs] = $obs;
$infos = array();
$infos['id'] = $id_obs;
$infos['date'] = $this->formaterDateObs($obs['date_observation']);
$infos['nom_propose'] = $this->formaterNomSci($obs);
$infos['lien'] = $this->obtenirLienFicheObs($id_obs);
$infos['lieu'] = $this->formaterLieu($obs);
$this->observations_concernees[$id_obs] = $infos;
}
}
 
75,7 → 97,7
}
 
private function formaterNomSci($obs) {
$nom = '';
$nom = 'Espèce indéterminée';
if ($obs['nom_ret'] != '') {
$nom = $obs['nom_ret'];
} else if($obs['nom_sel'] != '') {
88,30 → 110,76
return sprintf($this->conteneur->getParametre('url_fiche_observation'), $id_obs);
}
 
private function formaterLieu($obs) {
$lieuInfos = [];
$champsLieu = ['zone_geo', 'lieudit', 'station'];
foreach ($champsLieu as $champ) {
if (trim($obs[$champ]) == '') {
continue;
}
 
$lieuIntitule = $obs[$champ];
if ($champ == 'zone_geo') {
$codeDept = $this->convertirCodeZoneGeoVersDepartement($obs['ce_zone_geo']);
$lieuIntitule .= empty($codeDept) ? '' : " ($codeDept)";
}
$lieuInfos[] = $lieuIntitule;
}
$lieu = (count($lieuInfos) > 0) ? implode(' > ', $lieuInfos) : '(lieu inconnu)';
return $lieu;
}
 
private function convertirCodeZoneGeoVersDepartement($code_zone_geo) {
$code_departement = '';
if (preg_match('/^INSEE-C:([0-9]){2}[0-9]{3}$/', $code_zone_geo, $match)) {
$code_departement = $match[1];
}
return $code_departement;
}
 
private function genererMessage() {
$donnees = array();
$donnees['liste_observations'] = $this->observations_concernees;
$messageTpl = dirname(__FILE__).DS.'squelettes'.DS.'aDeterminer.tpl.html';
$squelettePhp = $this->conteneur->getSquelettePhp();
return $squelettePhp->analyser($messageTpl, $donnees);
if ($this->messageHtml == null && $this->messageTxt == null) {
$donnees = array();
$donnees['liste_observations'] = $this->observations_concernees;
 
$squelettePhp = $this->conteneur->getSquelettePhp();
$messageHtmlTpl = dirname(__FILE__).DS.'squelettes'.DS.'aDeterminer.tpl.html';
$this->messageHtml = $squelettePhp->analyser($messageHtmlTpl, $donnees);
$messageTxtTpl = dirname(__FILE__).DS.'squelettes'.DS.'aDeterminer.tpl.txt';
$this->messageTxt = $squelettePhp->analyser($messageTxtTpl, $donnees);
}
}
 
private function envoyerMessageAuxDestinataires($message) {
$this->envoyerMessageListeDetermination($message);
private function envoyerMessageAuxDestinataires() {
if ($this->testeurCourriel == null) {
$this->envoyerMessageAuxUtilisateurs();
$this->envoyerMessageListeDetermination();
$this->envoyerMessageRecap();
} else {
$this->envoyerMessageTesteur();
}
}
 
private function envoyerMessageAuxUtilisateurs() {
$utilisateurs = $this->obtenirDestinatairesMailsRecapitulatif();
foreach ($utilisateurs as $utilisateur) {
$this->envoyerMessage($message, $utilisateur['id_utilisateur']);
$this->envoyerMessage($utilisateur['id_utilisateur']);
}
}
 
private function obtenirDestinatairesMailsRecapitulatif() {
$preference = $this->conteneur->getBdd()->proteger('%"mail_notification_toutes_obs":"1"%');
$requete = "SELECT id_utilisateur ".
"FROM del_utilisateur_infos ".
"WHERE preferences LIKE $preference ";
$utilisateurs = $this->conteneur->getBdd()->recupererTous($requete);
return $utilisateurs;
if (count($this->recapitulatifAdmin) == 0) {
$preference = $this->conteneur->getBdd()->proteger('%"mail_notification_toutes_obs":"1"%');
$requete = "SELECT id_utilisateur ".
"FROM del_utilisateur_infos ".
"WHERE preferences LIKE $preference ";
$utilisateurs = $this->conteneur->getBdd()->recupererTous($requete);
 
foreach ($utilisateurs as $utilisateur) {
$this->recapitulatifAdmin[] = $utilisateur['id_utilisateur'];
}
}
return $this->recapitulatifAdmin;
}
 
/**
121,98 → 189,102
* @param string $message
* @param int $id_destinataire
*/
private function envoyerMessage($message, $id_destinataire) {
$url_requete = sprintf($this->conteneur->getParametre('url_service_messagerie'), $id_destinataire);
$post = array(
'sujet' => 'Récapitulatif des dernières observations à déterminer',
'message' => $message,
private function envoyerMessage($id_destinataire) {
$url = sprintf($this->conteneur->getParametre('url_service_messagerie'), $id_destinataire);
$donnees = array(
'utilisateur_courriel' => $this->conteneur->getParametre('adresse_expediteur_recapitulatif'),
'format' => 'html'
'format' => 'html',
'sujet' => $this->conteneur->getParametre('titre_message_recapitulatif_obs'),
'message' => $this->messageHtml,
'message_txt' => $this->messageTxt
);
 
$ch = curl_init();
$options = array(
CURLOPT_URL => $url_requete,
CURLOPT_HEADER => false,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $post,
CURLOPT_RETURNTRANSFER => true
);
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
$clientRest = $this->conteneur->getRestClient();
$clientRest->modifier($url, $donnees);
}
 
/** La liste détermination n'étant pas un membre de tela botanica,
* on lui envoie un message directement
* @param string $message contenu du mail
* @return boolean true ou false suivant le succès ou non de l'envoi
*/
private function envoyerMessageListeDetermination($message) {
$sujet = 'Récapitulatif des dernières observations à déterminer';
$message_html = $message;
$message_texte = $this->supprimerHtml($message);
private function envoyerMessageListeDetermination() {
$destinataires = $this->conteneur->getParametre('adresse_destinataire_recapitulatif_determination');
$sujet = $this->conteneur->getParametre('titre_message_recapitulatif_obs');
 
$limite = "_----------=_parties_".md5(uniqid (rand()));
$messagerie = $this->conteneur->getMessagerie();
$envoieStatut = $messagerie->envoyerHtml($destinataires, $sujet, $this->messageHtml, $this->messageTxt);
return $envoieStatut;
}
 
// Définition d'un mail en texte simple et html
$entetes = "X-Sender: <http://www.tela-botanica.org>\n".
"X-Mailer: PHP\n".
"X-auth-smtp-user: ".$this->conteneur->getParametre('adresse_expediteur_recapitulatif')." \n".
"X-abuse-contact: ".$this->conteneur->getParametre('adresse_expediteur_recapitulatif')." \n".
"Date: ".date("D, j M Y G:i:s O")."\n".
'From: '.$this->conteneur->getParametre('adresse_expediteur_recapitulatif')."\n".
// multipart/alternative signifie même contenu de la forme la plus simple à la plus complexe
"Content-Type: multipart/alternative; boundary=\"".$limite."\";\n\n";
private function envoyerMessageRecap() {
$msgRecap = $this->obtenirMessageRecap();
$sujet = "IdentiPlante : récapitulatif envoies alertes à déterminer";
$messagerie = $this->conteneur->getMessagerie();
$destinataire = $this->conteneur->getParametre('email_recap');
$messagerie->envoyerTxt($destinataire, $sujet, $msgRecap);
}
 
$contenu = // message en texte simple
"--".$limite."\n".
"Content-Type: text/plain; charset=\"".$this->conteneur->getParametre('encodage_appli')."\";\n".
"Content-Transfer-Encoding: 7bit;\n\n".
$message_texte."\n".
// le message en html est préféré s'il est lisible
"--".$limite."\n".
"Content-Type: text/html;".
"charset=\"".$this->conteneur->getParametre('encodage_appli')."\";\n".
"Content-Transfer-Encoding: 7bit;\n\n".
$message_html."\n".
"--".$limite."--\n";
private function obtenirMessageRecap() {
if ($this->messageRecapitulatif == null) {
$utilisateursIntitules = $this->obtenirInfosUtilisateurs();
$intituleRecap = implode("\n", $utilisateursIntitules);
$separateur = str_repeat('-', 50);
$msgTpl = "Messages envoyés aux utilisateurs suivant :\n%s\n%s\n%s";
$this->messageRecapitulatif = sprintf($msgTpl, $intituleRecap, $separateur, $this->messageTxt);
}
return $this->messageRecapitulatif;
}
 
$envoieStatut = mail(
$this->conteneur->getParametre('adresse_destinataire_recapitulatif_determination'),
$this->conteneur->getParametre('titre_message_recapitulatif_obs'),
$contenu,
$entetes
);
private function obtenirInfosUtilisateurs() {
$utilisateursIntitules = [];
$utilisateurs = $this->obtenirDestinatairesMailsRecapitulatif();
foreach ($utilisateurs as $utilisateurId) {
$infosUtilisateur = $this->telechargerUtilisateurInfos($utilisateurId);
$intitule = $this->formaterUtilisateurInfos($infosUtilisateur);
$utilisateursIntitules[$utilisateurId] = $intitule;
}
asort($utilisateursIntitules);
return $utilisateursIntitules;
}
 
return $envoieStatut;
private function telechargerUtilisateurInfos($utilisateurId) {
if (! isset($this->utilisateursInfos[$utilisateurId])) {
$urlTpl = $this->conteneur->getParametre('url_service_utilisateur');
$url = sprintf($urlTpl, $utilisateurId);
$clientRest = $this->conteneur->getRestClient();
$json = $clientRest->consulter($url);
$infos = json_decode($json);
$this->utilisateursInfos[$utilisateurId] = isset($infos->id) ? $infos : $utilisateurId;
}
return $this->utilisateursInfos[$utilisateurId];
}
 
/** 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);
$messageTxt = strip_tags($html);
return $messageTxt;
private function formaterUtilisateurInfos($infos) {
$utilisateurId = isset($infos->id) ? $infos->id : intval($infos);
if (isset($infos->courriel) && isset($infos->intitule)) {
$prenomNom = $infos->nom.' '.$infos->prenom;
$pseudo = empty($infos->pseudo) ? '' : '['.$infos->pseudo.'] ';
$courriel = $infos->courriel;
$intitule = "$prenomNom $pseudo($courriel) - id#$utilisateurId";
} else {
$intitule = "Utilisateur avec id $utilisateurId introuvable";
}
return $intitule;
}
 
/**
* 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) {
$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 )";
}
private function envoyerMessageTesteur() {
if ($this->testeurCourriel != null) {
$messagerie = $this->conteneur->getMessagerie();
 
$sujet = "TESTEUR : récapitulatif envoies alertes à déterminer";
$msgRecap = $this->obtenirMessageRecap();
$messagerie->envoyerTxt($this->testeurCourriel, $sujet, $msgRecap);
 
$sujet = "TESTEUR : exemple message HTML - alerte à déterminer";
$messagerie->envoyerHtml($this->testeurCourriel, $sujet, $this->messageHtml, $this->messageTxt);
 
$sujet = "TESTEUR : exemple message TXT - alerte à déterminer";
$messagerie->envoyerTxt($this->testeurCourriel, $sujet, $this->messageTxt);
}
$html = $dom->saveHtml();
return $html;
}
}
?>
}
/trunk/scripts/modules/adeterminer/squelettes/aDeterminer.tpl.html
54,23 → 54,22
</head>
<body>
<div>
<h1><span class="emphase">IdentiPlante</span> : Récapitulatif des observations à déterminer </h1>
<h1><span class="emphase">IdentiPlante</span> : R&eacute;capitulatif des observations &agrave; d&eacute;terminer </h1>
</div>
<div class="description_message">
Ce message récapitule l'ensemble des observations dont l'auteur a demandé confirmation ou détermination via
l'outil <a href="http://www.tela-botanica.org/appli:del" >Identiplante</a>
Ce message r&eacute;capitule l'ensemble des observations dont l'auteur a demand&eacute; confirmation ou d&eacute;termination via
l'outil <a href="http://www.tela-botanica.org/appli:identiplante" >Identiplante</a>
<br /><br />
</div>
 
<?php foreach($liste_observations as $observation) : ?>
<?php $nom_ret = (trim($observation['nom_propose']) != '') ? $observation['nom_propose'] : 'Espèce indéterminée'; ?>
<?php foreach ($liste_observations as $observation) : ?>
<h3>
<a href="<?= $observation['lien']; ?>">Observation <?= $observation['id_observation'] ?> - <em><?= $nom_ret; ?></em> </a>
observée le <?= $observation['date']; ?> à <?= $observation['zone_geo']; ?>
<a href="<?= $observation['lien']; ?>">Observation <?= $observation['id'] ?> - <em><?= $observation['nom_propose']; ?></em> </a>
observ&eacute;e le <?= $observation['date']; ?> &agrave; <?= $observation['lieu']; ?>
</h3>
<br />
<?php endforeach ; ?>
 
Bonne continuation sur nos outils botaniques !<br />
L'&eacute;quipe de Tela Botanica<br />
<div>---------</div>
77,11 → 76,11
<br/>
<small>
Ce message vous est envoy&eacute; par l'interm&eacute;diaire de l'application IdentiPlante du r&eacute;seau Tela Botanica.
<a href="http://www.tela-botanica.org/eflore">http://www.tela-botanica.org/appli:identiplante </a>
<a href="http://www.tela-botanica.org/appli:identiplante">http://www.tela-botanica.org/appli:identiplante </a>
</small>
<br />
<small>
Si vous ne souhaitez plus recevoir ce mail d&eacute;cochez la case dans vos pr&eacute;f&eacute;rences
Si vous ne souhaitez plus recevoir ce mail d&eacute;cochez la case dans vos pr&eacute;f&eacute;rences
sur l'interface d'IdentiPlante.
</small>
</body>
/trunk/scripts/modules/adeterminer/squelettes/aDeterminer.tpl.txt
New file
0,0 → 1,18
IdentiPlante : Récapitulatif des observations à déterminer
 
Ce message récapitule l'ensemble des observations dont l'auteur a demandé confirmation ou détermination via
l'outil IdentiPlante <http://www.tela-botanica.org/appli:identiplante>.
 
<?php foreach ($liste_observations as $observation) : ?>
--> Observation <?= $observation['id'] ?> - <<?= $observation['lien']; ?>>
<?= $observation['nom_propose']; ?> observée le <?= $observation['date']; ?> à <?= $observation['lieu']; ?>
 
 
<?php endforeach ; ?>
 
Bonne continuation sur nos outils botaniques !
--
L'équipe de Tela Botanica.
 
Ce message vous est envoyé par l'intermédiaire de l'application IdentiPlante du réseau Tela Botanica <http://www.tela-botanica.org/appli:identiplante>.
Si vous ne souhaitez plus recevoir ce mail décochez la case dans vos préférences sur l'interface d'IdentiPlante.
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/trunk/scripts/configurations/config.defaut.ini
58,15 → 58,23
url_fiche_observation = "http://www.tela-botanica.org/appli:identiplante#obs~%s";
 
; +------------------------------------------------------------------------------------------------------+
; Squelette d'Url du service de messagerie de l'annuaire à utiliser avec sprintf
url_service_messagerie = "http://www.tela-botanica.org/service:annuaire:Utilisateur/%s/message";
; Titre du message de récapitulatif d'identiplante
titre_message_recapitulatif = "Récapitulatif identiplante";
; TEMPLATES d'URL
; Squelette d'Url du service permettant de récupérer les infos d'un utilisateur (à utiliser avec sprintf)
url_service_utilisateur = "http://www.tela-botanica.org/service:annuaire:Utilisateur/%s";
; Squelette d'Url du service de messagerie de l'annuaire (à utiliser avec sprintf)
url_service_messagerie = "{ref:url_service_utilisateur}/message";
 
; +------------------------------------------------------------------------------------------------------+
; EMAILS
; Adresse de l'expéditeur des messages récapitulatifs
adresse_expediteur_recapitulatif = "identiplante-determination@tela-botanica.org"
; Courriels destinataire récapitulatif emails commentaires
email_recap = "contact-identiplante@tela-botanica.org"
; Adresse destinataire des messages récapitulatifs de détermination
; adresse_destinataire_recapitulatif_determination = "determination_plantes@tela-botanica.org"
adresse_destinataire_recapitulatif_determination = "test@tela-botanica.org"
adresse_destinataire_recapitulatif_determination = "determination_plantes@tela-botanica.org"
 
; Titre du message de récapitulatif d'identiplante
titre_message_recapitulatif = "Récapitulatif des derniers commentaires et propositions";
; titre du message de récapitulatif des obs à déterminer
titre_message_recapitulatif_obs = "Récapitulatif des dernières observations à déterminer"
 
/trunk/scripts/configurations
Property changes:
Modified: svn:ignore
config.ini
+config.ini.ini
/trunk/scripts/bibliotheque/Conteneur.php
93,5 → 93,14
}
return $this->partages['SquelettePhp'];
}
}
?>
 
/**
* Permet d'obtenir un objet RestClient.
*/
public function getMessagerie() {
if (!isset($this->partages['Messagerie'])) {
$this->partages['Messagerie'] = new Messagerie($this);
}
return $this->partages['Messagerie'];
}
}
/trunk/scripts/bibliotheque/Messagerie.php
New file
0,0 → 1,115
<?php
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);
}
$emailExpediteur = $this->conteneur->getParametre('adresse_expediteur_recapitulatif');
$encodage = $this->conteneur->getParametre('encodage_appli');
$dateHeure = date('D, j M Y G:i:s O');
$uid = md5(uniqid(rand()));
$limite = "_----------=_parties_$uid";
 
// 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>\n".
"X-Mailer: PHP-DEL-SCRIPTS\n".
"X-auth-smtp-user: $emailExpediteur\n".
"X-abuse-contact: $emailExpediteur\n".
"Date: $dateHeure\n".
"From: $emailExpediteur\n".
"Content-Type: multipart/alternative; boundary=\"$limite\";\n\n";
 
// le message en html est préféré s'il est lisible
$contenu =
"--$limite\n".
"Content-Type: text/plain; charset=\"$encodage\";\n".
"Content-Transfer-Encoding: 7bit;\n\n".
"$messageTxt\n".
"--$limite\n".
"Content-Type: text/html;".
"charset=\"$encodage\";\n".
"Content-Transfer-Encoding: 7bit;\n\n".
"$messageHtml\n".
"--".$limite."--\n";
 
$envoieStatut = $this->envoyer($destinataires, $entetes, $sujet, $contenu);
 
return $envoieStatut;
}
 
public function envoyerTxt($destinataires, $sujet, $messageTxt) {
$emailExpediteur = $this->conteneur->getParametre('adresse_expediteur_recapitulatif');
$dateHeure = date('D, j M Y G:i:s O');
 
// 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>\n".
"X-Mailer: PHP-DEL-SCRIPTS\n".
"X-auth-smtp-user: $emailExpediteur\n".
"X-abuse-contact: $emailExpediteur\n".
"Date: $dateHeure\n".
"From: $emailExpediteur\n".
"Content-Type: text/plain; charset=UTF-8\n";
 
// le message en html est préféré s'il est lisible
$contenu = "$messageTxt\n";
 
$envoieStatut = $this->envoyer($destinataires, $entetes, $sujet, $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;
}
}
/trunk/scripts
Property changes:
Modified: svn:mergeinfo
Merged /branches/v1.2-lithium:r1709-1736
Merged /branches/v1.2-lithium/scripts:r1683-1736