/trunk/widget/modules/rapporterreur/RapportErreur.php |
---|
New file |
0,0 → 1,148 |
<?php |
/** |
* Formulaire de rapport d'erreur assisté |
* |
* @author Mathias Chouet <mathias@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version 0.1 |
* @copyright 2014, Tela Botanica (accueil@tela-botanica.org) |
*/ |
class RapportErreur extends WidgetCommun { |
const DS = DIRECTORY_SEPARATOR; |
private static $emailsAutorises = array( |
'eflore_remarques@tela-botanica.org', |
'pictoflora_remarques@tela-botanica.org', |
'identiplante_remarques@tela-botanica.org', |
'cel_remarques@tela-botanica.org', |
'coel_remarques@tela-botanica.org', |
'webmestre@tela-botanica.org', |
'mathias@tela-botanica.org' |
); |
protected $cheminLog; |
protected $pageSource; |
protected $emailDestination; |
protected $action; |
protected $description; |
protected $gravite; |
protected $navigateur; |
protected $systeme; |
protected $coordonnees; |
public function __construct($config, $parametres) { |
parent::__construct($config, $parametres); |
$this->pageSource = 'inconnue'; |
$this->emailDestination = 'webmestre@tela-botanica.org'; |
$this->action = null; |
$this->description = null; |
$this->gravite = null; |
$this->navigateur = null; |
$this->systeme = null; |
$this->coordonnees = null; |
$this->cheminLog = $this->config['rapport_erreur']['cheminFichierLog']; |
} |
/** |
* Méthode appelée par défaut pour charger ce widget |
*/ |
public function executer() { |
$this->collecterParametres(); |
$squelette = dirname(__FILE__) . self::DS . 'squelettes' . self::DS . 'rapportErreur.tpl.php'; |
$widget['donnees']['url_css'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], 'modules/rapporterreur/squelettes/css/defaut.css'); |
$widget['donnees']['email'] = $this->emailDestination; |
$widget['donnees']['page'] = $this->pageSource; |
$widget['donnees']['envoye'] = false; |
if ($this->action === 'envoyer') { |
$widget['donnees']['envoye'] = true; |
// 1) entrée dans le log |
try { |
$this->log(); |
} catch (Exception $e) { |
echo "Erreur lors de la création de l'entrée dans le fichier log<br/>"; |
} |
// 2) email |
try { |
$this->email(); |
} catch (Exception $e) { |
echo "Erreur lors de l'envoi de l'email<br/>"; |
} |
} |
$contenu = $this->traiterSquelettePhp($squelette, $widget['donnees']); |
$this->envoyer($contenu); |
} |
// paramètres du widget en GET et du formulaire en POST |
protected function collecterParametres() { |
if (isset($_GET['pageSource']) && $_GET['pageSource'] != '') { |
$this->pageSource = $_GET['pageSource']; |
} |
if (isset($_GET['email']) && in_array($_GET['email'], self::$emailsAutorises)) { |
$this->emailDestination = $_GET['email']; |
} |
if (isset($_POST['action']) && $_POST['action'] != '') { |
$this->action = $_POST['action']; |
} |
// contenu du formulaire |
if (isset($_POST['description']) && $_POST['description'] != '') { |
$this->description = $_POST['description']; |
} |
if (isset($_POST['gravite']) && $_POST['gravite'] != '') { |
$this->gravite = $_POST['gravite']; |
} |
if (isset($_POST['navigateur']) && $_POST['navigateur'] != '') { |
$this->navigateur = $_POST['navigateur']; |
} |
if (isset($_POST['systeme']) && $_POST['systeme'] != '') { |
$this->systeme = $_POST['systeme']; |
} |
if (isset($_POST['coordonnees']) && $_POST['coordonnees'] != '') { |
$this->coordonnees = $_POST['coordonnees']; |
} |
} |
// ajoute une entrée au log |
protected function log() { |
$contenu = ''; |
$contenu .= date("Y-m-d h:i:s") . "\n"; |
$contenu .= "Pour: " . $this->emailDestination . "\n"; |
$contenu .= "Page: " . $this->pageSource . "\n"; |
$contenu .= "Coordonnées: " . $this->coordonnees . "\n"; |
$contenu .= "Gravité: " . $this->gravite . "\n"; |
$contenu .= "Navigateur: " . $this->navigateur . "\n"; |
$contenu .= "Système: " . $this->systeme . "\n"; |
$contenu .= "Description:\n " . str_replace("\n", "\n ", $this->description); |
$contenu .= "\n\n-----------------------------------------------------------------------\n\n"; |
file_put_contents($this->cheminLog, $contenu, FILE_APPEND); |
} |
// envoie un email |
protected function email() { |
$contenu = ''; |
$contenu .= date("Y-m-d h:i:s") . "\n"; |
$contenu .= "Pour: " . $this->emailDestination . "\n"; |
$contenu .= "Page: " . $this->pageSource . "\n"; |
$contenu .= "Coordonnées: " . $this->coordonnees . "\n"; |
$contenu .= "Gravité: " . $this->gravite . "\n"; |
$contenu .= "Navigateur: " . $this->navigateur . "\n"; |
$contenu .= "Système: " . $this->systeme . "\n"; |
$contenu .= "Description:\n " . str_replace("\n", "\n ", $this->description); |
$sujet = "[Rapport d'erreur] - " . substr($this->description, 0, 25) . |
"..." . " (" . ($this->coordonnees == '' ? 'inconnu' : $this->coordonnees) . ")"; |
// mode charlot - mais y a rien dans le framework pour faire mieux |
mail($this->emailDestination, $sujet, $contenu); |
} |
} |
?> |
/trunk/widget/modules/rapporterreur/config.defaut.ini |
---|
New file |
0,0 → 1,3 |
[rapport_erreur] |
; Chemin du fichier de log à écrire |
cheminFichierLog = "/home/log/rapportErreur.log" |
/trunk/widget/modules/rapporterreur/squelettes/css/defaut.css |
---|
New file |
0,0 → 1,13 |
body { |
padding: 10px; |
} |
#widget { |
margin: auto; |
max-width: 700px; |
padding: 5px; |
} |
textarea.form-control.haut { |
height: 150px; |
} |
/trunk/widget/modules/rapporterreur/squelettes/rapportErreur.tpl.php |
---|
New file |
0,0 → 1,113 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
<html xmlns="http://www.w3.org/1999/xhtml"> |
<head> |
<title>Signaler une erreur</title> |
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/> |
<meta http-equiv="Content-style-type" content="text/css" /> |
<meta http-equiv="Content-script-type" content="text/javascript" /> |
<meta http-equiv="Content-language" content="fr" /> |
<meta name="revisit-after" content="15 days" /> |
<meta name="robots" content="index,follow" /> |
<meta name="author" content="Mathias Chouet" /> |
<meta name="keywords" content="Tela Botanica, rapport, erreur, bug" /> |
<meta name="description" content="Widget de rapport d'erreur" /> |
<meta name="viewport" content="width=device-width, initial-scale=1"> |
<link rel="stylesheet" type="text/css" href="<?=$url_css?>" media="screen" /> |
<link rel="stylesheet" type="text/css" href="http://www.tela-botanica.org/commun/bootstrap/3.1.0/css/bootstrap.min.css"></script> |
<script src="http://www.tela-botanica.org/commun/jquery/1.9.1/jquery-1.9.1.min.js"></script> |
<script src="http://www.tela-botanica.org/commun/bootstrap/3.1.0/js/bootstrap.min.js"></script> |
</head> |
<body> |
<!-- WIDGET:reseau:rapportErreur - DEBUT --> |
<div id="widget"> |
<?php if ($envoye === true): ?> |
<h1>Tela Botanica - Message envoyé !</h1> |
<p class="alert alert-info"> |
Un message a été envoyé à <strong><?= $email ?></strong> |
<br/> |
Merci d'avoir pris le temps de signaler une erreur ! |
</p> |
<a class="btn btn-default" href="">Signaler une autre erreur</a> |
<button class="btn btn-default fermer">Fermer cette fenêtre</button> |
<?php else: ?> |
<h1>Tela Botanica - Signaler une erreur</h1> |
<p class="alert alert-info"> |
Merci de prendre quelques instants pour remplir ce formulaire. |
Lorsque vous l'aurez validé, un message sera automatiquement |
envoyé à <strong><?= $email ?></strong> |
</p> |
<form role="form" action="" method="post"> |
<!-- <div class="form-group"> |
<div class="control"> |
<label>Page d'origine</label> |
<input name="annee" class="form-control" type="text" disabled="disabled" value="<?= $page ?>"/> |
</div> |
</div> --> |
<div class="form-group"> |
<div class="control"> |
<label>Vos coordonnées</label> |
<input name="coordonnees" class="form-control" |
placeholder="jean.durand@laposte.net" /> |
</div> |
<p class="help-block">Si vous souhaitez recevoir une réponse, indiquez votre adresse email (facultatif).</p> |
</div> |
<div class="form-group"> |
<div class="control"> |
<label>Description du problème</label> |
<textarea name="description" class="form-control haut" type="text"></textarea> |
</div> |
<p class="help-block"> |
Expliquez ce que vous aviez l'intention de faire, le problème que vous avez rencontré et les étapes |
qui vous y ont amené, avec autant de détails que possible. |
</p> |
</div> |
<div class="form-group"> |
<div class="control"> |
<label>Navigateur(s) utilisé(s)</label> |
<input name="navigateur" class="form-control" |
placeholder="Exemples: Firefox 26, Chrome 24, Internet Explorer 11, Safari 5, Opera 10..." /> |
</div> |
<p class="help-block"> |
Avec quel logiciel naviguez-vous sur Tela Botanica ? Précisez le nom et la version si possible. |
</p> |
</div> |
<div class="form-group"> |
<div class="control"> |
<label>Système d'exploitation</label> |
<input name="systeme" class="form-control" |
placeholder="Exemples: Windows 8, Windows XP, Mac OSX 10.5, Ubuntu, Androïd, iOS..." /> |
</div> |
<p class="help-block">Quel est le système d'exploitation de votre ordinateur / tablette / téléphone ?</p> |
</div> |
<div class="form-group"> |
<div class="control"> |
<label>Gravité de l'erreur</label> |
<select name="gravite" class="form-control"> |
<option value="inconnue">Je ne sais pas</option> |
<option value="legere">Légère : l'application fonctionne encore (affichage incorrect, message gênant...)</option> |
<option value="moyenne">Moyenne : tout ou partie de l'application peut encore être utilisé, mais avec des difficultés</option> |
<option value="grave">Grave : l'application ou une de ses fonctionnalités indispensables ne fonctionne plus</option> |
</select> |
</div> |
<p class="help-block"> |
Estimez si vous le pouvez la gravité du problème que vous rencontrez. |
</p> |
</div> |
<input name="action" value="envoyer" type="hidden"/> |
<button type="submit" class="btn btn-success">Envoyer le rapport d'erreur</button> |
</form> |
<?php endif; ?> |
</div> |
<!-- WIDGET:reseau:rapportErreur - FIN --> |
</body> |
</html> |
/trunk/widget/Widget.php |
---|
New file |
0,0 → 1,166 |
<?php |
// In : utf8 url_encoded (get et post) |
// Out : utf8 |
/** |
* La classe Widget analyser l'url et chage le widget correspondant. |
* Format d'url : |
* /widget/nom_du_widget?parametres1=ma_valeur1¶metre2=ma_valeur2 |
* Les widget sont dans des dossiers en minuscule correspondant au nom de la classe du widget. |
* Exemple : /widget/carto avec la classe Carto.php dans le dossier carto. |
* |
* |
* @author jpm |
* |
*/ |
class Widget { |
/** Les paramètres de configuration extrait du fichier .ini */ |
private static $config; |
/** Le nom du widget demandé. */ |
private $widget = null; |
/** Les chemins où l'autoload doit chercher des classes. */ |
private static $autoload_chemins = array(); |
/** Les paramètres de l'url $_GET nettoyés. */ |
private $parametres = null; |
/** |
* Constructeur. |
* Parse le fichier de configuraion "widget.ini" et parse l'url à la recherche du widget demandé. |
* @param str iniFile Configuration file to use |
*/ |
public function __construct($fichier_ini = 'widget.ini.php') { |
// Chargement de la configuration |
self::$config = parse_ini_file($fichier_ini, TRUE); |
// Paramêtres de config dynamiques |
self::$config['chemins']['baseURLAbsoluDyn'] = 'http://'.$_SERVER['SERVER_NAME'].self::$config['chemins']['baseURL'].'%s'; |
// Gestion de la mémoire maximum allouée aux services |
ini_set('memory_limit', self::$config['parametres']['limiteMemoire']); |
// Réglages de PHP |
setlocale(LC_ALL, self::$config['parametres']['locale']); |
date_default_timezone_set(self::$config['parametres']['fuseauHoraire']); |
// Gestion des erreurs |
error_reporting(self::$config['parametres']['erreurNiveau']); |
if (isset($_SERVER['REQUEST_URI']) && isset($_SERVER['QUERY_STRING'])) { |
$url_morceaux = $this->parserUrl(); |
if (isset($url_morceaux[0])) { |
$this->widget = $url_morceaux[0]; |
// hack car chez moi (mathias) je me retrouve avec $url_morceaux[0] = "delnomduwidget", pourtant j'ai le même .htaccess... |
if (strpos($this->widget, ":") !== false) { |
$this->widget = substr($this->widget, strpos($this->widget, ":") + 1); |
} |
self::$config['chemins']['widgetCourantDossier'] = self::$config['chemins']['widgetsDossier'].strtolower($this->widget).DIRECTORY_SEPARATOR; |
$this->chargerWidgetConfig(); |
} |
// Chargement des chemins pour l'autoload |
$this->chargerCheminAutoload(); |
// Enregistrement de la méthode gérant l'autoload des classes |
spl_autoload_register(array('Widget', 'chargerClasse')); |
// Nettoyage du $_GET (sécurité) |
$this->collecterParametres(); |
} else { |
$e = 'Les widget nécessite les variables serveurs suivantes pour fonctionner : REQUEST_URI et QUERY_STRING.'; |
trigger_error($e, E_USER_ERROR); |
} |
} |
private function parserUrl() { |
if (strlen($_SERVER['QUERY_STRING']) == 0) { |
$len = strlen($_SERVER['REQUEST_URI']); |
} else { |
$len = -(strlen($_SERVER['QUERY_STRING']) + 1); |
} |
$url = substr($_SERVER['REQUEST_URI'], strlen(self::$config['chemins']['baseURL']), $len); |
$url_morceaux = explode('/', $url); |
return $url_morceaux; |
} |
private function collecterParametres() { |
if (isset($_GET) && $_GET != '') { |
$this->nettoyerGet(); |
$this->parametres = $_GET; |
} |
} |
private function nettoyerGet() { |
foreach ($_GET as $cle => $valeur) { |
$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';'); |
$_GET[$cle] = strip_tags(str_replace($verifier, '', $valeur)); |
} |
} |
private function chargerCheminAutoload() { |
$chemins_communs = explode(';', self::$config['chemins']['autoload']); |
$chemins_communs = array_map('trim', $chemins_communs); |
array_unshift($chemins_communs, ''); |
$chemins_widget = array(); |
if (isset(self::$config[$this->widget]['autoload'])) { |
$chemins_widget = explode(';', self::$config[$this->widget]['autoload']); |
foreach ($chemins_widget as $cle => $chemin) { |
$chemins_widget[$cle] = self::$config['chemins']['widgetCourantDossier'].trim($chemin); |
} |
} |
self::$autoload_chemins = array_merge($chemins_communs, $chemins_widget); |
} |
/** |
* La méthode chargerClasse() charge dynamiquement les classes trouvées dans le code. |
* Cette fonction est appelée par php5 quand il trouve une instanciation de classe dans le code. |
* |
*@param string le nom de la classe appelée. |
*@return void le fichier contenant la classe doit être inclu par la fonction. |
*/ |
public static function chargerClasse($classe) { |
if (class_exists($classe)) { |
return null; |
} |
foreach (self::$autoload_chemins as $chemin) { |
$chemin = $chemin.$classe.'.php'; |
if (file_exists($chemin)) { |
require_once $chemin; |
} |
} |
} |
/** |
* Execute le widget. |
*/ |
function executer() { |
if (!is_null($this->widget)) { |
$classe_widget = ucfirst($this->widget); |
$fichier_widget = self::$config['chemins']['widgetCourantDossier'].$classe_widget.'.php'; |
if (file_exists($fichier_widget)) { |
include_once $fichier_widget; |
if (class_exists($classe_widget)) { |
$widget = new $classe_widget(self::$config, $this->parametres); |
$widget->executer(); |
} |
} |
} else { |
echo "pas de module précisé"; |
} |
} |
/** |
* Charge le fichier de config spécifique du wiget et fusionne la config avec celle partagés par l'ensemble des widgets. |
*/ |
private function chargerWidgetConfig() { |
$widget_config_ini_fichier = self::$config['chemins']['widgetCourantDossier'].'config.ini'; |
if (file_exists($widget_config_ini_fichier)) { |
$widget_config = parse_ini_file($widget_config_ini_fichier, TRUE); |
self::$config = array_merge(self::$config, $widget_config); |
} |
} |
} |
?> |
/trunk/widget/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/widget/bibliotheque/WidgetCommun.php |
---|
New file |
0,0 → 1,405 |
<?php |
abstract class WidgetCommun { |
protected $config = null; |
protected $parametres = null; |
protected $messages = array(); |
protected $debug = array(); |
public function __construct($config, $parametres) { |
$this->config = $config; |
$this->parserFichierIni($config['chemins']['widgetCourantDossier'].'config.ini'); |
$this->parametres = $parametres; |
} |
/** |
* Parse le fichier ini donné en paramètre |
* @param string $fichier_ini nom du fichier ini à parser |
* @return boolean true si le fichier ini a été trouvé. |
*/ |
private function parserFichierIni($fichier_ini) { |
$retour = false; |
if (file_exists($fichier_ini)) { |
$ini = parse_ini_file($fichier_ini, true); |
$this->fusionner($ini); |
$retour = true; |
} |
return $retour; |
} |
/** |
* fusionne un tableau de paramètres avec le tableau de config global |
* @param array $ini le tableau à fusionner |
*/ |
private function fusionner(array $ini) { |
$this->config = array_merge($this->config, $ini); |
} |
protected function traiterNomMethodeExecuter($nom) { |
$methode = 'executer'; |
$methode .= str_replace(' ', '', ucwords(str_replace('-', ' ', strtolower($nom)))); |
return $methode; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION des CLASSES CHARGÉES à la DEMANDE |
protected function getDao() { |
if (! isset($this->dao)) { |
$this->dao = new Dao(); |
} |
return $this->dao; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION DE MÉTHODES COMMUNES ENTRE LES SERVICES |
protected function getUrlImage($id, $format = 'L') { |
$url_tpl = $this->config['chemins']['celImgUrlTpl']; |
$id = sprintf('%09s', $id).$format; |
$url = sprintf($url_tpl, $id); |
return $url; |
} |
protected function encoderMotCle($mot_cle) { |
return md5(mb_strtolower($mot_cle)); |
} |
private function protegerMotsCles($mots_cles, $type) { |
$separateur = ($type == self::TYPE_IMG) ? ',' : ';' ; |
$mots_cles_a_proteger = explode($separateur,rtrim(trim($mots_cles), $separateur)); |
foreach ($mots_cles_a_proteger as $mot) { |
$mots_cles_proteges[] = $this->bdd->quote($mot); |
} |
$mots_cles = implode(',', $mots_cles_proteges); |
return $mots_cles; |
} |
protected function tronquerCourriel($courriel) { |
$courriel = preg_replace('/[^@]+$/i', '...', $courriel); |
return $courriel; |
} |
protected function nettoyerTableau($tableau) { |
foreach ($tableau as $cle => $valeur) { |
if (is_array($valeur)) { |
$valeur = $this->nettoyerTableau($valeur); |
} else { |
$valeur = $this->nettoyerTexte($valeur); |
} |
$tableau[$cle] = $valeur; |
} |
return $tableau; |
} |
protected function nettoyerTexte($txt) { |
$txt = preg_replace('/&(?!([a-z]+|#[0-9]+|#x[0-9][a-f]+);)/i', '&', $txt); |
$txt = preg_replace('/^(?:000null|null)$/i', '', $txt); |
return $txt; |
} |
protected function etreVide($valeur) { |
$vide = false; |
if ($valeur == '' || $valeur == 'null'|| $valeur == '000null' || $valeur == '0') { |
$vide = true; |
} |
return $vide; |
} |
protected function formaterDate($date_heure_mysql, $format = '%A %d %B %Y à %H:%M') { |
$date_formatee = ''; |
if (!$this->etreVide($date_heure_mysql)) { |
$timestamp = $this->convertirDateHeureMysqlEnTimestamp($date_heure_mysql); |
$date_formatee = strftime($format, $timestamp); |
} |
return $date_formatee; |
} |
protected function convertirDateHeureMysqlEnTimestamp($date_heure_mysql){ |
$val = explode(' ', $date_heure_mysql); |
$date = explode('-', $val[0]); |
$heure = explode(':', $val[1]); |
return mktime((int) $heure[0], (int) $heure[1], (int) $heure[2], (int) $date[1], (int) $date[2], (int) $date[0]); |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION DE L'IDENTIFICATION et des UTILISATEURS |
protected function getAuthIdentifiant() { |
$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null; |
return $id; |
} |
protected function getAuthMotDePasse() { |
$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null; |
return $mdp; |
} |
protected function authentifierAdmin() { |
$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica."; |
$message_echec = "Accès limité aux administrateurs du CEL.\n". |
"Votre tentative d'identification a échoué.\n". |
"Actualiser la page pour essayer à nouveau si vous êtes bien inscrit comme administrateur."; |
return $this->authentifier($message_accueil, $message_echec, 'Admin'); |
} |
protected function authentifierUtilisateur() { |
$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica."; |
$message_echec = "Accès limité aux utilisateur du CEL.\n". |
"Inscrivez vous http://www.tela-botanica.org/page:inscription pour le devenir.\n". |
"Votre tentative d'identification a échoué.\n". |
"Actualiser la page pour essayer à nouveau si vous êtes déjà inscrit ou contacter 'accueil@tela-botanica.org'."; |
return $this->authentifier($message_accueil, $message_echec, 'Utilisateur'); |
} |
private function authentifier($message_accueil, $message_echec, $type) { |
$id = $this->getAuthIdentifiant(); |
if (!isset($id)) { |
$this->envoyerAuth($message_accueil, $message_echec); |
} else { |
if ($type == 'Utilisateur' && $this->getAuthMotDePasse() == 'debug') { |
$autorisation = true; |
} else { |
$methodeAutorisation = "etre{$type}Autorise"; |
$autorisation = $this->$methodeAutorisation(); |
} |
if ($autorisation == false) { |
$this->envoyerAuth($message_accueil, $message_echec); |
} |
} |
return true; |
} |
protected function etreUtilisateurAutorise() { |
$identifiant = $this->getAuthIdentifiant(); |
$mdp = md5($this->getAuthMotDePasse()); |
$url = sprintf($this->config['authentification']['serviceUrlTpl'], $identifiant, $mdp); |
$json = $this->getDao()->consulter($url); |
$existe = json_decode($json); |
$autorisation = (isset($existe) && $existe) ? true :false; |
return $autorisation; |
} |
protected function etreAdminAutorise($identifiant) { |
$identifiant = $this->getAuthIdentifiant(); |
$autorisation = ($this->etreUtilisateurAutorise() && $this->etreAdminCel($identifiant)) ? true : false; |
return $autorisation; |
} |
protected function etreAdminCel($courriel) { |
$admins = $this->config['authentification']['administrateurs']; |
$courriels_autorises = explode(',', $admins); |
$autorisation = (in_array($courriel, $courriels_autorises)) ? true : false ; |
return $autorisation; |
} |
protected function recupererUtilisateursIdentite(Array $courriels) { |
// Récupération des données au format Json |
$service = "utilisateur/identite-par-courriel/".implode(',', $courriels); |
$url = sprintf($this->config['chemins']['baseURLServicesAnnuaireTpl'], $service); |
$json = $this->getDao()->consulter($url); |
$utilisateurs = json_decode($json); |
foreach ($courriels as $courriel) { |
$info = array('id' => null, 'intitule' => ''); |
if (isset($utilisateurs->$courriel)) { |
$info['intitule'] = $utilisateurs->$courriel->intitule; |
$info['id'] = $utilisateurs->$courriel->id; |
} else { |
$info['intitule'] = $this->tronquerCourriel($courriel); |
} |
$noms[$courriel] = $info; |
} |
return $noms; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION de l'ENVOIE au NAVIGATEUR |
protected function envoyerJsonp($donnees = null, $encodage = 'utf-8') { |
$contenu = $_GET['callback'].'('.json_encode($donnees).');'; |
$this->envoyer($contenu, 'text/html', $encodage); |
} |
protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8') { |
// Traitements des messages d'erreurs et données |
if (count($this->messages) != 0) { |
header('HTTP/1.1 500 Internal Server Error'); |
$mime = 'text/html'; |
$encodage = 'utf-8'; |
$sortie = '<html>'. |
'<head><title>Messages</title></head>'. |
'<body><pre>'.implode("\n", $this->messages).'</pre><body>'. |
'</html>'; |
} else { |
$sortie = $donnees; |
if (is_null($donnees)) { |
$sortie = 'OK'; |
} |
} |
// Gestion de l'envoie du déboguage |
$this->envoyerDebogage(); |
// Envoie sur la sortie standard |
$this->envoyerContenu($encodage, $mime, $sortie); |
} |
private function envoyerDebogage() { |
if (!is_array($this->debug)) { |
$this->debug[] = $this->debug; |
} |
if (count($this->debug) != 0) { |
foreach ($this->debug as $cle => $val) { |
if (is_array($val)) { |
$this->debug[$cle] = print_r($val, true); |
} |
} |
header('X-DebugJrest-Data:'.json_encode($this->debug)); |
} |
} |
private function envoyerContenu($encodage, $mime, $contenu) { |
if (!is_null($mime) && !is_null($encodage)) { |
header("Content-Type: $mime; charset=$encodage"); |
} else if (!is_null($mime) && is_null($encodage)) { |
header("Content-Type: $mime"); |
} |
print_r($contenu); |
} |
private function envoyerAuth($message_accueil, $message_echec) { |
header('HTTP/1.0 401 Unauthorized'); |
header('WWW-Authenticate: Basic realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"'); |
header('Content-type: text/plain; charset=UTF-8'); |
print $message_echec; |
exit(0); |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION DES SQUELETTES (PHP, TXT...) |
/** |
* Méthode prenant en paramètre un tableau associatif, les clés seront recherchées dans le texte pour être |
* remplacer par la valeur. Dans le texte, les clés devront être entre accolades : {} |
* |
* @param String $txt le texte où chercher les motifs. |
* @param Array $donnees un tableau associatif contenant les motifs à remplacer. |
* |
* @return String le texte avec les motifs remplacer par les valeurs du tableau. |
*/ |
protected static function traiterSqueletteTxt($txt, Array $donnees = array()) { |
$motifs = array(); |
$valeurs = array(); |
foreach ($donnees as $cle => $valeur) { |
if (strpos($cle, '{') === false && strpos($cle, '}') === false) { |
$motifs = '{'.$cle.'}'; |
$valeurs = $valeur; |
} |
} |
$txt = str_replace($motifs, $valeurs, $txt); |
return $txt; |
} |
/** |
* 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. |
*/ |
protected static 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 static 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; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// UTILITAIRES |
/** |
* Permet de trier un tableau multi-dimenssionnel en gardant l'ordre des clés. |
* |
* @param Array $array le tableau à trier |
* @param Array $cols tableau indiquant en clé la colonne à trier et en valeur l'ordre avec SORT_ASC ou SORT_DESC |
* @author cagret at gmail dot com |
* @see http://fr.php.net/manual/fr/function.array-multisort.php Post du 21-Jun-2009 12:38 |
*/ |
public static function trierTableauMd($array, $cols) { |
$colarr = array(); |
foreach ($cols as $col => $order) { |
$colarr[$col] = array(); |
foreach ($array as $k => $row) { |
$colarr[$col]['_'.$k] = strtolower($row[$col]); |
} |
} |
$params = array(); |
foreach ($cols as $col => $order) { |
$params[] =& $colarr[$col]; |
$params = array_merge($params, (array)$order); |
} |
call_user_func_array('array_multisort', $params); |
$ret = array(); |
$keys = array(); |
$first = true; |
foreach ($colarr as $col => $arr) { |
foreach ($arr as $k => $v) { |
if ($first) { |
$keys[$k] = substr($k,1); |
} |
$k = $keys[$k]; |
if (!isset($ret[$k])) { |
$ret[$k] = $array[$k]; |
} |
$ret[$k][$col] = $array[$k][$col]; |
} |
$first = false; |
} |
return $ret; |
} |
} |
?> |
/trunk/widget/index.php |
---|
New file |
0,0 → 1,6 |
<?php |
require 'framework.php'; |
require 'Widget.php'; |
$widget = new Widget(); |
$widget->executer(); |
?> |
/trunk/widget/widget.ini.defaut.php |
---|
New file |
0,0 → 1,39 |
;<?/* |
[parametres] |
;Memoire maxi pour les services : 128Mo = 134217728 ; 256Mo = 268435456 ; 512Mo = 536870912 ; 1Go = 1073741824 |
limiteMemoire = "512M" |
; Niveau d'erreur PHP |
erreurNiveau = 30719 ; E_ALL = 30719 |
; Séparateur d'url en entrée |
argSeparatorInput = "&" |
; Indication de la locale (setLocale(LC_ALL, ?)) pour les classes appelées par Widget.php |
locale = "fr_FR.UTF-8" |
; Indication du fuseau horraire par défaut date_default_timezone_set(?)pour les classes appelées par Widget.php |
fuseauHoraire = "Europe/Paris" |
[chemins] |
; Chemins à utiliser dans la méthode autoload des widgets |
autoload = "bibliotheque/" |
; Dossier contenant les widgets |
widgetsDossier = "modules/" |
; Dossier contenant le widget demandé construit dynamiquement dans le fichier Widget.php |
widgetCourantDossier = "" |
; Dossier contenant les fichiers des bibliothèques tierces |
bibliothequeDossier = "bibliotheque/" |
; Base de l'url servant à appeler les widgets |
baseURL = "/widget/" |
; URL de base absolue des Widgets du CEL construit dynamiquement dans le fichier WidgetCommun.php |
baseURLAbsoluDyn = "" |
; URL des services web du CEL sous forme de template à utiliser avec sprintf |
baseURLServicesCelTpl = "http://www.tela-botanica.org/service:cel:%s" |
; URL des services web du CEL sous forme de template à utiliser avec sprintf |
baseURLServicesAnnuaireTpl = "http://www.tela-botanica.org/service:annuaire:%s" |
; Squelette d'Url permettant d'afficher une image du CEL (remplace %s par l'id de l'image sans underscore) |
celImgUrlTpl = "http://api.tela-botanica.org/img:%s.jpg" |
; Squelette d'URL pour les services web d'eFlore. |
baseURLServicesEfloreTpl = "http://www.tela-botanica.org/service:eflore:{projetCode}/{apiVersion}/{serviceNom}" |
[authentification] |
serviceUrlTpl = "http://www.tela-botanica.org/client/annuaire_nouveau/actuelle/jrest/TestLoginMdp/%s/%s" |
administrateurs = aurelien@tela-botanica.org,david.delon@clapas.net,jpm@tela-botanica.org,marie@tela-botanica.org |
;*/?> |