/trunk/scripts/modules/commentaires/AlerteMailCommentaires.php |
---|
New file |
0,0 → 1,152 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Le script récupère tous les commentaires et déterminations fait ce jour et envoie un mail |
* aux auteurs des observations récapitulant celle-ci |
* |
* @category php 5.2 |
* @package del |
* @subpackage scripts |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @copyright Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
class AlerteMailCommentaires { |
private $parametres; |
private $conteneur; |
private $observations_concernees = array(); |
private $id_observation_commentees = array(); |
private $correspondance_id_obs_auteurs = array(); |
public function __construct($parametres, $conteneur) { |
$this->parametres = $parametres; |
$this->conteneur = $conteneur; |
} |
public function executer() { |
try { |
$observations = $this->chargerObservationsCommentees(); |
$this->formaterObservations($observations); |
$commentaires = $this->chargerCommentairesAjourdhui(); |
$this->formaterCommentaires($commentaires); |
$this->parcourirListeCommentairesEtEnvoyerMessage($this->observations_concernees); |
} catch (Exception $e) { |
$this->traiterErreur($e->getMessage()); |
} |
} |
protected function chargerCommentairesAjourdhui() { |
//TODO: optimiser la requête si beaucoup de mails sont envoyés |
$requete = "SELECT * ". |
"FROM del_commentaire dc ". |
"WHERE dc.ce_observation != '0' ". |
"AND dc.id_commentaire NOT IN ". |
"( ". |
" SELECT dc.id_commentaire ". |
" FROM del_commentaire dc, del_observation dob". |
" WHERE dc.nom_sel = dob.nom_sel ". |
" AND dc.ce_utilisateur = dob.ce_utilisateur ". |
" AND dc.ce_observation = dob.id_observation ". |
") ". |
"AND DATE_FORMAT( dc.date, '%Y-%m-%d' ) = CURDATE()". |
"ORDER BY dc.ce_observation"; |
$commentaires = $this->conteneur->getBdd()->recupererTous($requete); |
return $commentaires; |
} |
protected function chargerObservationsCommentees() { |
//TODO: optimiser la requête si beaucoup de mails sont envoyés |
$requete = "SELECT * FROM del_observation do ". |
"WHERE do.id_observation IN ". |
"( ". |
"SELECT dc.ce_observation ". |
"FROM del_commentaire dc ". |
"WHERE dc.ce_observation != '0' ". |
"AND dc.id_commentaire NOT IN ". |
"( ". |
" SELECT dc.id_commentaire ". |
" FROM del_commentaire dc, del_observation dob". |
" WHERE dc.nom_sel = dob.nom_sel ". |
" AND dc.ce_utilisateur = dob.ce_utilisateur ". |
" AND dc.ce_observation = dob.id_observation ". |
") ". |
"AND DATE_FORMAT( dc.date, '%Y-%m-%d' ) = CURDATE()". |
") ". |
"ORDER BY do.ce_utilisateur, do.id_observation "; |
$observations = $this->conteneur->getBdd()->recupererTous($requete); |
return $observations; |
} |
protected 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']); |
$this->correspondance_id_obs_auteurs[$id_obs] = $auteur_obs; |
$this->observations_concernees[$auteur_obs][$id_obs] = $obs; |
} |
} |
protected function formaterCommentaires($liste_commentaires) { |
$liste_commentaires_formatee = array(); |
foreach ($liste_commentaires as $commentaire) { |
$id_obs = $commentaire['ce_observation']; |
$auteur_obs = $this->correspondance_id_obs_auteurs[$commentaire['ce_observation']]; |
$commentaire['auteur'] = $this->formaterAuteur($commentaire); |
$this->observations_concernees[$auteur_obs][$id_obs]['commentaires'][] = $commentaire; |
} |
} |
protected function parcourirListeCommentairesEtEnvoyerMessage($liste_obs_a_auteur) { |
foreach ($liste_obs_a_auteur as $auteur => $liste_obs) { |
$message = $this->formaterMessagePourAuteur($liste_obs,$auteur); |
$this->envoyerMessage($message, $auteur); |
} |
} |
private function formaterMessagePourAuteur($liste_obs, $auteur) { |
$donnees = array(); |
$donnees['liste_observations'] = $liste_obs; |
$donnees['auteur'] = $auteur; |
$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR; |
return $this->conteneur->traiterSquelettePhp($this->squelette_dossier.'commentaires.tpl.html', $donnees); |
} |
protected function formaterDateObs($date) { |
$time = strtotime($date); |
return date('d/m/Y', $time); |
} |
private function formaterAuteur($commentaire) { |
return $commentaire['utilisateur_prenom'].' '.$commentaire['utilisateur_nom']; |
} |
protected function envoyerMessage($message, $auteur) { |
$url_requete = $this->conteneur->formaterUrl(Config::get('url_service_messagerie'), array('id' => $auteur)); |
$post = array( |
'sujet' => Config::get('titre_message_recapitulatif'), |
'message' => $message, |
'utilisateur_courriel' => Config::get('adresse_expediteur_recapitulatif'), |
'format' => 'html' |
); |
$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); |
$envoi = curl_exec($ch); |
curl_close($ch); |
} |
} |
?> |
/trunk/scripts/modules/commentaires/Commentaires.php |
---|
New file |
0,0 → 1,41 |
<?php |
//declare(encoding='UTF-8'); |
/** |
* Exemple de lancement du script : : |
* /opt/lampp/bin/php cli.php coste -a chargerTous |
* |
* @category php 5.2 |
* @package eFlore/Scripts |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
class Commentaires extends DelScript { |
public function executer() { |
try { |
$this->initialiserProjet('commentaires'); |
// Lancement de l'action demandée |
$cmd = $this->getParametre('a'); |
switch ($cmd) { |
case 'alerteMail' : |
$script = $this->chargerClasse('AlerteMailCommentaires'); |
$script->executer(); |
break; |
default : |
throw new Exception("Erreur : la commande '$cmd' n'existe pas!"); |
} |
} catch (Exception $e) { |
$this->traiterErreur($e->getMessage()); |
} |
} |
private function chargerClasse($classe) { |
require_once $classe.'.php'; |
return new $classe($this->parametres, $this); |
} |
} |
?> |
/trunk/scripts/modules/commentaires/squelettes/commentaires.tpl.html |
---|
New file |
0,0 → 1,106 |
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
<html> |
<head> |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
<style type="text/css"> |
<!-- |
body { |
font-family: Arial,Helvetica,Verdana,sans-serif; |
font-size: 14px; |
} |
h1 > a { |
color:#fd8c13; |
} |
h3 { |
font-size:14px; |
color:#454341 !important; |
margin:0px; |
} |
h3 > a { |
color:#454341; |
} |
h1 a, h3 a, h4 a { |
color: inherit; |
border-bottom: dotted 1px; |
} |
h3 a { |
border-color:#CCCCCC; |
} |
a { |
color:#598000; |
text-decoration:none; |
border-bottom:1px dotted #95ae5d; |
} |
a:hover { |
color:#FD8C13; |
border-bottom:1px dotted #95ae5d; |
} |
.lire-suite { |
padding-left:10px; |
background:url(http://www.tela-botanica.org/sites/commun/generique/images/graphisme/petit_carre.png) no-repeat 0px 4px; |
} |
#titre { |
background: none repeat scroll 0 0 #9AC343; |
opacity: 0.9; |
position: relative; |
text-align: center; |
width: 100%; |
} |
#titre h1 { |
background: url("http://www.tela-botanica.org/eflore-test/del/img/identiplante_mini.png") no-repeat scroll 150px 7px transparent; |
color: #777777; |
font-size: 2em; |
font-weight: bold; |
margin: 0 0 0; |
padding: 18px 60px; |
text-align: center; |
width: 100%; |
} |
.description_message { |
color: #333333; |
font-size: 1.1em; |
font-style: italic; |
padding-top: 10px; |
} |
--> |
</style> |
</head> |
<body> |
<div id="titre"> |
<h1>IdentiPlante - Récapitulatif de vos observations </h1> |
</div> |
<div class="description_message"> |
Ce message récapitule l'ensemble des déterminations et commentaires réalisés aujourd'hui sur vos observations via |
l'outil <a href="http://www.tela-botanica.org/appli:del" >Identiplante</a> |
<br /><br /> |
</div> |
<?php foreach($liste_observations as $observation) : ?> |
<?php $nom_ret = (trim($observation['nom_ret']) != '') ? $observation['nom_ret'] : 'Espèce indéterminée'; ?> |
<h3>Observation <?= $observation['id_observation'] ?> - <em><?= $nom_ret; ?></em> |
observée le <?= $observation['date']; ?> à <?= $observation['zone_geo']; ?></h3> |
<?php foreach($observation['commentaires'] as $commentaire) : ?> |
<?php if($commentaire['nom_sel'] == '') { ?> |
<div class="commentaire"> |
- <?= $commentaire['auteur'] ?> a écrit <em>"<?= $commentaire['texte'] ?>"</em> |
</div> |
<?php } else { ?> |
<div class="proposition"> |
- <?= $commentaire['auteur'] ?> a proposé <em><?= $commentaire['nom_sel'] ?></em><br /> |
<?php if($commentaire['texte'] != '') { ?> |
et a écrit : <em>"<?= $commentaire['texte'] ?>"</em> |
<?php } ?> |
</div> |
<?php } ?> |
<?php endforeach ; ?> |
<br /> |
<?php endforeach ; ?> |
</body> |
</html> |
/trunk/scripts/configurations/config.ini |
---|
New file |
0,0 → 1,64 |
; Encodage : UTF-8 |
; +------------------------------------------------------------------------------------------------------+ |
; URLs |
; Le séparateur utilisé par le framework lorsqu'il génère des URL pour séparer les arguments. |
; Pour remettre les valeurs par défaut, utitliser : "php:ini_get('arg_separator.output')" |
url_arg_separateur_sortie = "&" |
; +------------------------------------------------------------------------------------------------------+ |
; Info sur l'application |
info.nom = Scripts d'identiplante |
; Abréviation de l'application |
info.abr = del-services |
; Version du Framework nécessaire au fonctionnement de cette application |
info.framework.version = 0.3 |
;Encodage de l'application |
encodage_appli = "UTF-8" |
; +------------------------------------------------------------------------------------------------------+ |
; Débogage |
; Indique si oui ou non on veut afficher le débogage. |
debogage = true |
; Indique sous quelle forme les méssages de débogage doivent s'afficher : |
; - "php:Debug::MODE_ECHO" : le message est affiché en utilisant echo |
; - "php:Debug::MODE_NOTICE" : le message est affiché en utilisant une erreur de type notice |
; - "php:Debug::MODE_ENTETE_HTTP" : les messages sont envoyés dans un entête HTTP "X_REST_DEBOGAGE". |
; - "Autre valeur" : les messages sont formatés puis retournés par la méthode de débogage utilisée. |
debogage_mode = "php:Debug::MODE_ECHO" |
; Indique si oui ou non on veut lancer le chronométrage |
chronometrage = false |
; +------------------------------------------------------------------------------------------------------+ |
; Paramètrage de la base de données. |
; Abstraction de la base de données. |
bdd_abstraction = pdo |
; Protocole de la base de données. |
bdd_protocole = mysql |
; Nom du serveur de bases de données. |
bdd_serveur = localhost |
; Nom de l'utilisateur de la base de données. |
bdd_utilisateur = "root" |
; Mot de passe de l'utilisateur de la base de données. |
bdd_mot_de_passe = "Canard123$" |
; Nom de la base de données principale. |
bdd_nom = "del" |
; Encodage de la base de données principale au format base de données (ex. pour l'utf-8 ne pas mettre le tiret!). |
bdd_encodage = "utf8" |
; +------------------------------------------------------------------------------------------------------+ |
; Version des service web du projet |
service_version = 0.1 |
; Standard utilisé pour les codes de langue |
langue_source = "ISO-639-1"; |
; Standard utilisé pour les codes de zones géographiques |
zone_geo_source = "ISO-3166-1"; |
; +------------------------------------------------------------------------------------------------------+ |
; Url du service de messagerie de l'annuaire |
url_service_messagerie = "http://www.tela-botanica.org/client/annuaire_nouveau/actuelle/jrest/Utilisateur/{id}/message"; |
; Titre du message de récapitulatif d'identiplante |
titre_message_recapitulatif = "Récapitulatif identiplante"; |
; Adresse de l'expéditeur des messages récapitulatifs |
adresse_expediteur_recapitulatif = "identiplante@tela-botanica.org" |
/trunk/scripts/configurations/config.defaut.ini |
---|
New file |
0,0 → 1,62 |
; Encodage : UTF-8 |
; +------------------------------------------------------------------------------------------------------+ |
; URLs |
; Le séparateur utilisé par le framework lorsqu'il génère des URL pour séparer les arguments. |
; Pour remettre les valeurs par défaut, utitliser : "php:ini_get('arg_separator.output')" |
url_arg_separateur_sortie = "&" |
; +------------------------------------------------------------------------------------------------------+ |
; Info sur l'application |
info.nom = Scripts d'identiplante |
; Abréviation de l'application |
info.abr = del-services |
; Version du Framework nécessaire au fonctionnement de cette application |
info.framework.version = 0.3 |
;Encodage de l'application |
encodage_appli = "UTF-8" |
; +------------------------------------------------------------------------------------------------------+ |
; Débogage |
; Indique si oui ou non on veut afficher le débogage. |
debogage = true |
; Indique sous quelle forme les méssages de débogage doivent s'afficher : |
; - "php:Debug::MODE_ECHO" : le message est affiché en utilisant echo |
; - "php:Debug::MODE_NOTICE" : le message est affiché en utilisant une erreur de type notice |
; - "php:Debug::MODE_ENTETE_HTTP" : les messages sont envoyés dans un entête HTTP "X_REST_DEBOGAGE". |
; - "Autre valeur" : les messages sont formatés puis retournés par la méthode de débogage utilisée. |
debogage_mode = "php:Debug::MODE_ECHO" |
; Indique si oui ou non on veut lancer le chronométrage |
chronometrage = false |
; +------------------------------------------------------------------------------------------------------+ |
; Paramètrage de la base de données. |
; Abstraction de la base de données. |
bdd_abstraction = pdo |
; Protocole de la base de données. |
bdd_protocole = mysql |
; Nom du serveur de bases de données. |
bdd_serveur = localhost |
; Nom de l'utilisateur de la base de données. |
bdd_utilisateur = "" |
; Mot de passe de l'utilisateur de la base de données. |
bdd_mot_de_passe = "" |
; Nom de la base de données principale. |
bdd_nom = "del" |
; Encodage de la base de données principale au format base de données (ex. pour l'utf-8 ne pas mettre le tiret!). |
bdd_encodage = "utf8" |
; +------------------------------------------------------------------------------------------------------+ |
; Standard utilisé pour les codes de langue |
langue_source = "ISO-639-1"; |
; Standard utilisé pour les codes de zones géographiques |
zone_geo_source = "ISO-3166-1"; |
; +------------------------------------------------------------------------------------------------------+ |
; Url du service de messagerie de l'annuaire |
url_service_messagerie = "http://www.tela-botanica.org/client/annuaire_nouveau/actuelle/jrest/Utilisateur/{id}/message"; |
; Titre du message de récapitulatif d'identiplante |
titre_message_recapitulatif = "Récapitulatif identiplante"; |
; Adresse de l'expéditeur des messages récapitulatifs |
adresse_expediteur_recapitulatif = "identiplante@tela-botanica.org" |
/trunk/scripts/framework.defaut.php |
---|
New file |
0,0 → 1,6 |
<?php |
// Inclusion du Framework |
// Renomer ce fichier en "framework.php" |
// Indiquer ci-dessous le chemin absolu vers le fichier autoload.inc.php de la bonne version du Framework |
require_once '/home/www/commun/framework/0.3/Framework.php'; |
?> |
/trunk/scripts/bibliotheque/DelScript.php |
---|
New file |
0,0 → 1,117 |
<?php |
/** |
* Classe mère des scripts del |
* |
* @category php 5.2 |
* @package del |
* @subpackage scripts |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @copyright Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
abstract class DelScript extends Script { |
private $Bdd = null; |
private $projetNom = null; |
public function getProjetNom() { |
return $this->projetNom; |
} |
protected function initialiserProjet($projetNom) { |
$this->projetNom = $projetNom; |
} |
//+------------------------------------------------------------------------------------------------------+ |
// Méthodes d'url |
/** |
* Formate une url à partir d'un template contenant des paramètres à remplacer sous la forme {monParametre}. |
* Le tableau associatif de paramètres doit contenir en clé le paramêtre (monParametre) sans les accolades, |
* la valeur correspondante sera la valeur de remplacement. |
* Par défaut, les parametres suivant sont pris en compte par cette méthode : |
* - {projet} : le code du référentiel courrant ou définit dans le constructeur de l'objet métier. |
* |
* @param String $tpl le squelette d'url à formater. |
* @param Array $parametres le tableau de parametres (sans accolades pour les clés).*/ |
public function formaterUrl($tpl, Array $parametres) { |
foreach($parametres as $key=> $value) { |
$tpl = str_replace('{'.$key.'}',rawurlencode($value),$tpl); |
} |
return $tpl; |
} |
//+------------------------------------------------------------------------------------------------------+ |
// Méthodes d'accès aux objets du Framework |
/** |
* Méthode de connection à la base de données sur demande. |
* Tous les scripts n'ont pas besoin de s'y connecter. |
*/ |
public function getBdd() { |
if (! isset($this->Bdd)) { |
$this->Bdd = new Bdd(); |
} |
return $this->Bdd; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION DES SQUELETTES PHP |
/** |
* Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données, |
* en extrait les variables, charge le squelette et retourne le résultat des deux combinés. |
* |
* @param String $fichier le chemin du fichier du squelette |
* @param Array $donnees un tableau associatif contenant les variables a injecter dans le squelette. |
* |
* @return boolean false si le squelette n'existe pas, sinon la chaine résultat. |
*/ |
public function traiterSquelettePhp($fichier, Array $donnees = array()) { |
$sortie = false; |
if (file_exists($fichier)) { |
// Extraction des variables du tableau de données |
extract($donnees); |
// Démarage de la bufferisation de sortie |
ob_start(); |
// Si les tags courts sont activés |
if ((bool) @ini_get('short_open_tag') === true) { |
// Simple inclusion du squelette |
include $fichier; |
} else { |
// Sinon, remplacement des tags courts par la syntaxe classique avec echo |
$html_et_code_php = self::traiterTagsCourts($fichier); |
// Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval |
$html_et_code_php = '?>'.$html_et_code_php; |
// Interprétation du html et du php dans le buffer |
echo eval($html_et_code_php); |
} |
// Récupèration du contenu du buffer |
$sortie = ob_get_contents(); |
// Suppression du buffer |
@ob_end_clean(); |
} else { |
$msg = "Le fichier du squelette '$fichier' n'existe pas."; |
trigger_error($msg, E_USER_WARNING); |
} |
// Retourne le contenu |
return $sortie; |
} |
/** |
* Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo. |
* |
* @param String $chemin_squelette le chemin du fichier du squelette |
* |
* @return string le contenu du fichier du squelette php avec les tags courts remplacés. |
*/ |
private function traiterTagsCourts($chemin_squelette) { |
$contenu = file_get_contents($chemin_squelette); |
// Remplacement de tags courts par un tag long avec echo |
$contenu = str_replace('<?=', '<?php echo ', $contenu); |
// Ajout systématique d'un point virgule avant la fermeture php |
$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu); |
return $contenu; |
} |
} |
?> |
/trunk/scripts/cli.php |
---|
New file |
0,0 → 1,37 |
<?php |
// Encodage : UTF-8 |
// +-------------------------------------------------------------------------------------------------------------------+ |
/** |
* Initialise le chargement et l'exécution des scripts |
* |
* Lancer ce fichier en ligne de commande avec : |
* <code>/opt/lampp/bin/php cli.php mon_script -a test</code> |
* |
//Auteur original : |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @author Delphine CAUQUIL <delphine@tela-botanica.org> |
* @copyright Tela-Botanica 1999-2008 |
* @licence GPL v3 & CeCILL v2 |
* @version $Id$ |
*/ |
// +-------------------------------------------------------------------------------------------------------------------+ |
// Le fichier Framework.php du Framework de Tela Botanica doit être appelée avant tout autre chose dans l'application. |
// Sinon, rien ne sera chargé. |
// Chemin du fichier chargeant le framework requis |
$framework = dirname(__FILE__).DIRECTORY_SEPARATOR.'framework.php'; |
if (!file_exists($framework)) { |
$e = "Veuillez paramétrer l'emplacement et la version du Framework dans le fichier $framework"; |
trigger_error($e, E_USER_ERROR); |
} else { |
// Inclusion du Framework |
require_once $framework; |
// Ajout d'information concernant cette application |
Framework::setCheminAppli(__FILE__);// Obligatoire |
Framework::setInfoAppli(Config::get('info')); |
// Initialisation et lancement du script appelé en ligne de commande |
Cli::executer(); |
} |
?> |
/trunk/scripts/framework.php |
---|
New file |
0,0 → 1,6 |
<?php |
// Inclusion du Framework |
// Renomer ce fichier en "framework.php" |
// Indiquer ci-dessous le chemin absolu vers le fichier autoload.inc.php de la bonne version du Framework |
require_once '/home/aurelien/web/framework-0.3/framework/Framework.php'; |
?> |