Subversion Repositories Applications.reseau

Compare Revisions

Ignore whitespace Rev 4 → Rev 5

/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/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/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/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/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&parametre2=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', '&amp;', $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
;*/?>