Subversion Repositories Applications.framework

Compare Revisions

Ignore whitespace Rev 104 → Rev 105

/trunk/framework/Registre.php
1,8 → 1,21
<?php
// declare(encoding='UTF-8');
/**
* Classe registre, qui permet un accès à différentes variables à travers les autres classes.
* Classe registre, qui permet un accès à différentes variables à travers les autres classes.
* C'est un singleton
*/
*
* PHP Version 5
*
* @category Class
* @package Framework
* @author Jean-Pascal Milcent <jmp@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @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 SVN: $$Id$$
* @link /doc/framework/
*
*/
class Registre {
 
/**
10,19 → 23,19
*/
private $stockage = array();
/**
* La classe registre se contient elle-même, (pour le pattern singleton)
* La classe registre se contient elle-même, (pour le pattern singleton)
*/
private static $registre;
 
/**
* Constructeur par défaut, privé, car on accède à la classe par le getInstance
* Constructeur par défaut, privé, car on accède à la classe par le getInstance
*/
private function __construct() {
}
 
/**
* Fonction qui renvoie l'instance de classe en assurant son unicité, c'est l'unique méthode qui doit être
* utilisé pour récupérer l'objet Registre
* Fonction qui renvoie l'instance de classe en assurant son unicité, c'est l'unique méthode qui doit être
* utilisée pour récupérer l'objet Registre
*/
public static function getInstance() {
if (self::$registre instanceof Registre) {
33,14 → 46,14
}
 
/**
* Ajoute un objet au tableau selon un intitulé donné
* @param string l'intitulé sous lequel l'objet sera conservé
* @param mixed l'objet à conserver
* Ajoute un objet au tableau selon un intitulé donné
* @param string l'intitulé sous lequel l'objet sera conservé
* @param mixed l'objet à conserver
*/
public function set($intitule, $objet) {
if (is_array($objet) && isset($this->stockage[$intitule])) {
$this->stockage[$intitule] = array_merge((array) $this->stockage[$intitule], (array) $objet);
$message = "Le tableau $intitule présent dans le registre a été fusionné avec un nouveau tableau de même intitulé !";
$message = "Le tableau $intitule présent dans le registre a été fusionné avec un nouveau tableau de même intitulé !";
trigger_error($message, E_USER_WARNING);
} else {
$this->stockage[$intitule] = $objet;
48,8 → 61,8
}
 
/**
* Renvoie l'objet associé à l'intitulé donné en paramètre
* @return mixed l'objet associé à l'intitulé ou null s'il n'est pas présent
* Renvoie l'objet associé à l'intitulé donné en paramètre
* @return mixed l'objet associé à l'intitulé ou null s'il n'est pas présent
*/
public function get($intitule) {
if (isset($this->stockage[$intitule])) {
59,7 → 72,7
}
 
/**
* Détruit l'objet associé à l'intitulé, n'a pas d'effet si il n'y a pas d'objet associé
* Détruit l'objet associé à l'intitulé, n'a pas d'effet si il n'y a pas d'objet associé
*/
public function detruire($intitule) {
if (isset($this->stockage[$intitule])) {
68,8 → 81,8
}
 
/**
* Teste si un objet est présent sous un intitulé donné
* @return boolean true si un objet associé à cet intitulé est présent, false sinon
* Teste si un objet est présent sous un intitulé donné
* @return boolean true si un objet associé à cet intitulé est présent, false sinon
*/
public function existe($intitule) {
if(isset($this->stockage[$intitule])){
/trunk/framework/config.defaut.ini
1,32 → 1,32
; Renommer ce fichier ne config.ini
; +------------------------------------------------------------------------------------------------------+
; Général
; Séparateur de dossier
; Général
; Séparateur de dossier
ds = DIRECTORY_SEPARATOR
; Séparateur de chemin
; Séparateur de chemin
ps = PATH_SEPARATOR
; Fin de ligne de fichier
eol = PHP_EOL
 
; +------------------------------------------------------------------------------------------------------+
; Débogage
; Indique si oui ou non on veut afficher le débogage.
; Débogage
; Indique si oui ou non on veut afficher le débogage.
fw_debogage = true
; Indique si oui ou non on veut afficher le contexte de débogage.
; Indique si oui ou non on veut afficher le contexte de débogage.
fw_debogage_contexte = false
; Niveau d'erreur à employer pour le code PHP. Voir le manuel de PHP pour les différents niveaux disponibles.
; Niveau d'erreur à employer pour le code PHP. Voir le manuel de PHP pour les différents niveaux disponibles.
fw_debogage_niveau = 2048
 
; +------------------------------------------------------------------------------------------------------+
; Benchmark
; Indique si oui ou nom on veut afficher le tableau de chronométrage de l'application.
; Indique si oui ou nom on veut afficher le tableau de chronométrage de l'application.
fw_benchmark_chrono = true
 
; +------------------------------------------------------------------------------------------------------+
; Chemins et fichiers
; Nom des fichiers de config recherché. Défini par défaut dans la classe Config
; Nom des fichiers de config recherché. Défini par défaut dans la classe Config
; fw_fichier_config = "config%s.ini"
; Chemin vers le dossier du framework. Défini par défaut dans la classe Config
; Chemin vers le dossier du framework. Défini par défaut dans la classe Config
; fw_chemin = "php:dirname(__FILE__).DS"
 
; Nom du dossier de la bibliotheque de codes de l'application.
39,7 → 39,7
dossier_controleurs = controleurs
; Nom du dossier des traductions de l'application.
dossier_i18n = i18n
; Nom du dossier des modèles de l'application.
; Nom du dossier des modèles de l'application.
dossier_modeles = modeles
; Nom du dossier des squelettes de l'application.
dossier_squelettes = squelettes
56,32 → 56,34
chemin_controleurs = "{ref:chemin_appli}{ref:dossier_controleurs}{ref:ds}"
; Chemin vers le dossier des traductions de l'application.
chemin_i18n = "{ref:chemin_appli}{ref:dossier_i18n}{ref:ds}"
; Chemin vers le dossier des modèles de l'application.
; Chemin vers le dossier des modèles de l'application.
chemin_modeles = "{ref:chemin_appli}{ref:dossier_modeles}{ref:ds}"
; Chemin vers le dossier des squelettes de l'application.
chemin_squelettes = "{ref:chemin_appli}{ref:dossier_squelettes}{ref:ds}"
 
; +------------------------------------------------------------------------------------------------------+
; Paramétrage de la base de données.
; Protocole de la base de données.
; Paramètrage de la base de données.
; Protocole de la base de données.
bdd_protocole = mysql
; Nom du serveur de bases de données.
; Nom du serveur de bases de données.
bdd_serveur = localhost
; Nom de l'utilisateur de la base de données.
; Nom de l'utilisateur de la base de données.
bdd_utilisateur = ""
; Mot de passse de l'utilisateur de la base de données.
; Mot de passe de l'utilisateur de la base de données.
bdd_mot_de_passe = ""
; Nom de la base de données principale.
; Nom de la base de données principale.
bdd_nom = ""
; Encodage de la base de données principale.
bdd_encodage = ""
 
; +------------------------------------------------------------------------------------------------------+
; URLs
; URL de base de l'application, si elle est laissée vide, l'application fonctionnera en Stand-alone
; URL de base de l'application, si elle est laissée vide, l'application fonctionnera en Stand-alone
; Peut utiliser une objet Net_URL comme ceci : "php:$mon_objet_net_url->getUrl()"
url_base = ""
 
; +------------------------------------------------------------------------------------------------------+
; Identifications
; Indiquer ici si l'utilisateur est identifié ou pas.
; Indiquer ici si l'utilisateur est identifié ou pas.
; Peut utiliser un objet Auth comme ceci : "php:$mon_objet_auth->getAuth()"
identification = true
/trunk/framework/Chronometre.php
1,4 → 1,5
<?php
// declare(encoding='UTF-8');
/** Fichier de la classe Chronometre
*
* PHP Version 5
13,12 → 14,12
*/
 
/** Classe Chronometre() - Permet de stocker et d'afficher
* les temps d'éxécution de script.
* les temps d'éxécution de script.
*
* Cette classe permet de réaliser un ensemble
* de mesure de temps prises à
* différents endroits d'un script.
* Ces mesures peuvent ensuite être affichées au
* Cette classe permet de réaliser un ensemble
* de mesure de temps prises à
* différents endroits d'un script.
* Ces mesures peuvent ensuite être affichées au
* sein d'un tableau XHTML.
*
*
43,9 → 44,9
 
/** Accesseurs :
*
* @param string $cle la cle associée à un chronomètre particulier
* @param string $cle la cle associ�e � un chronom�tre particulier
*
* @return int le temps écoulé
* @return int le temps �coul�
*/
public function getTemps($cle = null) {
$temps = '';
59,7 → 60,7
 
/** Setteur pour la variable temps
*
* @param array() $moment ajoute des points de chronométrage au tableau _temps
* @param array() $moment ajoute des points de chronom�trage au tableau _temps
*
* @return null
*/
67,21 → 68,21
array_push($this->_temps, $moment);
}
 
/*** Méthodes : ***/
/*** Méthodes : ***/
 
/** Méthode afficherChrono() -
* Permet d'afficher les temps d'éxécution de différentes parties d'un script.
/** Méthode afficherChrono() -
* Permet d'afficher les temps d'éxécution de différentes parties d'un script.
*
* Cette fonction permet d'afficher un ensemble de
* mesure de temps prises à différents endroits d'un script.
* Ces mesures sont affichées au sein d'un tableau XHTML
* mesure de temps prises à différents endroits d'un script.
* Ces mesures sont affichées au sein d'un tableau XHTML
* dont on peut controler l'indentation des balises.
* Pour un site en production, il suffit d'ajouter un style
* #chrono {display:none;} dans la css. De cette façon,
* #chrono {display:none;} dans la css. De cette façon,
* le tableau ne s'affichera pas. Le webmaster lui pourra
* rajouter sa propre feuille de style affichant le tableau.
* Le développeur initial de cette fonction est Loic d'Anterroches.
* Elle a été modifiée par Jean-Pascal Milcent.
* Le développeur initial de cette fonction est Loic d'Anterroches.
* Elle a été modifiée par Jean-Pascal Milcent.
* Elle utilise une variable gobale : $_CHRONO_
*
* @author Loic d'Anterroches
92,22 → 93,22
* @return string la chaine XHTML de mesure des temps.
*/
public function afficherChrono($indentation_origine = 8, $indentation = 4) {
// Création du chrono de fin
// Création du chrono de fin
$GLOBALS['_SCRIPT_']['chrono']->setTemps(array (
'fin' => microtime()
));
 
// Début création de l'affichage
// Début création de l'affichage
$sortie = str_repeat(' ', $indentation_origine) .
'<table id="chrono" lang="fr" summary="Résultat du
chronométrage du programme affichant la page actuelle.">' . "\n";
'<table id="chrono" lang="fr" summary="Résultat du
chronométrage du programme affichant la page actuelle.">' . "\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) .
'<caption>Chronométrage</caption>' . "\n";
'<caption>Chronométrage</caption>' . "\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) .
'<thead>' . "\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 2))) .
'<tr><th>Action</th><th>Temps écoulé (en s.)</th>
<th>Cumul du temps écoulé (en s.)</th></tr>' . "\n";
'<tr><th>Action</th><th>Temps écoulé (en s.)</th>
<th>Cumul du temps écoulé (en s.)</th></tr>' . "\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) .
'</thead>' . "\n";
 
116,11 → 117,11
 
$total_tps_ecoule = 0;
 
// Récupération de la première mesure
// Récupération de la premiére mesure
$tab_depart = & $this->getTemps(0);
list ($usec, $sec) = explode(' ', $tab_depart['depart']);
 
// Ce temps correspond à tps_fin
// Ce temps correspond à tps_fin
$tps_debut = ((float) $usec + (float) $sec);
 
foreach ($this->getTemps() as $tab_temps) {
148,7 → 149,7
'<tfoot>' . "\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 2))) .
'<tr>' .
'<th>' . 'Total du temps écoulé (en s.)' . '</th>' .
'<th>' . 'Total du temps écoulé (en s.)' . '</th>' .
'<td colspan="2">' .
number_format($total_tps_ecoule, 3, ',', ' ') . '</td>' .
'</tr>' . "\n";
/trunk/framework/Config.php
1,7 → 1,8
<?php
// declare(encoding='UTF-8');
/**
* Config permet de charger automatiquement les fichiers ini du Framework et de l'application.
* Elle offre l'accès en lecture seule aux paramêtres de config.
* Elle offre l'accès en lecture seule aux paramètres de config.
* C'est une Singleton.
*
* PHP Version 5
21,7 → 22,7
private static $parametres = array();
 
private function __construct() {
// Définition de paramètres avant chargement du config.ini
// Définition de paramètres avant chargement du config.ini
self::$parametres = array(
'fw_fichier_config' => 'config%s.ini',
'fw_chemin' => dirname(__FILE__).DS
30,7 → 31,7
// Chargement du fichier config.ini du Framework
self::parserFichierIni(self::$parametres['fw_chemin'].sprintf(self::$parametres['fw_fichier_config'], ''));
 
// Chargement du fichier config.ini par défaut de l'application
// Chargement du fichier config.ini par défaut de l'application
$chemin_config_defaut_appli = self::$parametres['chemin_configurations'].sprintf(self::$parametres['fw_fichier_config'], '');
self::parserFichierIni($chemin_config_defaut_appli);
 
132,11 → 133,11
$config[$pieces[0]] = array();
}
} elseif (!is_array($config[$pieces[0]])) {
throw new ErrorException("Ne peut pas créer de sous-clé pour '{$pieces[0]}' car la clé existe déjà");
throw new ErrorException("Ne peut pas créer de sous-clé pour '{$pieces[0]}' car la clé existe déjà");
}
$config[$pieces[0]] = self::evaluerCle($config[$pieces[0]], $pieces[1], $valeur);
} else {
throw new ErrorException("Clé invalide '$cle'");
throw new ErrorException("Clé invalide '$cle'");
}
} else {
$config[$cle] = $valeur;
/trunk/framework/Modele.php
1,10 → 1,23
<?php
// declare(encoding='UTF-8');
/**
* Classe modèle, donc d'accès au données, elle ne devrait pas être appelée de l'extérieur.
* Elle fait office d'abstraction légère de base de données en utilisant les objects PDO natifs
* de PHP
* Elle est abstraite donc doit obligatoirement être étendue.
*/
* Classe modèle, donc d'accés au données, elle ne devrait pas être appelée de l'extérieur.
* Elle fait office d'abstraction légère de base de données en utilisant les objects PDO natifs
* de PHP
* Elle est abstraite donc doit obligatoirement être étendue.
*
* PHP Version 5
*
* @category Class
* @package Framework
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @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 SVN: $$Id$$
* @link /doc/framework/
*
*/
abstract class Modele {
 
/**
20,19 → 33,19
*/
private $gestionnaire_erreur;
/**
* DSN pour accéder à la base de données
* DSN pour accéder à la base de données
*/
private $dsn;
/**
* Type de base de données (mysql, mysqli, etc ...)
* Type de base de données (mysql, mysqli, etc ...)
*/
private $type;
/**
* Hote herbergeant la base de données
* Hote herbergeant la base de données
*/
private $hote;
/**
* Nom de la base de données à laquelle le modèle doit se connecter
* Nom de la base de données à laquelle le modèle doit se connecter
*/
private $bdd_nom;
/**
43,16 → 56,21
* Mot de passe
*/
private $pass;
/**
* Encodage de la base de données
*/
private $encodage = null;
/**
* Connexion à la base de données
* Connexion à la base de données
*/
private $connexion = null;
 
/**
* Constructeur par défaut, appelé à l'initialisation.
* Constructeur par défaut, appelé à l'initialisation.
*/
final public function __construct() {
// les différents paramètres nécessaires sont lus à partir du registre
// les différents paramètres nécessaires sont lus à partir du registre
$this->registre = Registre::getInstance();
$this->gestionnaire_erreur = GestionnaireErreur::getInstance();
$this->type = Config::get('bdd_protocole');
60,6 → 78,7
$this->bdd_nom = Config::get('bdd_nom');
$this->utilisateur = Config::get('bdd_utilisateur');
$this->pass = Config::get('bdd_mot_de_passe');
$this->encodage = Config::get('bdd_encodage');
$this->dsn = $this->type.':dbname='.$this->bdd_nom.';host='.$this->hote;
}
67,11 → 86,11
/**
* Fonction qui appelle la bonne fonction de requete suivant le type de bdd.
*
* @param string la requete à effectuer
* @return PDOStatement un objet contenant le résultat de la requête
* @param string la requete à effectuer
* @return PDOStatement un objet contenant le résultat de la requête
*/
final protected function requete($requete) {
// on ne se connecte que lors du premier appel à une requete (lazy connexion)
// on ne se connecte que lors du premier appel à une requete (lazy connexion)
if ($this->connexion == null) {
$this->connecter();
}
79,16 → 98,19
}
/**
* Connection à la base de données en utilisant les informations fournies par
* Connection à la base de données en utilisant les informations fournies par
* le fichier de configuration.
* private et final car n'a pas vocation a être appelée par l'utilisateur.
* private et final car n'a pas vocation a être appelée par l'utilisateur.
*
* @throws PDOException une exception dans le cas ou là connexion échoue
* @throws PDOException une exception dans le cas ou là connexion échoue
*/
final private function connecter() {
// TODO: retirer le try catch et laisser le problème au gestionnaire d'exceptions
// TODO: retirer le try catch et laisser le problème au gestionnaire d'exceptions
try {
$this->connexion = new PDO($this->dsn, $this->utilisateur, $this->pass);
$this->connexion = new PDO($this->dsn, $this->utilisateur, $this->pass);
if($this->encodage != null) {
$this->requete("SET names '".$this->encodage."'");
}
} catch (PDOException $e) {
}
95,10 → 117,10
}
/**
* protège une chaine de caractères avant l'insertion dans la base de données
* protège une chaine de caractères avant l'insertion dans la base de données
*/
final protected function proteger($chaine) {
// on ne se connecte que lors du premier appel à une requete
// on ne se connecte que lors du premier appel à une requete
if ($this->connexion == null) {
$this->connecter();
}
/trunk/framework/GestionnaireException.php
1,39 → 1,45
<?php
/*
* Created on 27 mars 2009
*
* To change the template for this generated file go to
* Window - Preferences - PHPeclipse - PHP - Code Templates
*/
// declare(encoding='UTF-8');
/**
* Classe GestionnaireException, gère les exceptions
*/
* classe de gestion des exceptions.
*
* PHP Version 5
*
* @category Class
* @package Framework
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @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 SVN: $$Id$$
* @link /doc/framework/
*
*/
class GestionnaireException {
/**
* Liste des exceptions enregistrées
* Liste des exceptions enregistrées
*/
private $exceptions;
/**
* Détermine si l'on affiche ou nom le contexte
* Détermine si l'on affiche ou nom le contexte
*/
private $contexte;
/**
* Definit si php est lancé en ligne de commande ou en mode serveur
* Definit si php est lancé en ligne de commande ou en mode serveur
*/
private $mode;
/**
* le gestionnaire d'exception est un singleton
* et possède donc un "pointeur statique sur lui-même"
* et poss�de donc un "pointeur statique sur lui-m�me"
*/
private static $gestionnaireException ;
/**
* Constructeur avec paramètres optionnel
* Constructeur avec paramètres optionnel
* @param bool indique si l'on veut afficher ou non le contexte des exceptions (i.e. la trace)
*/
public function __construct($contexte = false) {
45,7 → 51,7
}
/**
* Renvoie le booleen définissant si l'on affiche le contexte ou non
* Renvoie le booleen définissant si l'on affiche le contexte ou non
*/
public function getContexte() {
return $this->contexte;
53,13 → 59,13
/**
* Definit si l'on veut afficher le contexte ou non
* @param bool true si on veut afficher le contexte, false sinon, par défaut vaut false
* @param bool true si on veut afficher le contexte, false sinon, par défaut vaut false
*/
public function setContexte($contexte) {
$this->contexte = $contexte;
}
/** Fonction d'accès au singleton
/** Fonction d'accès au singleton
* @return GestionnaireErreur le gestionnaire d'exceptions courant
*/
public static function getInstance()
72,7 → 78,7
}
/**
* Fonction de gestion des exceptions, remplace le handler par défaut
* Fonction de gestion des exceptions, remplace le handler par défaut
*/
public static function gererException(Exception $e) {
/trunk/framework/Controleur.php
1,22 → 1,9
<?php
// declare(encoding='UTF-8');
/**
* Fichier contenant la classe controleur
*
* PHP Version 5
*
* @category PHP
* @package Framework
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/framework/
*/
 
/**
* classe Controlleur, coeur d'une application, c'est normalement la seule classe d'une application
* qui devrait être appelée de l'extérieur.
* Elle est abstraite donc doit obligatoirement être étendue
* qui devrait être appelée de l'extérieur.
* Elle est abstraite donc doit obligatoirement être étendue
*
* PHP Version 5
*
26,7 → 13,7
* @copyright 2009 Tela-Botanica
* @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 SVN: $Id$
* @version SVN: $$Id$$
* @link /doc/framework/
*
*/
45,7 → 32,7
private $_gestionnaire_erreur;
/**
* Constructeur par défaut
* Constructeur par défaut
*/
final public function __construct() {
if (Config::existe('fw_html_errors')) {
62,11 → 49,11
}
/**
* Charge un modele donné et le rend disponible sous la forme $this->nom_modele
* Charge un modele donné et le rend disponible sous la forme $this->nom_modele
*
* @param string $nom_modele le nom du modèle à charger
* @param string $nom_modele le nom du modèle à charger
*
* @return boolean false si le chargement à échoué, rien sinon
* @return boolean false si le chargement a échoué, rien sinon
*/
final protected function chargerModele($nom_modele) {
86,9 → 73,9
}
/**
* Fonction prenant en paramètre le nom d'un squelette et un tableau associatif de données,
* Fonction prenant en paramètre le nom d'un squelette et un tableau associatif de données,
* en extrait les variables, charge le squelette
* et cree une variable de classe contenant les deux combinés.
* et cree une variable de classe contenant les deux combinés.
*
* @param String $nom_squelette le nom du squelette
* @param Array $donnees un tableau associatif contenant les variables a injecter dans la vue
104,13 → 91,13
$donnees['base_url'] = $this->registre->get('base_url_application');
// on extrait les variables du tableau de données
// on extrait les variables du tableau de données
extract($donnees);
// et on enclenche la bufferisation de sortie
ob_start();
// si les tags courts sont désactivés
// si les tags courts sont désactivés
if ((bool) @ini_get('short_open_tag') === false) {
// on remplace les tags par la syntaxe classique avec echo
echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($chemin_squelette))));
119,10 → 106,10
include $chemin_squelette;
}
// on récupère le buffer et on le vide
// on récupère le buffer et on le vide
$tampon = ob_get_contents();
@ob_end_clean();
// enfin on renvoie le contenu
$this->$nom_squelette = $tampon;
}
/trunk/framework/GestionnaireErreur.php
1,61 → 1,23
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 5.0.4 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2005 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | This file is part of eFlore-Debogage. |
// | |
// | Foobar is free software; you can redistribute it and/or modify |
// | it under the terms of the GNU General Public License as published by |
// | the Free Software Foundation; either version 2 of the License, or |
// | (at your option) any later version. |
// | |
// | Foobar is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// | GNU General Public License for more details. |
// | |
// | You should have received a copy of the GNU General Public License |
// | along with Foobar; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id$
// declare(encoding='UTF-8');
/**
* Classe de gestion des erreurs.
*
* classe de gestion des erreurs.
*
*
*@package eFlore
*@subpackage Debogage
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author aucun
*@copyright Tela-Botanica 2000-2005
*@version $Revision$ $Date$
// +------------------------------------------------------------------------------------------------------+
* PHP Version 5
*
* @category Class
* @package Framework
* @author Jean-Pascal Milcent <jpm@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @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 SVN: $$Id$$
* @link /doc/framework/
*
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTETE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
/**
* Classe GestionnaireErreur
*
* Gérer les erreurs PHP et SQL.
*/
class GestionnaireErreur
{
/*** Attributes: ***/
/*** Attributs: ***/
 
/**
* Permet de savoir si on utilise PHP en ligne de commande dans une console (PHP-CLI) ou en mode module de serveur.
70,14 → 32,14
private $erreurs;
 
/**
* Permet de savoir si on veut faire apparaître ou pas le contexte de l'erreur,
* c'est à dire le contenu des variables.
* Permet de savoir si on veut faire apparaître ou pas le contexte de l'erreur,
* c'est à dire le contenu des variables.
* @access private
*/
private $contexte;
/**
* Contient le niveau d'erreur courant. Celui que l'on donne à la fonction
* Contient le niveau d'erreur courant. Celui que l'on donne à la fonction
* error_reporting().
* @access private
*/
106,7 → 68,7
}
/**
* Fonction d'accès au singleton
* Fonction d'accès au singleton
* @return GestionnaireErreur le gestionnaire d'erreurs courant
*/
public static function getInstance()
120,7 → 82,7
/*** Accesseurs: ***/
/**
* Récupère le tableau des erreurs.
* Récupère le tableau des erreurs.
*
* @return array
* @access public
130,7 → 92,7
}
 
/**
* Ajoute une erreur à la liste.
* Ajoute une erreur à la liste.
*
* @param array une_erreur
* @return void
141,7 → 103,7
}
 
/**
* Récupère la valeur du contexte.
* Récupère la valeur du contexte.
*
* @return boolean
* @access public
151,7 → 113,7
}
 
/**
* Définit si oui ou non le contexte sera affiché.
* Définit si oui ou non le contexte sera affiché.
*
* @param boolean un_contexte
* @return void
162,7 → 124,7
}
/**
* Récupère le niveau d'erreur courrant.
* Récupère le niveau d'erreur courrant.
*
* @return int le niveau d'erreur courrant.
* @access public
172,7 → 134,7
}
 
/**
* Définit le niveau d'erreur courrant.
* Définit le niveau d'erreur courrant.
*
* @param int un niveau d'erreur.
* @return void
183,7 → 145,7
}
/**
* Définit le niveau d'erreur courrant (synonyme fonction precedente)
* Définit le niveau d'erreur courrant (synonyme fonction precedente)
*
* @param int un niveau d'erreur.
* @return void
194,7 → 156,7
}
/*** Méthodes : ***/
/*** Méthodes : ***/
/**
*
209,7 → 171,7
public function gererErreur($niveau, $message, $fichier, $ligne, $contexte)
{
$aso_erreur = array();
// Nous vérifions si nous affichons ou pas l'erreur en fonction du niveau demandé
// Nous vérifions si nous affichons ou pas l'erreur en fonction du niveau demandé
if ( $niveau <= $this->getNiveauErreurCourant() ) {
$aso_erreur['niveau'] = $niveau;
switch ($niveau) {
234,7 → 196,7
echo print_r($this->erreurs,true) ;
exit() ;
// Si nous avons à faire à une erreur et non à un warning ou une notice, nous arrêtons l'exécution du script
// Si nous avons affaire à une erreur et non à un warning ou une notice, nous arrêtons l'exécution du script
switch ($niveau) {
case E_ERROR :
case E_USER_ERROR :
244,7 → 206,7
}
 
/**
* Retourne l'erreur PHP formatée en XHTML.
* Retourne l'erreur PHP formatée en XHTML.
*
* @return string
* @access public
309,7 → 271,7
}
 
/**
* Retourne l'erreur SQL formatée en XHTML.
* Retourne l'erreur SQL formatée en XHTML.
*
* @param string fichier
* @param int ligne
327,7 → 289,7
case 'cli' :
$retour .= 'ERREUR SQL '."\n";
$retour .= 'Fichier : '.$fichier."\n";
$retour .= 'Méthode : '.$methode."\n";
$retour .= 'Méthode : '.$methode."\n";
$retour .= 'Message : '.$message."\n";
if (!is_null($requete)) {
$retour .= 'Requete : '."\n";
347,7 → 309,7
$retour .= '<dt> Fichier : </dt> ';
$retour .= '<dd> '.$fichier.'</dd>'."\n";
$retour .= '<dt> Méthode : </dt> ';
$retour .= '<dt> Méthode : </dt> ';
$retour .= '<dd> '.$methode.'</dd>'."\n";
$retour .= '<dt> Message erreur : </dt> ';
/trunk/framework/autoload.inc.php
1,6 → 1,7
<?php
// declare(encoding='UTF-8');
/**
* Fichier contenant la fonction de chargement automatique de classes, il doit toujours rester à la racine
* Fichier contenant la fonction de chargement automatique de classes, il doit toujours rester à la racine
* du framework car il initialise le chemin de l'application en se basant sur son propre emplacement.
*
* PHP Version 5.1.2
17,11 → 18,11
* @copyright 1999-2009 Tela Botanica (accueil@tela-botanica.org)
*/
 
// Redéfinition de la constante DIRECTORY_SEPARATOR
// Redéfinition de la constante DIRECTORY_SEPARATOR
if (!defined('DS')) {
define('DS', DIRECTORY_SEPARATOR);
}
// Redéfinition de la constante PATH_SEPARATOR
// Redéfinition de la constante PATH_SEPARATOR
if (!defined('PS')) {
define('PS', PATH_SEPARATOR);
}
36,7 → 37,7
}
spl_autoload_register('autoloadFw');
 
// Autoload par défaut pour l'application
// Autoload par défaut pour l'application
function autoloadAppliDefaut($nom_classe) {
$dossiers_classes = array( Config::get('chemin_controleurs'),
Config::get('chemin_modeles'),
52,7 → 53,7
}
spl_autoload_register('autoloadAppliDefaut');
 
// Autoload définit par l'application
// Autoload défini par l'application
if (function_exists('__autoload')) {
spl_autoload_register('__autoload');
}
/trunk/framework/Url.php
1,102 → 1,81
<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2007-2008, Christian Schmidt, Peytz & Co. A/S |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// | |
// +-----------------------------------------------------------------------+
// | Author: Christian Schmidt <schmidt at php dot net> |
// +-----------------------------------------------------------------------+
//
// $Id$
//
// Net_URL2 Class (PHP5 Only)
 
// This code is released under the BSD License - http://www.opensource.org/licenses/bsd-license.php
// declare(encoding='UTF-8');
/**
* @license BSD License
*/
* classe Url, gérant le découpage des paramètres, leurs modification etc...
* Traduction et conversion d'une classe (NET_Url2) issue de Pear
*
* PHP Version 5
*
* @category Class
* @package Framework
// auteur principal
* @author Christian Schmidt <schmidt@php.net>
// autre auteurs
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @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 SVN: $Id$
* @link /doc/framework/
*
*/
class Url
{
/**
* Do strict parsing in resolve() (see RFC 3986, section 5.2.2). Default
* is true.
* Parsing strict dans resoudre() (voir RFC 3986, section 5.2.2). Par défaut
* à true.
*/
const OPTION_STRICT = 'strict';
const OPTION_STRICTE = 'strict';
 
/**
* Represent arrays in query using PHP's [] notation. Default is true.
* Répresenter les tableaux dans les requêtes en utilisant la notation php []. Par défaut à true.
*/
const OPTION_USE_BRACKETS = 'use_brackets';
const OPTION_UTILISER_CROCHETS = 'use_brackets';
 
/**
* URL-encode query variable keys. Default is true.
* URL-encoder les clés des variables dans les requêtes. Par défaut à true.
*/
const OPTION_ENCODE_KEYS = 'encode_keys';
const OPTION_ENCODER_CLES = 'encode_keys';
 
/**
* Query variable separators when parsing the query string. Every character
* is considered a separator. Default is specified by the
* arg_separator.input php.ini setting (this defaults to "&").
* Séparateurs de variables lors du parsing de la requête. Chaque caractère
* est considéré comme un séparateur. Par défaut, spécifié par le paramêtre
* arg_separator.input dans php.ini (par défaut "&").
*/
const OPTION_SEPARATOR_INPUT = 'input_separator';
const OPTION_SEPARATEUR_ENTREE = 'input_separator';
 
/**
* Query variable separator used when generating the query string. Default
* is specified by the arg_separator.output php.ini setting (this defaults
* to "&").
* Séparateur de variables lors de la génération de la requête. Par défaut, spécifié
* par le paramètre arg_separator.output dans php.ini (par défaut "&").
*/
const OPTION_SEPARATOR_OUTPUT = 'output_separator';
const OPTION_SEPARATEUR_SORTIE = 'output_separator';
 
/**
* Default options corresponds to how PHP handles $_GET.
* Options par défaut correspondant au comportement de php
* vis à vis de $_GET
*/
private $options = array(
self::OPTION_STRICT => true,
self::OPTION_USE_BRACKETS => true,
self::OPTION_ENCODE_KEYS => true,
self::OPTION_SEPARATOR_INPUT => 'x&',
self::OPTION_SEPARATOR_OUTPUT => 'x&',
self::OPTION_STRICTE => true,
self::OPTION_UTILISER_CROCHETS => true,
self::OPTION_ENCODER_CLES => true,
self::OPTION_SEPARATEUR_ENTREE => 'x&',
self::OPTION_SEPARATEUR_SORTIE => 'x&',
);
 
/**
* @var string|bool
*/
private $scheme = false;
private $schema = false;
 
/**
* @var string|bool
*/
private $userinfo = false;
private $infoUtilisateur = false;
 
/**
* @var string|bool
*/
private $host = false;
private $hote = false;
 
/**
* @var int|bool
106,12 → 85,12
/**
* @var string
*/
private $path = '';
private $chemin = '';
 
/**
* @var string|bool
*/
private $query = false;
private $requete = false;
 
/**
* @var string|bool
119,37 → 98,37
private $fragment = false;
 
/**
* @param string $url an absolute or relative URL
* @param string $url une URL relative ou absolue
* @param array $options
*/
public function __construct($url, $options = null)
{
$this->setOption(self::OPTION_SEPARATOR_INPUT,
$this->setOption(self::OPTION_SEPARATEUR_ENTREE,
ini_get('arg_separator.input'));
$this->setOption(self::OPTION_SEPARATOR_OUTPUT,
$this->setOption(self::OPTION_SEPARATEUR_SORTIE,
ini_get('arg_separator.output'));
if (is_array($options)) {
foreach ($options as $optionName => $value) {
$this->setOption($optionName);
foreach ($options as $nomOption => $valeur) {
$this->setOption($nomOption);
}
}
 
if (preg_match('@^([a-z][a-z0-9.+-]*):@i', $url, $reg)) {
$this->scheme = $reg[1];
$this->schema = $reg[1];
$url = substr($url, strlen($reg[0]));
}
 
if (preg_match('@^//([^/#?]+)@', $url, $reg)) {
$this->setAuthority($reg[1]);
$this->setAutorite($reg[1]);
$url = substr($url, strlen($reg[0]));
}
 
$i = strcspn($url, '?#');
$this->path = substr($url, 0, $i);
$this->chemin = substr($url, 0, $i);
$url = substr($url, $i);
 
if (preg_match('@^\?([^#]*)@', $url, $reg)) {
$this->query = $reg[1];
$this->requete = $reg[1];
$url = substr($url, strlen($reg[0]));
}
 
159,103 → 138,102
}
 
/**
* Returns the scheme, e.g. "http" or "urn", or false if there is no
* scheme specified, i.e. if this is a relative URL.
* Retourne le schéma, c.a.d. "http" ou "urn", ou false si aucun schéma n'est
* spécifié, i.e. l'url est une url relative
*
* @return string|bool
*/
public function getScheme()
public function getSchema()
{
return $this->scheme;
return $this->schema;
}
 
/**
* @param string|bool $scheme
* @param string|bool $schema
*
* @return void
* @see getScheme()
* @see getSchema()
*/
public function setScheme($scheme)
public function setSchema($schema)
{
$this->scheme = $scheme;
$this->schema = $schema;
}
 
/**
* Returns the user part of the userinfo part (the part preceding the first
* ":"), or false if there is no userinfo part.
* renvoie la partie user de la partie infoUtilisateur (partie précédant le premier
* ":"), ou false si aucune partie infoUtilisateur n'est définie.
*
* @return string|bool
*/
public function getUser()
public function getUtilisateur()
{
return $this->userinfo !== false ? preg_replace('@:.*$@', '', $this->userinfo) : false;
return $this->infoUtilisateur !== false ? preg_replace('@:.*$@', '', $this->infoUtilisateur) : false;
}
 
/**
* Returns the password part of the userinfo part (the part after the first
* ":"), or false if there is no userinfo part (i.e. the URL does not
* contain "@" in front of the hostname) or the userinfo part does not
* contain ":".
* renvoie la partie mot de passe de la partie infoUtilisateur (partie après le premier
* ":"), , ou false si aucune partie infoUtilisateur n'est définie (i.e. l'URL ne contient
* pas de "@" en face du nom d'hôte) ou si la partie infoUtilisateur ne contient pas de ":".
*
* @return string|bool
*/
public function getPassword()
public function getMotDePasse()
{
return $this->userinfo !== false ? substr(strstr($this->userinfo, ':'), 1) : false;
return $this->infoUtilisateur !== false ? substr(strstr($this->infoUtilisateur, ':'), 1) : false;
}
 
/**
* Returns the userinfo part, or false if there is none, i.e. if the
* authority part does not contain "@".
* Renvoie la partie userinfio, ou false si celle-ci n'existe pas, i.e. si la partie
* autorité ne contient pas de "@"
*
* @return string|bool
*/
public function getUserinfo()
public function getInfoUtilisateur()
{
return $this->userinfo;
return $this->infoUtilisateur;
}
 
/**
* Sets the userinfo part. If two arguments are passed, they are combined
* in the userinfo part as username ":" password.
* Setteur pour la partie infoUtilisateur. Si deux argument sont passé, ils sont combinés
* dans la partie infoUtilisateur de cette manière username ":" password.
*
* @param string|bool $userinfo userinfo or username
* @param string|bool $password
* @param string|bool $infoUtilisateur infoUtilisateur ou username
* @param string|bool $motDePasse
*
* @return void
*/
public function setUserinfo($userinfo, $password = false)
public function setInfoUtilisateur($infoUtilisateur, $motDePasse = false)
{
$this->userinfo = $userinfo;
if ($password !== false) {
$this->userinfo .= ':' . $password;
$this->infoUtilisateur = $infoUtilisateur;
if ($motDePasse !== false) {
$this->infoUtilisateur .= ':' . $motDePasse;
}
}
 
/**
* Returns the host part, or false if there is no authority part, e.g.
* relative URLs.
* Renvoie la partie hôte, ou false s'il n'y a pas de partie autorité, c.a.d.
* l'URL est relative.
*
* @return string|bool
*/
public function getHost()
public function getHote()
{
return $this->host;
return $this->hote;
}
 
/**
* @param string|bool $host
* @param string|bool $hote
*
* @return void
*/
public function setHost($host)
public function setHote($hote)
{
$this->host = $host;
$this->hote = $hote;
}
 
/**
* Returns the port number, or false if there is no port number specified,
* i.e. if the default port is to be used.
* Renvoie le numéro de port, ou false si aucun numéro de port n'est spécifié,
* i.e. le port par défaut doit utilisé.
*
* @return int|bool
*/
275,49 → 253,49
}
 
/**
* Returns the authority part, i.e. [ userinfo "@" ] host [ ":" port ], or
* false if there is no authority none.
* Renvoie la partie autorité, i.e. [ infoUtilisateur "@" ] hote [ ":" port ], ou
* false si celle-ci est absente.
*
* @return string|bool
*/
public function getAuthority()
public function getAutorite()
{
if (!$this->host) {
if (!$this->hote) {
return false;
}
 
$authority = '';
$autorite = '';
 
if ($this->userinfo !== false) {
$authority .= $this->userinfo . '@';
if ($this->infoUtilisateur !== false) {
$autorite .= $this->infoUtilisateur . '@';
}
 
$authority .= $this->host;
$autorite .= $this->hote;
 
if ($this->port !== false) {
$authority .= ':' . $this->port;
$autorite .= ':' . $this->port;
}
 
return $authority;
return $autorite;
}
 
/**
* @param string|false $authority
* @param string|false $autorite
*
* @return void
*/
public function setAuthority($authority)
public function setAutorite($autorite)
{
$this->user = false;
$this->pass = false;
$this->host = false;
$this->hote = false;
$this->port = false;
if (preg_match('@^(([^\@]+)\@)?([^:]+)(:(\d*))?$@', $authority, $reg)) {
if (preg_match('@^(([^\@]+)\@)?([^:]+)(:(\d*))?$@', $autorite, $reg)) {
if ($reg[1]) {
$this->userinfo = $reg[2];
$this->infoUtilisateur = $reg[2];
}
 
$this->host = $reg[3];
$this->hote = $reg[3];
if (isset($reg[5])) {
$this->port = intval($reg[5]);
}
325,50 → 303,50
}
 
/**
* Returns the path part (possibly an empty string).
* Renvoie la partie chemin (chemin) (éventuellement vide).
*
* @return string
*/
public function getPath()
public function getChemin()
{
return $this->path;
return $this->chemin;
}
 
/**
* @param string $path
* @param string $chemin
*
* @return void
*/
public function setPath($path)
public function setChemin($chemin)
{
$this->path = $path;
$this->chemin = $chemin;
}
 
/**
* Returns the query string (excluding the leading "?"), or false if "?"
* isn't present in the URL.
* renvoie la chaine de requête (requete string) (sans le premier "?"), ou false si "?"
* n'est pas présent dans l'url.
*
* @return string|bool
* @see self::getQueryVariables()
* @see self::getVariablesRequete()
*/
public function getQuery()
public function getRequete()
{
return $this->query;
return $this->requete;
}
 
/**
* @param string|bool $query
* @param string|bool $requete
*
* @return void
* @see self::setQueryVariables()
* @see self::setVariablesRequete()
*/
public function setQuery($query)
public function setRequete($requete)
{
$this->query = $query;
$this->requete = $requete;
}
 
/**
* Returns the fragment name, or false if "#" isn't present in the URL.
* Renvoie le nom du fragment, ou false si "#" n'est pas present dans l'URL.
*
* @return string|bool
*/
388,141 → 366,141
}
 
/**
* Returns the query string like an array as the variables would appear in
* $_GET in a PHP script.
* Renvoie la requete string sous forme d'un tableau de variables telles qu'elles apparaitraient
* dans le $_GET d'un script PHP
*
* @return array
*/
public function getQueryVariables()
public function getVariablesRequete()
{
$pattern = '/[' .
preg_quote($this->getOption(self::OPTION_SEPARATOR_INPUT), '/') .
preg_quote($this->getOption(self::OPTION_SEPARATEUR_ENTREE), '/') .
']/';
$parts = preg_split($pattern, $this->query, -1, PREG_SPLIT_NO_EMPTY);
$return = array();
$parties = preg_split($pattern, $this->requete, -1, PREG_SPLIT_NO_EMPTY);
$retour = array();
 
foreach ($parts as $part) {
if (strpos($part, '=') !== false) {
list($key, $value) = explode('=', $part, 2);
foreach ($parties as $partie) {
if (strpos($partie, '=') !== false) {
list($cle, $valeur) = explode('=', $partie, 2);
} else {
$key = $part;
$value = null;
$cle = $partie;
$valeur = null;
}
 
if ($this->getOption(self::OPTION_ENCODE_KEYS)) {
$key = rawurldecode($key);
if ($this->getOption(self::OPTION_ENCODER_CLES)) {
$cle = rawurldecode($cle);
}
$value = rawurldecode($value);
$valeur = rawurldecode($valeur);
 
if ($this->getOption(self::OPTION_USE_BRACKETS) &&
preg_match('#^(.*)\[([0-9a-z_-]*)\]#i', $key, $matches)) {
if ($this->getOption(self::OPTION_UTILISER_CROCHETS) &&
preg_match('#^(.*)\[([0-9a-z_-]*)\]#i', $cle, $matches)) {
 
$key = $matches[1];
$cle = $matches[1];
$idx = $matches[2];
 
// Ensure is an array
if (empty($return[$key]) || !is_array($return[$key])) {
$return[$key] = array();
// On s'assure que c'est bien un tableau
if (empty($retour[$cle]) || !is_array($retour[$cle])) {
$retour[$cle] = array();
}
 
// Add data
// Ajout des données
if ($idx === '') {
$return[$key][] = $value;
$retour[$cle][] = $valeur;
} else {
$return[$key][$idx] = $value;
$retour[$cle][$idx] = $valeur;
}
} elseif (!$this->getOption(self::OPTION_USE_BRACKETS)
&& !empty($return[$key])
} elseif (!$this->getOption(self::OPTION_UTILISER_CROCHETS)
&& !empty($retour[$cle])
) {
$return[$key] = (array) $return[$key];
$return[$key][] = $value;
$retour[$cle] = (array) $retour[$cle];
$retour[$cle][] = $valeur;
} else {
$return[$key] = $value;
$retour[$cle] = $valeur;
}
}
 
return $return;
return $retour;
}
 
/**
* @param array $array (name => value) array
* @param array $tableau (nom => valeur) tableau
*
* @return void
*/
public function setQueryVariables(array $array)
public function setVariablesRequete(array $tableau)
{
if (!$array) {
$this->query = false;
if (!$tableau) {
$this->requete = false;
} else {
foreach ($array as $name => $value) {
if ($this->getOption(self::OPTION_ENCODE_KEYS)) {
$name = rawurlencode($name);
foreach ($tableau as $nom => $valeur) {
if ($this->getOption(self::OPTION_ENCODER_CLES)) {
$nom = rawurlencode($nom);
}
 
if (is_array($value)) {
foreach ($value as $k => $v) {
$parts[] = $this->getOption(self::OPTION_USE_BRACKETS)
? sprintf('%s[%s]=%s', $name, $k, $v)
: ($name . '=' . $v);
if (is_array($valeur)) {
foreach ($valeur as $k => $v) {
$parties[] = $this->getOption(self::OPTION_UTILISER_CROCHETS)
? sprintf('%s[%s]=%s', $nom, $k, $v)
: ($nom . '=' . $v);
}
} elseif (!is_null($value)) {
$parts[] = $name . '=' . $value;
} elseif (!is_null($valeur)) {
$parties[] = $nom . '=' . $valeur;
} else {
$parts[] = $name;
$parties[] = $nom;
}
}
$this->query = implode($this->getOption(self::OPTION_SEPARATOR_OUTPUT),
$parts);
$this->requete = implode($this->getOption(self::OPTION_SEPARATEUR_SORTIE),
$parties);
}
}
 
/**
* @param string $name
* @param mixed $value
* @param string $nom
* @param mixed $valeur
*
* @return array
*/
public function setQueryVariable($name, $value)
public function setVariableRequete($nom, $valeur)
{
$array = $this->getQueryVariables();
$array[$name] = $value;
$this->setQueryVariables($array);
$tableau = $this->getVariablesRequete();
$tableau[$nom] = $valeur;
$this->setVariablesRequete($tableau);
}
 
/**
* @param string $name
* @param string $nom
*
* @return void
*/
public function unsetQueryVariable($name)
public function unsetVariableRequete($nom)
{
$array = $this->getQueryVariables();
unset($array[$name]);
$this->setQueryVariables($array);
$tableau = $this->getVariablesRequete();
unset($tableau[$nom]);
$this->setVariablesRequete($tableau);
}
 
/**
* Returns a string representation of this URL.
* Renvoie un représentation sous forme de chaine de l'URL
*
* @return string
*/
public function getURL()
{
// See RFC 3986, section 5.3
// Voir RFC 3986, section 5.3
$url = "";
 
if ($this->scheme !== false) {
$url .= $this->scheme . ':';
if ($this->schema !== false) {
$url .= $this->schema . ':';
}
 
$authority = $this->getAuthority();
if ($authority !== false) {
$url .= '//' . $authority;
$autorite = $this->getAutorite();
if ($autorite !== false) {
$url .= '//' . $autorite;
}
$url .= $this->path;
$url .= $this->chemin;
 
if ($this->query !== false) {
$url .= '?' . $this->query;
if ($this->requete !== false) {
$url .= '?' . $this->requete;
}
 
if ($this->fragment !== false) {
533,215 → 511,215
}
 
/**
* Returns a normalized string representation of this URL. This is useful
* for comparison of URLs.
* Renvoie une représentation de cette URL sous forme de chaine normalisée. Utile pour la
* comparaison d'URLs
*
* @return string
*/
public function getNormalizedURL()
public function getURLNormalisee()
{
$url = clone $this;
$url->normalize();
$url->normaliser();
return $url->getUrl();
}
 
/**
* Returns a normalized Net_URL2 instance.
* Renvoie une instance normalisée de Url
*
* @return Net_URL2
* @return Url
*/
public function normalize()
public function normaliser()
{
// See RFC 3886, section 6
 
// Schemes are case-insensitive
if ($this->scheme) {
$this->scheme = strtolower($this->scheme);
// les cchémas sont insesibles à la casse
if ($this->schema) {
$this->schema = strtolower($this->schema);
}
 
// Hostnames are case-insensitive
if ($this->host) {
$this->host = strtolower($this->host);
// les noms d'hotes sont insensibles à la casse
if ($this->hote) {
$this->hote = strtolower($this->hote);
}
 
// Remove default port number for known schemes (RFC 3986, section 6.2.3)
// Supprimer le numéro de port par défaut pour les schemas connus (RFC 3986, section 6.2.3)
if ($this->port &&
$this->scheme &&
$this->port == getservbyname($this->scheme, 'tcp')) {
$this->schema &&
$this->port == getservbyname($this->schema, 'tcp')) {
 
$this->port = false;
}
 
// Normalize case of %XX percentage-encodings (RFC 3986, section 6.2.2.1)
foreach (array('userinfo', 'host', 'path') as $part) {
if ($this->$part) {
$this->$part = preg_replace('/%[0-9a-f]{2}/ie', 'strtoupper("\0")', $this->$part);
// normalisation dans le cas d'un encodage avec %XX pourcentage (RFC 3986, section 6.2.2.1)
foreach (array('infoUtilisateur', 'hote', 'chemin') as $partie) {
if ($this->$partie) {
$this->$partie = preg_replace('/%[0-9a-f]{2}/ie', 'strtoupper("\0")', $this->$partie);
}
}
 
// Path segment normalization (RFC 3986, section 6.2.2.3)
$this->path = self::removeDotSegments($this->path);
// normalisation des segments du chemin (RFC 3986, section 6.2.2.3)
$this->chemin = self::supprimerSegmentsAPoints($this->chemin);
 
// Scheme based normalization (RFC 3986, section 6.2.3)
if ($this->host && !$this->path) {
$this->path = '/';
// normalisation basée sur le schéma (RFC 3986, section 6.2.3)
if ($this->hote && !$this->chemin) {
$this->chemin = '/';
}
}
 
/**
* Returns whether this instance represents an absolute URL.
* Renvoie vrai ou faux suivant que l'instance en cours représente une URL relative ou absolue.
*
* @return bool
*/
public function isAbsolute()
public function etreAbsolue()
{
return (bool) $this->scheme;
return (bool) $this->schema;
}
 
/**
* Returns an Net_URL2 instance representing an absolute URL relative to
* this URL.
* Renvoie une instance de Url représentant une URL absolue relative à
* cette URL.
*
* @param Net_URL2|string $reference relative URL
* @param Url|string $reference URL relative
*
* @return Net_URL2
* @return Url
*/
public function resolve($reference)
public function resoudre($reference)
{
if (is_string($reference)) {
$reference = new self($reference);
}
if (!$this->isAbsolute()) {
throw new Exception('Base-URL must be absolute');
if (!$this->etreAbsolue()) {
throw new Exception('L\'URL de base doit être absolue !');
}
 
// A non-strict parser may ignore a scheme in the reference if it is
// identical to the base URI's scheme.
if (!$this->getOption(self::OPTION_STRICT) && $reference->scheme == $this->scheme) {
$reference->scheme = false;
// Un parseur non strict peut choisir d'ignorer un schema dans la référence
// si celui ci est identique au schéma de base de l'URI.
if (!$this->getOption(self::OPTION_STRICTE) && $reference->schema == $this->schema) {
$reference->schema = false;
}
 
$target = new self('');
if ($reference->scheme !== false) {
$target->scheme = $reference->scheme;
$target->setAuthority($reference->getAuthority());
$target->path = self::removeDotSegments($reference->path);
$target->query = $reference->query;
$cible = new self('');
if ($reference->schema !== false) {
$cible->schema = $reference->schema;
$cible->setAutorite($reference->getAutorite());
$cible->chemin = self::supprimerSegmentsAPoints($reference->chemin);
$cible->requete = $reference->requete;
} else {
$authority = $reference->getAuthority();
if ($authority !== false) {
$target->setAuthority($authority);
$target->path = self::removeDotSegments($reference->path);
$target->query = $reference->query;
$autorite = $reference->getAutorite();
if ($autorite !== false) {
$cible->setAutorite($autorite);
$cible->chemin = self::supprimerSegmentsAPoints($reference->chemin);
$cible->requete = $reference->requete;
} else {
if ($reference->path == '') {
$target->path = $this->path;
if ($reference->query !== false) {
$target->query = $reference->query;
if ($reference->chemin == '') {
$cible->chemin = $this->chemin;
if ($reference->requete !== false) {
$cible->requete = $reference->requete;
} else {
$target->query = $this->query;
$cible->requete = $this->requete;
}
} else {
if (substr($reference->path, 0, 1) == '/') {
$target->path = self::removeDotSegments($reference->path);
if (substr($reference->chemin, 0, 1) == '/') {
$cible->chemin = self::supprimerSegmentsAPoints($reference->chemin);
} else {
// Merge paths (RFC 3986, section 5.2.3)
if ($this->host !== false && $this->path == '') {
$target->path = '/' . $this->path;
// Concaténation chemins (RFC 3986, section 5.2.3)
if ($this->hote !== false && $this->chemin == '') {
$cible->chemin = '/' . $this->chemin;
} else {
$i = strrpos($this->path, '/');
$i = strrpos($this->chemin, '/');
if ($i !== false) {
$target->path = substr($this->path, 0, $i + 1);
$cible->chemin = substr($this->chemin, 0, $i + 1);
}
$target->path .= $reference->path;
$cible->chemin .= $reference->chemin;
}
$target->path = self::removeDotSegments($target->path);
$cible->chemin = self::supprimerSegmentsAPoints($cible->chemin);
}
$target->query = $reference->query;
$cible->requete = $reference->requete;
}
$target->setAuthority($this->getAuthority());
$cible->setAutorite($this->getAutorite());
}
$target->scheme = $this->scheme;
$cible->schema = $this->schema;
}
 
$target->fragment = $reference->fragment;
$cible->fragment = $reference->fragment;
 
return $target;
return $cible;
}
 
/**
* Removes dots as described in RFC 3986, section 5.2.4, e.g.
* La suppression des segments à points est décrite dans la RFC 3986, section 5.2.4, e.g.
* "/foo/../bar/baz" => "/bar/baz"
*
* @param string $path a path
* @param string $chemin un chemin
*
* @return string a path
* @return string un chemin
*/
private static function removeDotSegments($path)
private static function supprimerSegmentsAPoints($chemin)
{
$output = '';
$sortie = '';
 
// Make sure not to be trapped in an infinite loop due to a bug in this
// method
// Assurons de ne pas nous retrouver piégés dans une boucle infinie due à un bug de
// cette méthode
$j = 0;
while ($path && $j++ < 100) {
// Step A
if (substr($path, 0, 2) == './') {
$path = substr($path, 2);
} elseif (substr($path, 0, 3) == '../') {
$path = substr($path, 3);
while ($chemin && $j++ < 100) {
// Étape A
if (substr($chemin, 0, 2) == './') {
$chemin = substr($chemin, 2);
} elseif (substr($chemin, 0, 3) == '../') {
$chemin = substr($chemin, 3);
 
// Step B
} elseif (substr($path, 0, 3) == '/./' || $path == '/.') {
$path = '/' . substr($path, 3);
// Étape B
} elseif (substr($chemin, 0, 3) == '/./' || $chemin == '/.') {
$chemin = '/' . substr($chemin, 3);
 
// Step C
} elseif (substr($path, 0, 4) == '/../' || $path == '/..') {
$path = '/' . substr($path, 4);
$i = strrpos($output, '/');
$output = $i === false ? '' : substr($output, 0, $i);
// Étape C
} elseif (substr($chemin, 0, 4) == '/../' || $chemin == '/..') {
$chemin = '/' . substr($chemin, 4);
$i = strrpos($sortie, '/');
$sortie = $i === false ? '' : substr($sortie, 0, $i);
 
// Step D
} elseif ($path == '.' || $path == '..') {
$path = '';
// Étape D
} elseif ($chemin == '.' || $chemin == '..') {
$chemin = '';
 
// Step E
// Étape E
} else {
$i = strpos($path, '/');
$i = strpos($chemin, '/');
if ($i === 0) {
$i = strpos($path, '/', 1);
$i = strpos($chemin, '/', 1);
}
if ($i === false) {
$i = strlen($path);
$i = strlen($chemin);
}
$output .= substr($path, 0, $i);
$path = substr($path, $i);
$sortie .= substr($chemin, 0, $i);
$chemin = substr($chemin, $i);
}
}
 
return $output;
return $sortie;
}
 
/**
* Returns a Net_URL2 instance representing the canonical URL of the
* currently executing PHP script.
* Renvoie une instance de Url representant l'URL canonique du script PHP
* en cours d'éxécution
*
* @return string
*/
public static function getCanonical()
public static function getCanonique()
{
if (!isset($_SERVER['REQUEST_METHOD'])) {
// ALERT - no current URL
throw new Exception('Script was not called through a webserver');
// ALERT - pas d'URL en cours
throw new Exception('Le script n\'a pas été appellé à travers un serveur web');
}
 
// Begin with a relative URL
// on part d'une URL relative
$url = new self($_SERVER['PHP_SELF']);
$url->scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http';
$url->host = $_SERVER['SERVER_NAME'];
$url->schema = isset($_SERVER['HTTPS']) ? 'https' : 'http';
$url->hote = $_SERVER['SERVER_NAME'];
$port = intval($_SERVER['SERVER_PORT']);
if ($url->scheme == 'http' && $port != 80 ||
$url->scheme == 'https' && $port != 443) {
if ($url->schema == 'http' && $port != 80 ||
$url->schema == 'https' && $port != 443) {
 
$url->port = $port;
}
749,66 → 727,66
}
 
/**
* Returns the URL used to retrieve the current request.
* Renvoie l'URL utilisée pour récupérer la requête en cours
*
* @return string
*/
public static function getRequestedURL()
public static function getURLDemande()
{
return self::getRequested()->getUrl();
return self::getDemande()->getUrl();
}
 
/**
* Returns a Net_URL2 instance representing the URL used to retrieve the
* current request.
* Renvoie une instance de Url representant l'URL utilisée pour
* récupérer la requête en cours
*
* @return Net_URL2
* @return Url
*/
public static function getRequested()
public static function getDemande()
{
if (!isset($_SERVER['REQUEST_METHOD'])) {
// ALERT - no current URL
throw new Exception('Script was not called through a webserver');
// ALERTE - pas d'URL en cours
throw new Exception('Le script n\'a pas été appellé à travers un serveur web');
}
 
// Begin with a relative URL
// On part d'une URL relative
$url = new self($_SERVER['REQUEST_URI']);
$url->scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http';
// Set host and possibly port
$url->setAuthority($_SERVER['HTTP_HOST']);
$url->schema = isset($_SERVER['HTTPS']) ? 'https' : 'http';
// On met à jour les valeurs de l'hote et si possible du port
$url->setAutorite($_SERVER['HTTP_hote']);
return $url;
}
 
/**
* Sets the specified option.
* Met à jour la valeur de l'option spécifiée.
*
* @param string $optionName a self::OPTION_ constant
* @param mixed $value option value
* @param string $nomOption une des constantes commençant par self::OPTION_
* @param mixed $valeur valeur de l'option
*
* @return void
* @see self::OPTION_STRICT
* @see self::OPTION_USE_BRACKETS
* @see self::OPTION_ENCODE_KEYS
* @see self::OPTION_STRICTE
* @see self::OPTION_UTILISER_CROCHETS
* @see self::OPTION_ENCODER_CLES
*/
function setOption($optionName, $value)
function setOption($nomOption, $valeur)
{
if (!array_key_exists($optionName, $this->options)) {
if (!array_key_exists($nomOption, $this->options)) {
return false;
}
$this->options[$optionName] = $value;
$this->options[$nomOption] = $valeur;
}
 
/**
* Returns the value of the specified option.
* Renvoie la valeur de l'option specifiée.
*
* @param string $optionName The name of the option to retrieve
* @param string $nomOption Nom de l'option demandée
*
* @return mixed
*/
function getOption($optionName)
function getOption($nomOption)
{
return isset($this->options[$optionName])
? $this->options[$optionName] : false;
return isset($this->options[$nomOption])
? $this->options[$nomOption] : false;
}
public function __toString() {
/trunk/exemple/modeles/ListeAdmin.php
1,6 → 1,7
<?php
// declare(encoding='UTF-8');
/**
* Modèle d'accès à la base de données des administrateurs
* Modèle d'accès à la base de données des administrateurs
* de papyrus
*/
class listeAdmin extends Modele {
8,7 → 9,7
private $config = array();
/**
* Charge la liste complète des administrateurs
* Charge la liste complète des administrateurs
* return array un tableau contenant des objets d'informations sur les administrateurs
* @return array un tableau d'objets contenant la liste des administrateurs
*/
27,10 → 28,10
}
/**
* Charge les informations liées à un administrateur
* grâce à son id
* Charge les informations liées à un administrateur
* grâce à son id
* @param int l'identifiant de l'administrateur.
* @return object un object contenant les informations de l'administrateur demandé
* @return object un object contenant les informations de l'administrateur demandé
*/
public function loadDetailsAdmin($id) {
$requete = 'SELECT * '.
47,8 → 48,8
/**
* Modifie les informations liées à un administrateur dans la base de données
* Si le mot de passe n'est pas renseigné, il n'est pas changé
* Modifie les informations liées à un administrateur dans la base de données
* Si le mot de passe n'est pas renseigné, il n'est pas changé
* @param int identifiant de l'admiistrateur
* @param string nom
* @param string prenom
74,20 → 75,20
$ligne = $res_nb->fetch();
$nb_admin = $ligne['nb_admin'] ;
} else {
$res['bdd'] = 'Erreur dans la base de données' ;
$res['bdd'] = 'Erreur dans la base de données' ;
return $res;
}
if($nb_admin != 0) {
$res['mail'] = 'Cet email est déjà utilisé par un autre utilisateur' ;
$res['mail'] = 'Cet email est déjà utilisé par un autre utilisateur' ;
}
$query = 'UPDATE gen_annuaire SET ga_ce_i18n='.$this->proteger($lang).', ga_nom='.$this->proteger($nom).',ga_prenom='.
$this->proteger($prenom).',ga_mail='.$this->proteger($mail) ;
// si on a entré quelque chose dans les deux champs de mot de passe
// si on a entré quelque chose dans les deux champs de mot de passe
if($pass != '' || $pass_conf != '') {
// on vérifie si les deux concordent
// on vérifie si les deux concordent
if($pass == $pass_conf) {
// si oui, on les modifie
$query .= ',ga_mot_de_passe='.$this->proteger(md5($pass)) ;
106,7 → 107,7
if($req_maj = $this->requete($query)) {
} else {
$res['bdd'] = 'Erreur de la requête dans la base de données' ;
$res['bdd'] = 'Erreur de la requête dans la base de données' ;
}
return $res;
113,7 → 114,7
}
/**
* Supprime un administrateur ayant un id donnée
* Supprime un administrateur ayant un id donné
* @param int l'identifiant de l'administrateur
* @return array un tableau contenant les erreurs s'il y en a, vide sinon
*/
127,7 → 128,7
$ligne = $res_nb->fetch();
$nb_admin = $ligne['nb_admin'] ;
} else {
$res = 'Erreur dans la base de données' ;
$res = 'Erreur dans la base de donn�es' ;
return $res ;
}
141,13 → 142,13
if($res_supp = $this->requete($query)) {
return $res ;
} else {
$res = 'Erreur dans la base de données' ;
$res = 'Erreur dans la base de données' ;
return $res ;
}
}
/**
* Ajoute un administrateur dans la base de données
* Ajoute un administrateur dans la base de données
* @param string nom
* @param string prenom
* @param string le mail
171,16 → 172,16
$ligne = $res_nb->fetch() ;
$nb_admin = $ligne['nb_admin'] ;
} else {
$res['bdd'] = 'Erreur dans la base de données' ;
$res['bdd'] = 'Erreur dans la base de données' ;
return $res ;
}
if($nb_admin != 0) {
$res['mail'] = 'Cet email est déjà utilisé par un autre utilisateur' ;
$res['mail'] = 'Cet email est déjà utilisé par un autre utilisateur' ;
}
if($pass != '' || $pass_conf != '') {
// on vérifie si les deux concordent
// on vérifie si les deux concordent
if($pass == $pass_conf) {
} else {
210,7 → 211,7
if($res_ajout = $this->requete($query)) {
} else {
$res['bdd'] = 'Erreur de la requête dans la base de données' ;
$res['bdd'] = 'Erreur de la requête dans la base de données' ;
}
return $res ;
217,20 → 218,20
}
/**
* Fonction qui prend une chaine en paramètre et renvoie vrai
* Fonction qui prend une chaine en paramètre et renvoie vrai
* si elle constitue un email syntaxiquement valide, faux sinon.
* @param string le mail à valider
* @param string le mail à valider
* @return bool true si le mail est valide, false sinon
*/
function validerMail($mail) {
$atom = '[-a-z0-9!#$%&\'*+\\/=?^_`{|}~]'; // Caractères autorisés avant l'arobase
$domain = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)'; // Caractères autorisés après l'arobase (nom de domaine)
$atom = '[-a-z0-9!#$%&\'*+\\/=?^_`{|}~]'; // Caractères autorisés avant l'arobase
$domain = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)'; // Caractères autorisés après l'arobase (nom de domaine)
$regex = '/^'.$atom.'+'. // Une ou plusieurs fois les caractères autorisés avant l'arobase
'(\.'.$atom.'+)*'. // Suivis par zéro point ou plus, séparés par des caractères autorisés avant l'arobase
$regex = '/^'.$atom.'+'. // Une ou plusieurs fois les caractères autorisés avant l'arobase
'(\.'.$atom.'+)*'. // Suivis par zéro point ou plus, séparés par des caractères autorisés avant l'arobase
'@'.// Suivis d'un arobase
'('.$domain .'{1,63}\.)+'.// Suivis par 1 à 63 caractères autorisés pour le nom de domaine, séparés par des points
$domain.'{2,63}$/i';// Suivi de 2 à 63 caractères autorisés pour le nom de domaine
'('.$domain .'{1,63}\.)+'.// Suivis par 1 à 63 caractères autorisés pour le nom de domaine, séparés par des points
$domain.'{2,63}$/i';// Suivi de 2 à 63 caractères autorisés pour le nom de domaine
// Test de l'adresse e-mail
if (preg_match($regex, $mail)) {
/trunk/exemple/admin_administrateur.php
New file
0,0 → 1,92
<?php
// declare(encoding='UTF-8');
/**
* @category PHP
* @package Framework
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @copyright Tela-Botanica 2009
* @link /doc/framework/
* Ceci est un exemple d'application qui permet d'illustrer le fonctionnement du framework, il montre comment
* une application peut être dans papyrus, ou bien utilisée en stand alone.
*/
 
// La fonction autolad doit être appelée avant tout autre chose dans l'application.
// Sinon, rien ne sera chargé.
require_once dirname(__FILE__).'/../framework/autoload.inc.php';
Application::setChemin(__FILE__);
Application::setInfo(Config::get('info'));
/**
* Fonction d'affichage de Papyrus, pour le corps de page
*/
function afficherContenuCorps() {
// Si l'utilisateur est authentifié
if (Config::get('identification')) {
// on renvoie la vue principale de l'application
$methode = '' ;
if (isset($_GET['m'])) {
$methode = $_GET['m'];
}
$controlleur = new AdminAdministrateur();
 
switch ($methode) {
case 'ajout_admin':
return $controlleur->ajoutAdmin();
break;
case 'ajout_admin_va':
$nom = $_POST['admin_nom'];
$prenom = $_POST['admin_prenom'];
$mail = $_POST['admin_mail'];
$lang = $_POST['admin_lang'];
$pass = $_POST['admin_pass'];
$pass_conf = $_POST['admin_pass_confirm'];
return $controlleur->ajoutAdminVa($nom, $prenom, $mail, $lang, $pass, $pass_conf);
break;
case 'modif_admin':
$id = $_GET['id_admin'];
return $controlleur->modifAdmin($id);
break;
case 'modif_admin_va':
$id = $_GET['id_admin'];
$nom = $_POST['admin_nom'];
$prenom = $_POST['admin_prenom'];
$mail = $_POST['admin_mail'];
$lang = $_POST['admin_lang'];
$pass = $_POST['admin_pass'];
$pass_conf = $_POST['admin_pass_confirm'];
return $controlleur->modifAdminVa($id, $nom, $prenom, $mail, $lang, $pass, $pass_conf);
break;
case 'suppr_admin':
$id = $_GET['id_admin'];
return $controlleur->supprAdmin($id);
break;
default:
$retour = $controlleur->chargerAdmin();
return $retour;
break;
}
} else {
// sinon on lui demande de s'identifier
$controlleur = new AdminAdministrateur();
return $controlleur->demanderIdent();
}
}
 
function afficherContenuTete() {
$controlleur = new AdminAdministrateur();
return $controlleur->adminTete();
}
 
function afficherContenuPied() {
$controlleur = new AdminAdministrateur();
return $controlleur->adminPied();
}
 
function afficherContenuNavigation() {
return '';
}
 
function afficherContenuMenu() {
return '';
}
 
?>
/trunk/exemple/configurations/config_papyrus.ini
1,4 → 1,4
; URL de base de l'application, si elle est laissée vide, l'application fonctionnera en Stand-alone
; URL de base de l'application, si elle est laissée vide, l'application fonctionnera en Stand-alone
url_base = "php:$GLOBALS['_GEN_commun']['url']->getUrl()"
; Mettre à true si l'application nécessite de s'identifier.
; Mettre à true si l'application nécessite de s'identifier.
identification = "php:$GLOBALS['_GEN_commun']['pear_auth']->getAuth()"
/trunk/exemple/configurations/config.ini
1,8 → 1,7
; Info sur l'application
info.nom = Gestion des administrateurs de Papyrus
info.abr = AA
info.encodage = ISO-8859-15
; URL de base de l'application, si elle est laissée vide, l'application fonctionnera en Stand-alone
; URL de base de l'application, si elle est laissée vide, l'application fonctionnera en Stand-alone
url_base = ""
; Mettre à true si l'application nécessite de s'identifier.
; Mettre à true si l'application nécessite de s'identifier.
identification = true
/trunk/exemple/index.php
1,92 → 1,99
<?php
/**
* @category PHP
* @package Framework
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @copyright Tela-Botanica 2009
* @link /doc/framework/
* Ceci est un exemple d'application qui permet d'illustrer le fonctionnement du framework, il montre comment
* une application peut être dans papyrus, ou bien utilisée en stand alone.
*/
 
// La fonction autolad doit être appelée avant tout autre chose dans l'application.
// Sinon, rien ne sera chargé.
require_once dirname(__FILE__).'/../framework/autoload.inc.php';
Application::setChemin(__FILE__);
Application::setInfo(Config::get('info'));
/**
* Fonction d'affichage de Papyrus, pour le corps de page
*/
function afficherContenuCorps() {
// Si l'utilisateur est authentifié
if (Config::get('identification')) {
// on renvoie la vue principale de l'application
$methode = '' ;
if (isset($_GET['m'])) {
$methode = $_GET['m'];
}
$controlleur = new AdminAdministrateur();
 
switch ($methode) {
case 'ajout_admin':
return $controlleur->ajoutAdmin();
break;
case 'ajout_admin_va':
$nom = $_POST['admin_nom'];
$prenom = $_POST['admin_prenom'];
$mail = $_POST['admin_mail'];
$lang = $_POST['admin_lang'];
$pass = $_POST['admin_pass'];
$pass_conf = $_POST['admin_pass_confirm'];
return $controlleur->ajoutAdminVa($nom, $prenom, $mail, $lang, $pass, $pass_conf);
break;
case 'modif_admin':
$id = $_GET['id_admin'];
return $controlleur->modifAdmin($id);
break;
case 'modif_admin_va':
$id = $_GET['id_admin'];
$nom = $_POST['admin_nom'];
$prenom = $_POST['admin_prenom'];
$mail = $_POST['admin_mail'];
$lang = $_POST['admin_lang'];
$pass = $_POST['admin_pass'];
$pass_conf = $_POST['admin_pass_confirm'];
return $controlleur->modifAdminVa($id, $nom, $prenom, $mail, $lang, $pass, $pass_conf);
break;
case 'suppr_admin':
$id = $_GET['id_admin'];
return $controlleur->supprAdmin($id);
break;
default:
$retour = $controlleur->chargerAdmin();
return $retour;
break;
}
} else {
// sinon on lui demande de s'identifier
$controlleur = new AdminAdministrateur();
return $controlleur->demanderIdent();
}
}
 
function afficherContenuTete() {
$controlleur = new AdminAdministrateur();
return $controlleur->adminTete();
}
 
function afficherContenuPied() {
$controlleur = new AdminAdministrateur();
return $controlleur->adminPied();
}
 
if(!defined('PAP_VERSION')) {
echo afficherContenuTete();
echo afficherContenuCorps();
echo afficherContenuPied();
}
/*
* afficherContenuNavigation()
* afficherContenuMenu()
*/
?>
/** Inclusion du fichier principal de l'application (eflore)*/
require_once 'admin_administrateur.php';
$contenu_navigation = afficherContenuNavigation();
$contenu_tete = afficherContenuTete();
$contenu_corps = afficherContenuCorps();
$titre = "";
$contenu_pied = afficherContenuPied();
$contenu_menu = afficherContenuMenu();
?>
<!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 xml:lang="fr" lang="fr">
<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" />
<title><?php echo $titre; ?></title>
<meta name="revisit-after" content="15 days" />
<meta name="robots" content="index,follow" />
<meta name="author" content="Tela Botanica" />
<style type="text/css" media="screen">
/*--------------------------------------------------------------------------------------------------------------*/
/* Tableau du chronométrage du programme */
#pied_texte #chrono {
text-align: center;
margin:0 auto;}
#chrono table {
display:block;
border:3px solid #6495ed;
border-collapse:collapse;}
#chrono thead, tfoot {
background-color:#D0E3FA;
border:1px solid #6495ed;}
#chrono tbody {
background-color:#FFFFFF;
border:1px solid #6495ed;}
#chrono th {
font-family:monospace;
border:1px dotted #6495ed;
padding:5px;
background-color:#EFF6FF;
width:25%;}
#chrono td {
font-family:sans-serif;
font-size:80%;
border:1px solid #6495ed;
padding:5px;
text-align:center;}
#chrono caption {
font-family:sans-serif;
text-align: center;
width:90%;
margin:auto;}
.debogage{
color:black;
border:3px solid #6495ed;}
.debogage_fichier, .debogage_ligne{
font-size:10px;
color:#A9A9A9;}
</style>
<link rel="shortcut icon" type="image/x-icon" href="http://www.tela-botanica.org/favicon.ico" />
<link rel="icon" type="image/png" href="http://www.tela-botanica.org/sites/commun/generique/images/favicones/tela_botanica.png" />
</head>
<body xml:lang="fr" lang="fr">
<div id="reducteur">
<div id="logo_tela">
<a href="/" title="Retour à l'accueil du site">
<img src="http://www.tela-botanica.org/sites/reseau/generique/images/graphisme/logo_jaune.gif" alt="le logo de Tela Botanica"/>
</a>
</div>
<div id="droite">
<div id="onglets">
<?php echo $contenu_navigation; ?>
</div>
<div id="contenu">
<div id="entete">
<?php echo $contenu_tete; ?>
</div>
<div id="texte">
<?php echo $contenu_corps; ?>
</div>
<div id="pied_texte">
<?php
echo $contenu_pied;
?>
</div>
</div>
</div>
<div id="pied">
<p> &copy;<a href="http://www.tela-botanica.org/" accesskey="1">Tela Botanica</a> / 2000-2004 - Le réseau des Botanistes Francophones</p>
</div>
</div>
</body>
</html>
/trunk/exemple/controleurs/AdminAdministrateur.php
1,4 → 1,5
<?php
// declare(encoding='UTF-8');
/**
* Classe controleur pour l'application administration des administrateurs
*/
5,7 → 6,7
class AdminAdministrateur extends Controleur {
 
/**
* Fonction d'affichage par défaut, elle appelle la liste des administrateurs
* Fonction d'affichage par défaut, elle appelle la liste des administrateurs
*/
public function index() {
$this->charger_admin();
12,8 → 13,8
}
 
/**
* Charge la liste des administrateurs et l'envoie à la vue
* @param array un tableau contenant les erreurs à afficher s'il y en a
* Charge la liste des administrateurs et l'envoie à la vue
* @param array un tableau contenant les erreurs à afficher s'il y en a
* @return string la vue correspondante
*/
public function chargerAdmin($erreurs = array()) {
26,9 → 27,9
}
 
/**
* Charge les détails d'un administrateur demandé et l'envoi à la
* Charge les détails d'un administrateur demandé et l'envoi à la
* vue qui permet de les modifier
* @id string l'id de l'administrateur à modifier
* @id string l'id de l'administrateur à modifier
* @return string la vue correspondante
*/
public function modifAdmin($id) {
40,13 → 41,13
}
 
/**
* Fonction appelée lors de la validation du formulaire de modification
* des détails d'un administrateurs. Elle modifie les détails dans la base
* de données. S'il y a une erreur et rappelle la formulaire et notifie l'erreur,
* Fonction appelée lors de la validation du formulaire de modification
* des détails d'un administrateurs. Elle modifie les détails dans la base
* de données. S'il y a une erreur et rappelle la formulaire et notifie l'erreur,
* sinon elle charge la liste des administrateurs
* @param string l'identifiant de l'administrateur*
* @param string le nom
* @param string le prénom
* @param string le prénom
* @param string le mail
* @param string le mot de passe
* @param string la confirmation du mot de passe
73,7 → 74,7
}
 
/**
* Supprime un administrateur dans la base de données,
* Supprime un administrateur dans la base de données,
* renvoie la liste des administrateurs, en affichant des erreurs
* s'il y en a.
* @return string la vue contenant la liste des administrateurs
107,12 → 108,12
}
 
/**
* Fonction appelée lors de la validation du formulaire d'ajout d'un administrateur.
* Elle ajoute celui-ci les dans la base de données
* Fonction appelée lors de la validation du formulaire d'ajout d'un administrateur.
* Elle ajoute celui-ci les dans la base de données
* S'il y a une erreur et rappelle la formulaire et notifie l'erreur,
* sinon elle charge la liste des administrateurs
* @param string le nom
* @param string le prénom
* @param string le prénom
* @param string le mail
* @param string le mot de passe
* @param string la confirmation du mot de passe
149,7 → 150,7
}
}
 
/** Apelle le formulaire d'identification (dans le cas où l'utilisateur n'est pas identifié)
/** Apelle le formulaire d'identification (dans le cas où l'utilisateur n'est pas identifié)
* @return string la vue permettant de s'identifier
*/
public function demanderIdent() {
158,7 → 159,7
}
 
/**
* Renvoie la tête de page de l'application
* Renvoie la t�te de page de l'application
* @return string la tete de page de l'application
*/
public function adminTete() {