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>