/trunk/framework/Controleur.php |
---|
4,118 → 4,118 |
* 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 |
* |
* PHP Version 5 |
* |
* |
* PHP Version 5 |
* |
* @category Class |
* @package Framework |
* @author aurelien <aurelien@tela-botanica.org> |
* @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/ |
* |
* @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 Controleur { |
/** |
* Registre global, normalement accessible partout |
*/ |
private $registre; |
/** |
* Gestionnaire d'exceptions php |
*/ |
private $gestionnaire_exception; |
/** |
* Gestionnaire d'erreurs php |
*/ |
private $gestionnaire_erreur; |
/** |
* Constructeur par défaut |
*/ |
final public function __construct() { |
if (Config::existe('fw_html_errors')) { |
ini_set('html_errors', Config::get('fw_html_errors')); |
} |
$this->registre = Registre::getInstance(); |
$this->registre->set('base_chemin_modele', Config::get('chemin_modeles')); |
$this->registre->set('base_chemin_squelette', Config::get('chemin_squelettes')); |
$this->registre->set('base_chemin_controleur', Config::get('chemin_controleurs')); |
$this->registre->set('base_url_application', new Url(Config::get('url_base'))); |
$this->gestionnaire_exception = GestionnaireException::getInstance(); |
$this->gestionnaire_erreur = GestionnaireErreur::getInstance(); |
} |
/** |
* Charge un modele donné et le rend disponible sous la forme $this->nom_modele |
* |
* @param string $nom_modele le nom du modèle à charger |
* |
* @return boolean false si le chargement a échoué, rien sinon |
*/ |
final protected function chargerModele($nom_modele) { |
$chemin_modele = ($this->registre->get('base_chemin_modele')).$nom_modele.'.php'; |
if (!file_exists($chemin_modele)) { |
return false; |
} |
include_once $chemin_modele; |
if (!class_exists($nom_modele)) { |
return false; |
} |
$this->$nom_modele = new $nom_modele; |
} |
/** |
* 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. |
* |
* @param String $nom_squelette le nom du squelette |
* @param Array $donnees un tableau associatif contenant les variables a injecter dans la vue |
* |
* @return boolean false si la vue n'existe pas, rien sinon |
*/ |
final protected function chargerVue($nom_squelette,$donnees) { |
$chemin_squelette = ($this->registre->get('base_chemin_squelette')).$nom_squelette.'.tpl.html'; |
if (!file_exists($chemin_squelette)) { |
return false ; |
} |
$donnees['base_url'] = $this->registre->get('base_url_application'); |
// 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 |
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)))); |
} else { |
// sinon, on se contente d'inclure le squelette |
include $chemin_squelette; |
} |
// 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; |
} |
public function __destruct() { |
$this->gestionnaire_exception->getExceptions(); |
} |
/** |
* Registre global, normalement accessible partout |
*/ |
private $registre; |
/** |
* Gestionnaire d'exceptions php |
*/ |
private $gestionnaire_exception; |
/** |
* Gestionnaire d'erreurs php |
*/ |
private $gestionnaire_erreur; |
/** |
* Constructeur par défaut |
*/ |
final public function __construct() { |
if (Config::existe('fw_html_errors')) { |
ini_set('html_errors', Config::get('fw_html_errors')); |
} |
$this->registre = Registre::getInstance(); |
$this->registre->set('base_chemin_modele', Config::get('chemin_modeles')); |
$this->registre->set('base_chemin_squelette', Config::get('chemin_squelettes')); |
$this->registre->set('base_chemin_controleur', Config::get('chemin_controleurs')); |
$this->registre->set('base_url_application', new Url(Config::get('url_base'))); |
$this->gestionnaire_exception = GestionnaireException::getInstance(); |
$this->gestionnaire_erreur = GestionnaireErreur::getInstance(); |
} |
/** |
* Charge un modele donné et le rend disponible sous la forme $this->nom_modele |
* |
* @param string $nom_modele le nom du modèle à charger |
* |
* @return boolean false si le chargement a échoué, rien sinon |
*/ |
final protected function chargerModele($nom_modele) { |
$chemin_modele = ($this->registre->get('base_chemin_modele')).$nom_modele.'.php'; |
if (!file_exists($chemin_modele)) { |
return false; |
} |
include_once $chemin_modele; |
if (!class_exists($nom_modele)) { |
return false; |
} |
$this->$nom_modele = new $nom_modele; |
} |
/** |
* 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. |
* |
* @param String $nom_squelette le nom du squelette |
* @param Array $donnees un tableau associatif contenant les variables a injecter dans la vue |
* |
* @return boolean false si la vue n'existe pas, rien sinon |
*/ |
final protected function chargerVue($nom_squelette,$donnees) { |
$chemin_squelette = ($this->registre->get('base_chemin_squelette')).$nom_squelette.'.tpl.html'; |
if (!file_exists($chemin_squelette)) { |
return false ; |
} |
$donnees['base_url'] = $this->registre->get('base_url_application'); |
// 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 |
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)))); |
} else { |
// sinon, on se contente d'inclure le squelette |
include $chemin_squelette; |
} |
// 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; |
} |
public function __destruct() { |
$this->gestionnaire_exception->getExceptions(); |
} |
} |
?> |
/trunk/framework/GestionnaireErreur.php |
---|
2,18 → 2,18 |
// declare(encoding='UTF-8'); |
/** |
* classe de gestion des erreurs. |
* |
* PHP Version 5 |
* |
* |
* 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/ |
* |
* @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 GestionnaireErreur |
{ |
37,7 → 37,7 |
* @access private |
*/ |
private $contexte; |
/** |
* Contient le niveau d'erreur courant. Celui que l'on donne à la fonction |
* error_reporting(). |
44,14 → 44,14 |
* @access private |
*/ |
private $niveau_erreur_courant; |
/** |
* Le gestionnaire d'erreur est un singleton |
*/ |
private static $gestionnaire_erreurs; |
/*** Constructeur: ***/ |
/** |
* Construit le gestionnaire d'erreur. |
* |
64,9 → 64,9 |
$this->erreurs = array(); |
$this->setContexte($contexte); |
$this->niveau_erreur_courant = 2048 ; |
set_error_handler(array(&$this, 'gererErreur')); |
//set_error_handler(array(&$this, 'gererErreur')); |
} |
/** |
* Fonction d'accès au singleton |
* @return GestionnaireErreur le gestionnaire d'erreurs courant |
79,7 → 79,7 |
self::$gestionnaire_erreurs = new GestionnaireErreur ; |
return self::$gestionnaire_erreurs; |
} |
/*** Accesseurs: ***/ |
/** |
* Récupère le tableau des erreurs. |
94,7 → 94,7 |
/** |
* Ajoute une erreur à la liste. |
* |
* @param array une_erreur |
* @param array une_erreur |
* @return void |
* @access public |
*/ |
122,7 → 122,7 |
public function setContexte( $un_contexte ) { |
$this->contexte = $un_contexte; |
} |
/** |
* Récupère le niveau d'erreur courrant. |
* |
143,7 → 143,7 |
public function setNiveauErreurCourant( $niveau = 2048 ) { |
$this->niveau_erreur_courant = $niveau; |
} |
/** |
* Définit le niveau d'erreur courrant (synonyme fonction precedente) |
* |
154,10 → 154,10 |
public function setActive ($niveau) { |
$this->niveau_erreur_courant = $niveau; |
} |
/*** Méthodes : ***/ |
/** |
* |
* @param int niveau |
185,7 → 185,7 |
default: |
$aso_erreur['message'] = $message; |
} |
$aso_erreur['fichier'] = $fichier; |
$aso_erreur['ligne'] = $ligne; |
if ($this->getContexte()) { |
193,7 → 193,7 |
} |
$this->setErreur($aso_erreur); |
} |
echo print_r($this->erreurs,true) ; |
exit() ; |
// Si nous avons affaire à une erreur et non à un warning ou une notice, nous arrêtons l'exécution du script |
225,7 → 225,7 |
if ($aso_erreur['niveau'] == E_USER_NOTICE) { |
$retour .= $aso_erreur['message']."\n"; |
$retour .= 'Fichier : '.$aso_erreur['fichier']."\n"; |
$retour .= 'Ligne : '.$aso_erreur['ligne']."\n"; |
$retour .= 'Ligne : '.$aso_erreur['ligne']."\n"; |
} else if ($aso_erreur['niveau'] <= 512) { |
$retour .= 'INFO : Niveau '.$aso_erreur['niveau']."\n"; |
} else { |
265,8 → 265,8 |
} |
$retour .= '</p>'."\n"; |
} |
} |
} |
return $retour; |
} |
295,7 → 295,7 |
$retour .= 'Requete : '."\n"; |
$retour .= $requete."\n"; |
} |
if (!is_null($autres)) { |
$retour .= 'Autres infos : '."\n"; |
$retour .= $autres."\n"; |
308,18 → 308,18 |
$retour .= '<dl>'."\n"; |
$retour .= '<dt> Fichier : </dt> '; |
$retour .= '<dd> '.$fichier.'</dd>'."\n"; |
$retour .= '<dt> Méthode : </dt> '; |
$retour .= '<dd> '.$methode.'</dd>'."\n"; |
$retour .= '<dt> Message erreur : </dt> '; |
$retour .= '<dd> '.$message.'</dd>'."\n"; |
if (!is_null($requete)) { |
$retour .= '<dt> Requete : </dt> '; |
$retour .= '<dd> '.$requete.' </dd>'."\n"; |
} |
if (!is_null($autres)) { |
$retour .= '<dt> Autres infos : </dt> '; |
$retour .= '<dd> '.$autres.' </dd>'."\n"; |
329,6 → 329,6 |
$retour .= '<!-- END sql -->'."\n"; |
} |
return $retour; |
} |
} |
} |
?> |
/trunk/framework/autoload.inc.php |
---|
3,15 → 3,15 |
/** |
* 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 |
* |
* |
* @category Fichier_De_Fonctions |
* @package Framework |
// Auteur principal : |
// Auteur principal : |
* @author Aurelien PERONNET <aurelien@tela-botanica.org> |
// Autres auteurs : |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@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 $$Id$$ |
19,12 → 19,12 |
*/ |
// Redéfinition de la constante DIRECTORY_SEPARATOR |
if (!defined('DS')) { |
define('DS', DIRECTORY_SEPARATOR); |
if (!defined('DS')) { |
define('DS', DIRECTORY_SEPARATOR); |
} |
// Redéfinition de la constante PATH_SEPARATOR |
if (!defined('PS')) { |
define('PS', PATH_SEPARATOR); |
if (!defined('PS')) { |
define('PS', PATH_SEPARATOR); |
} |
// Autoload pour le Framework |
37,12 → 37,15 |
} |
spl_autoload_register('autoloadFw'); |
//instanciation du gestionnaire d'exception |
GestionnaireException::getInstance(); |
// Autoload par défaut pour l'application |
function autoloadAppliDefaut($nom_classe) { |
$dossiers_classes = array( Config::get('chemin_controleurs'), |
Config::get('chemin_modeles'), |
Config::get('chemin_bibliotheque')); |
foreach ($dossiers_classes as $chemin) { |
$fichier_a_tester = $chemin.$nom_classe.'.php'; |
if (file_exists($fichier_a_tester)) { |
/trunk/framework/Url.php |
---|
3,793 → 3,793 |
/** |
* 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 |
* |
* |
* PHP Version 5 |
* |
* @category Class |
* @package Framework |
// auteur principal |
* @author Christian Schmidt <schmidt@php.net> |
* @author Christian Schmidt <schmidt@php.net> |
// autre auteurs |
* @author aurelien <aurelien@tela-botanica.org> |
* @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/ |
* |
* @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 |
{ |
/** |
* Parsing strict dans resoudre() (voir RFC 3986, section 5.2.2). Par défaut |
* à true. |
*/ |
const OPTION_STRICTE = 'strict'; |
/** |
* Parsing strict dans resoudre() (voir RFC 3986, section 5.2.2). Par défaut |
* à true. |
*/ |
const OPTION_STRICTE = 'strict'; |
/** |
* Répresenter les tableaux dans les requêtes en utilisant la notation php []. Par défaut à true. |
*/ |
const OPTION_UTILISER_CROCHETS = 'use_brackets'; |
/** |
* Répresenter les tableaux dans les requêtes en utilisant la notation php []. Par défaut à true. |
*/ |
const OPTION_UTILISER_CROCHETS = 'use_brackets'; |
/** |
* URL-encoder les clés des variables dans les requêtes. Par défaut à true. |
*/ |
const OPTION_ENCODER_CLES = 'encode_keys'; |
/** |
* URL-encoder les clés des variables dans les requêtes. Par défaut à true. |
*/ |
const OPTION_ENCODER_CLES = 'encode_keys'; |
/** |
* 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_SEPARATEUR_ENTREE = 'input_separator'; |
/** |
* 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_SEPARATEUR_ENTREE = 'input_separator'; |
/** |
* 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_SEPARATEUR_SORTIE = 'output_separator'; |
/** |
* 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_SEPARATEUR_SORTIE = 'output_separator'; |
/** |
* Options par défaut correspondant au comportement de php |
* vis à vis de $_GET |
*/ |
private $options = array( |
self::OPTION_STRICTE => true, |
self::OPTION_UTILISER_CROCHETS => true, |
self::OPTION_ENCODER_CLES => true, |
self::OPTION_SEPARATEUR_ENTREE => 'x&', |
self::OPTION_SEPARATEUR_SORTIE => 'x&', |
); |
/** |
* Options par défaut correspondant au comportement de php |
* vis à vis de $_GET |
*/ |
private $options = array( |
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 $schema = false; |
/** |
* @var string|bool |
*/ |
private $schema = false; |
/** |
* @var string|bool |
*/ |
private $infoUtilisateur = false; |
/** |
* @var string|bool |
*/ |
private $infoUtilisateur = false; |
/** |
* @var string|bool |
*/ |
private $hote = false; |
/** |
* @var string|bool |
*/ |
private $hote = false; |
/** |
* @var int|bool |
*/ |
private $port = false; |
/** |
* @var int|bool |
*/ |
private $port = false; |
/** |
* @var string |
*/ |
private $chemin = ''; |
/** |
* @var string |
*/ |
private $chemin = ''; |
/** |
* @var string|bool |
*/ |
private $requete = false; |
/** |
* @var string|bool |
*/ |
private $requete = false; |
/** |
* @var string|bool |
*/ |
private $fragment = false; |
/** |
* @var string|bool |
*/ |
private $fragment = false; |
/** |
* @param string $url une URL relative ou absolue |
* @param array $options |
*/ |
public function __construct($url, $options = null) |
{ |
$this->setOption(self::OPTION_SEPARATEUR_ENTREE, |
ini_get('arg_separator.input')); |
$this->setOption(self::OPTION_SEPARATEUR_SORTIE, |
ini_get('arg_separator.output')); |
if (is_array($options)) { |
foreach ($options as $nomOption => $valeur) { |
$this->setOption($nomOption); |
} |
} |
/** |
* @param string $url une URL relative ou absolue |
* @param array $options |
*/ |
public function __construct($url, $options = null) |
{ |
$this->setOption(self::OPTION_SEPARATEUR_ENTREE, |
ini_get('arg_separator.input')); |
$this->setOption(self::OPTION_SEPARATEUR_SORTIE, |
ini_get('arg_separator.output')); |
if (is_array($options)) { |
foreach ($options as $nomOption => $valeur) { |
$this->setOption($nomOption); |
} |
} |
if (preg_match('@^([a-z][a-z0-9.+-]*):@i', $url, $reg)) { |
$this->schema = $reg[1]; |
$url = substr($url, strlen($reg[0])); |
} |
if (preg_match('@^([a-z][a-z0-9.+-]*):@i', $url, $reg)) { |
$this->schema = $reg[1]; |
$url = substr($url, strlen($reg[0])); |
} |
if (preg_match('@^//([^/#?]+)@', $url, $reg)) { |
$this->setAutorite($reg[1]); |
$url = substr($url, strlen($reg[0])); |
} |
if (preg_match('@^//([^/#?]+)@', $url, $reg)) { |
$this->setAutorite($reg[1]); |
$url = substr($url, strlen($reg[0])); |
} |
$i = strcspn($url, '?#'); |
$this->chemin = substr($url, 0, $i); |
$url = substr($url, $i); |
$i = strcspn($url, '?#'); |
$this->chemin = substr($url, 0, $i); |
$url = substr($url, $i); |
if (preg_match('@^\?([^#]*)@', $url, $reg)) { |
$this->requete = $reg[1]; |
$url = substr($url, strlen($reg[0])); |
} |
if (preg_match('@^\?([^#]*)@', $url, $reg)) { |
$this->requete = $reg[1]; |
$url = substr($url, strlen($reg[0])); |
} |
if ($url) { |
$this->fragment = substr($url, 1); |
} |
} |
if ($url) { |
$this->fragment = substr($url, 1); |
} |
} |
/** |
* 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 getSchema() |
{ |
return $this->schema; |
} |
/** |
* 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 getSchema() |
{ |
return $this->schema; |
} |
/** |
* @param string|bool $schema |
* |
* @return void |
* @see getSchema() |
*/ |
public function setSchema($schema) |
{ |
$this->schema = $schema; |
} |
/** |
* @param string|bool $schema |
* |
* @return void |
* @see getSchema() |
*/ |
public function setSchema($schema) |
{ |
$this->schema = $schema; |
} |
/** |
* 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 getUtilisateur() |
{ |
return $this->infoUtilisateur !== false ? preg_replace('@:.*$@', '', $this->infoUtilisateur) : false; |
} |
/** |
* 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 getUtilisateur() |
{ |
return $this->infoUtilisateur !== false ? preg_replace('@:.*$@', '', $this->infoUtilisateur) : false; |
} |
/** |
* 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 getMotDePasse() |
{ |
return $this->infoUtilisateur !== false ? substr(strstr($this->infoUtilisateur, ':'), 1) : false; |
} |
/** |
* 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 getMotDePasse() |
{ |
return $this->infoUtilisateur !== false ? substr(strstr($this->infoUtilisateur, ':'), 1) : false; |
} |
/** |
* 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 getInfoUtilisateur() |
{ |
return $this->infoUtilisateur; |
} |
/** |
* 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 getInfoUtilisateur() |
{ |
return $this->infoUtilisateur; |
} |
/** |
* 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 $infoUtilisateur infoUtilisateur ou username |
* @param string|bool $motDePasse |
* |
* @return void |
*/ |
public function setInfoUtilisateur($infoUtilisateur, $motDePasse = false) |
{ |
$this->infoUtilisateur = $infoUtilisateur; |
if ($motDePasse !== false) { |
$this->infoUtilisateur .= ':' . $motDePasse; |
} |
} |
/** |
* 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 $infoUtilisateur infoUtilisateur ou username |
* @param string|bool $motDePasse |
* |
* @return void |
*/ |
public function setInfoUtilisateur($infoUtilisateur, $motDePasse = false) |
{ |
$this->infoUtilisateur = $infoUtilisateur; |
if ($motDePasse !== false) { |
$this->infoUtilisateur .= ':' . $motDePasse; |
} |
} |
/** |
* 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 getHote() |
{ |
return $this->hote; |
} |
/** |
* 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 getHote() |
{ |
return $this->hote; |
} |
/** |
* @param string|bool $hote |
* |
* @return void |
*/ |
public function setHote($hote) |
{ |
$this->hote = $hote; |
} |
/** |
* @param string|bool $hote |
* |
* @return void |
*/ |
public function setHote($hote) |
{ |
$this->hote = $hote; |
} |
/** |
* 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 |
*/ |
public function getPort() |
{ |
return $this->port; |
} |
/** |
* 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 |
*/ |
public function getPort() |
{ |
return $this->port; |
} |
/** |
* @param int|bool $port |
* |
* @return void |
*/ |
public function setPort($port) |
{ |
$this->port = intval($port); |
} |
/** |
* @param int|bool $port |
* |
* @return void |
*/ |
public function setPort($port) |
{ |
$this->port = intval($port); |
} |
/** |
* Renvoie la partie autorité, i.e. [ infoUtilisateur "@" ] hote [ ":" port ], ou |
* false si celle-ci est absente. |
* |
* @return string|bool |
*/ |
public function getAutorite() |
{ |
if (!$this->hote) { |
return false; |
} |
/** |
* Renvoie la partie autorité, i.e. [ infoUtilisateur "@" ] hote [ ":" port ], ou |
* false si celle-ci est absente. |
* |
* @return string|bool |
*/ |
public function getAutorite() |
{ |
if (!$this->hote) { |
return false; |
} |
$autorite = ''; |
$autorite = ''; |
if ($this->infoUtilisateur !== false) { |
$autorite .= $this->infoUtilisateur . '@'; |
} |
if ($this->infoUtilisateur !== false) { |
$autorite .= $this->infoUtilisateur . '@'; |
} |
$autorite .= $this->hote; |
$autorite .= $this->hote; |
if ($this->port !== false) { |
$autorite .= ':' . $this->port; |
} |
if ($this->port !== false) { |
$autorite .= ':' . $this->port; |
} |
return $autorite; |
} |
return $autorite; |
} |
/** |
* @param string|false $autorite |
* |
* @return void |
*/ |
public function setAutorite($autorite) |
{ |
$this->user = false; |
$this->pass = false; |
$this->hote = false; |
$this->port = false; |
if (preg_match('@^(([^\@]+)\@)?([^:]+)(:(\d*))?$@', $autorite, $reg)) { |
if ($reg[1]) { |
$this->infoUtilisateur = $reg[2]; |
} |
/** |
* @param string|false $autorite |
* |
* @return void |
*/ |
public function setAutorite($autorite) |
{ |
$this->user = false; |
$this->pass = false; |
$this->hote = false; |
$this->port = false; |
if (preg_match('@^(([^\@]+)\@)?([^:]+)(:(\d*))?$@', $autorite, $reg)) { |
if ($reg[1]) { |
$this->infoUtilisateur = $reg[2]; |
} |
$this->hote = $reg[3]; |
if (isset($reg[5])) { |
$this->port = intval($reg[5]); |
} |
} |
} |
$this->hote = $reg[3]; |
if (isset($reg[5])) { |
$this->port = intval($reg[5]); |
} |
} |
} |
/** |
* Renvoie la partie chemin (chemin) (éventuellement vide). |
* |
* @return string |
*/ |
public function getChemin() |
{ |
return $this->chemin; |
} |
/** |
* Renvoie la partie chemin (chemin) (éventuellement vide). |
* |
* @return string |
*/ |
public function getChemin() |
{ |
return $this->chemin; |
} |
/** |
* @param string $chemin |
* |
* @return void |
*/ |
public function setChemin($chemin) |
{ |
$this->chemin = $chemin; |
} |
/** |
* @param string $chemin |
* |
* @return void |
*/ |
public function setChemin($chemin) |
{ |
$this->chemin = $chemin; |
} |
/** |
* 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::getVariablesRequete() |
*/ |
public function getRequete() |
{ |
return $this->requete; |
} |
/** |
* 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::getVariablesRequete() |
*/ |
public function getRequete() |
{ |
return $this->requete; |
} |
/** |
* @param string|bool $requete |
* |
* @return void |
* @see self::setVariablesRequete() |
*/ |
public function setRequete($requete) |
{ |
$this->requete = $requete; |
} |
/** |
* @param string|bool $requete |
* |
* @return void |
* @see self::setVariablesRequete() |
*/ |
public function setRequete($requete) |
{ |
$this->requete = $requete; |
} |
/** |
* Renvoie le nom du fragment, ou false si "#" n'est pas present dans l'URL. |
* |
* @return string|bool |
*/ |
public function getFragment() |
{ |
return $this->fragment; |
} |
/** |
* Renvoie le nom du fragment, ou false si "#" n'est pas present dans l'URL. |
* |
* @return string|bool |
*/ |
public function getFragment() |
{ |
return $this->fragment; |
} |
/** |
* @param string|bool $fragment |
* |
* @return void |
*/ |
public function setFragment($fragment) |
{ |
$this->fragment = $fragment; |
} |
/** |
* @param string|bool $fragment |
* |
* @return void |
*/ |
public function setFragment($fragment) |
{ |
$this->fragment = $fragment; |
} |
/** |
* 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 getVariablesRequete() |
{ |
$pattern = '/[' . |
preg_quote($this->getOption(self::OPTION_SEPARATEUR_ENTREE), '/') . |
']/'; |
$parties = preg_split($pattern, $this->requete, -1, PREG_SPLIT_NO_EMPTY); |
$retour = array(); |
/** |
* 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 getVariablesRequete() |
{ |
$pattern = '/[' . |
preg_quote($this->getOption(self::OPTION_SEPARATEUR_ENTREE), '/') . |
']/'; |
$parties = preg_split($pattern, $this->requete, -1, PREG_SPLIT_NO_EMPTY); |
$retour = array(); |
foreach ($parties as $partie) { |
if (strpos($partie, '=') !== false) { |
list($cle, $valeur) = explode('=', $partie, 2); |
} else { |
$cle = $partie; |
$valeur = null; |
} |
foreach ($parties as $partie) { |
if (strpos($partie, '=') !== false) { |
list($cle, $valeur) = explode('=', $partie, 2); |
} else { |
$cle = $partie; |
$valeur = null; |
} |
if ($this->getOption(self::OPTION_ENCODER_CLES)) { |
$cle = rawurldecode($cle); |
} |
$valeur = rawurldecode($valeur); |
if ($this->getOption(self::OPTION_ENCODER_CLES)) { |
$cle = rawurldecode($cle); |
} |
$valeur = rawurldecode($valeur); |
if ($this->getOption(self::OPTION_UTILISER_CROCHETS) && |
preg_match('#^(.*)\[([0-9a-z_-]*)\]#i', $cle, $matches)) { |
if ($this->getOption(self::OPTION_UTILISER_CROCHETS) && |
preg_match('#^(.*)\[([0-9a-z_-]*)\]#i', $cle, $matches)) { |
$cle = $matches[1]; |
$idx = $matches[2]; |
$cle = $matches[1]; |
$idx = $matches[2]; |
// On s'assure que c'est bien un tableau |
if (empty($retour[$cle]) || !is_array($retour[$cle])) { |
$retour[$cle] = array(); |
} |
// On s'assure que c'est bien un tableau |
if (empty($retour[$cle]) || !is_array($retour[$cle])) { |
$retour[$cle] = array(); |
} |
// Ajout des données |
if ($idx === '') { |
$retour[$cle][] = $valeur; |
} else { |
$retour[$cle][$idx] = $valeur; |
} |
} elseif (!$this->getOption(self::OPTION_UTILISER_CROCHETS) |
&& !empty($retour[$cle]) |
) { |
$retour[$cle] = (array) $retour[$cle]; |
$retour[$cle][] = $valeur; |
} else { |
$retour[$cle] = $valeur; |
} |
} |
// Ajout des données |
if ($idx === '') { |
$retour[$cle][] = $valeur; |
} else { |
$retour[$cle][$idx] = $valeur; |
} |
} elseif (!$this->getOption(self::OPTION_UTILISER_CROCHETS) |
&& !empty($retour[$cle]) |
) { |
$retour[$cle] = (array) $retour[$cle]; |
$retour[$cle][] = $valeur; |
} else { |
$retour[$cle] = $valeur; |
} |
} |
return $retour; |
} |
return $retour; |
} |
/** |
* @param array $tableau (nom => valeur) tableau |
* |
* @return void |
*/ |
public function setVariablesRequete(array $tableau) |
{ |
if (!$tableau) { |
$this->requete = false; |
} else { |
foreach ($tableau as $nom => $valeur) { |
if ($this->getOption(self::OPTION_ENCODER_CLES)) { |
$nom = rawurlencode($nom); |
} |
/** |
* @param array $tableau (nom => valeur) tableau |
* |
* @return void |
*/ |
public function setVariablesRequete(array $tableau) |
{ |
if (!$tableau) { |
$this->requete = false; |
} else { |
foreach ($tableau as $nom => $valeur) { |
if ($this->getOption(self::OPTION_ENCODER_CLES)) { |
$nom = rawurlencode($nom); |
} |
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($valeur)) { |
$parties[] = $nom . '=' . $valeur; |
} else { |
$parties[] = $nom; |
} |
} |
$this->requete = implode($this->getOption(self::OPTION_SEPARATEUR_SORTIE), |
$parties); |
} |
} |
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($valeur)) { |
$parties[] = $nom . '=' . $valeur; |
} else { |
$parties[] = $nom; |
} |
} |
$this->requete = implode($this->getOption(self::OPTION_SEPARATEUR_SORTIE), |
$parties); |
} |
} |
/** |
* @param string $nom |
* @param mixed $valeur |
* |
* @return array |
*/ |
public function setVariableRequete($nom, $valeur) |
{ |
$tableau = $this->getVariablesRequete(); |
$tableau[$nom] = $valeur; |
$this->setVariablesRequete($tableau); |
} |
/** |
* @param string $nom |
* @param mixed $valeur |
* |
* @return array |
*/ |
public function setVariableRequete($nom, $valeur) |
{ |
$tableau = $this->getVariablesRequete(); |
$tableau[$nom] = $valeur; |
$this->setVariablesRequete($tableau); |
} |
/** |
* @param string $nom |
* |
* @return void |
*/ |
public function unsetVariableRequete($nom) |
{ |
$tableau = $this->getVariablesRequete(); |
unset($tableau[$nom]); |
$this->setVariablesRequete($tableau); |
} |
/** |
* @param string $nom |
* |
* @return void |
*/ |
public function unsetVariableRequete($nom) |
{ |
$tableau = $this->getVariablesRequete(); |
unset($tableau[$nom]); |
$this->setVariablesRequete($tableau); |
} |
/** |
* Renvoie un représentation sous forme de chaine de l'URL |
* |
* @return string |
*/ |
public function getURL() |
{ |
// Voir RFC 3986, section 5.3 |
$url = ""; |
/** |
* Renvoie un représentation sous forme de chaine de l'URL |
* |
* @return string |
*/ |
public function getURL() |
{ |
// Voir RFC 3986, section 5.3 |
$url = ""; |
if ($this->schema !== false) { |
$url .= $this->schema . ':'; |
} |
if ($this->schema !== false) { |
$url .= $this->schema . ':'; |
} |
$autorite = $this->getAutorite(); |
if ($autorite !== false) { |
$url .= '//' . $autorite; |
} |
$url .= $this->chemin; |
$autorite = $this->getAutorite(); |
if ($autorite !== false) { |
$url .= '//' . $autorite; |
} |
$url .= $this->chemin; |
if ($this->requete !== false) { |
$url .= '?' . $this->requete; |
} |
if ($this->requete !== false) { |
$url .= '?' . $this->requete; |
} |
if ($this->fragment !== false) { |
$url .= '#' . $this->fragment; |
} |
return $url; |
} |
if ($this->fragment !== false) { |
$url .= '#' . $this->fragment; |
} |
/** |
* Renvoie une représentation de cette URL sous forme de chaine normalisée. Utile pour la |
* comparaison d'URLs |
* |
* @return string |
*/ |
public function getURLNormalisee() |
{ |
$url = clone $this; |
$url->normaliser(); |
return $url->getUrl(); |
} |
return $url; |
} |
/** |
* Renvoie une instance normalisée de Url |
* |
* @return Url |
*/ |
public function normaliser() |
{ |
// See RFC 3886, section 6 |
/** |
* Renvoie une représentation de cette URL sous forme de chaine normalisée. Utile pour la |
* comparaison d'URLs |
* |
* @return string |
*/ |
public function getURLNormalisee() |
{ |
$url = clone $this; |
$url->normaliser(); |
return $url->getUrl(); |
} |
// les cchémas sont insesibles à la casse |
if ($this->schema) { |
$this->schema = strtolower($this->schema); |
} |
/** |
* Renvoie une instance normalisée de Url |
* |
* @return Url |
*/ |
public function normaliser() |
{ |
// See RFC 3886, section 6 |
// les noms d'hotes sont insensibles à la casse |
if ($this->hote) { |
$this->hote = strtolower($this->hote); |
} |
// les cchémas sont insesibles à la casse |
if ($this->schema) { |
$this->schema = strtolower($this->schema); |
} |
// Supprimer le numéro de port par défaut pour les schemas connus (RFC 3986, section 6.2.3) |
if ($this->port && |
$this->schema && |
$this->port == getservbyname($this->schema, 'tcp')) { |
// les noms d'hotes sont insensibles à la casse |
if ($this->hote) { |
$this->hote = strtolower($this->hote); |
} |
$this->port = false; |
} |
// Supprimer le numéro de port par défaut pour les schemas connus (RFC 3986, section 6.2.3) |
if ($this->port && |
$this->schema && |
$this->port == getservbyname($this->schema, 'tcp')) { |
// 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); |
} |
} |
$this->port = false; |
} |
// normalisation des segments du chemin (RFC 3986, section 6.2.2.3) |
$this->chemin = self::supprimerSegmentsAPoints($this->chemin); |
// 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); |
} |
} |
// normalisation basée sur le schéma (RFC 3986, section 6.2.3) |
if ($this->hote && !$this->chemin) { |
$this->chemin = '/'; |
} |
} |
// normalisation des segments du chemin (RFC 3986, section 6.2.2.3) |
$this->chemin = self::supprimerSegmentsAPoints($this->chemin); |
/** |
* Renvoie vrai ou faux suivant que l'instance en cours représente une URL relative ou absolue. |
* |
* @return bool |
*/ |
public function etreAbsolue() |
{ |
return (bool) $this->schema; |
} |
// normalisation basée sur le schéma (RFC 3986, section 6.2.3) |
if ($this->hote && !$this->chemin) { |
$this->chemin = '/'; |
} |
} |
/** |
* Renvoie une instance de Url représentant une URL absolue relative à |
* cette URL. |
* |
* @param Url|string $reference URL relative |
* |
* @return Url |
*/ |
public function resoudre($reference) |
{ |
if (is_string($reference)) { |
$reference = new self($reference); |
} |
if (!$this->etreAbsolue()) { |
throw new Exception('L\'URL de base doit être absolue !'); |
} |
/** |
* Renvoie vrai ou faux suivant que l'instance en cours représente une URL relative ou absolue. |
* |
* @return bool |
*/ |
public function etreAbsolue() |
{ |
return (bool) $this->schema; |
} |
// 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; |
} |
/** |
* Renvoie une instance de Url représentant une URL absolue relative à |
* cette URL. |
* |
* @param Url|string $reference URL relative |
* |
* @return Url |
*/ |
public function resoudre($reference) |
{ |
if (is_string($reference)) { |
$reference = new self($reference); |
} |
if (!$this->etreAbsolue()) { |
throw new Exception('L\'URL de base doit être absolue !'); |
} |
$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 { |
$autorite = $reference->getAutorite(); |
if ($autorite !== false) { |
$cible->setAutorite($autorite); |
$cible->chemin = self::supprimerSegmentsAPoints($reference->chemin); |
$cible->requete = $reference->requete; |
} else { |
if ($reference->chemin == '') { |
$cible->chemin = $this->chemin; |
if ($reference->requete !== false) { |
$cible->requete = $reference->requete; |
} else { |
$cible->requete = $this->requete; |
} |
} else { |
if (substr($reference->chemin, 0, 1) == '/') { |
$cible->chemin = self::supprimerSegmentsAPoints($reference->chemin); |
} else { |
// Concaténation chemins (RFC 3986, section 5.2.3) |
if ($this->hote !== false && $this->chemin == '') { |
$cible->chemin = '/' . $this->chemin; |
} else { |
$i = strrpos($this->chemin, '/'); |
if ($i !== false) { |
$cible->chemin = substr($this->chemin, 0, $i + 1); |
} |
$cible->chemin .= $reference->chemin; |
} |
$cible->chemin = self::supprimerSegmentsAPoints($cible->chemin); |
} |
$cible->requete = $reference->requete; |
} |
$cible->setAutorite($this->getAutorite()); |
} |
$cible->schema = $this->schema; |
} |
// 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; |
} |
$cible->fragment = $reference->fragment; |
$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 { |
$autorite = $reference->getAutorite(); |
if ($autorite !== false) { |
$cible->setAutorite($autorite); |
$cible->chemin = self::supprimerSegmentsAPoints($reference->chemin); |
$cible->requete = $reference->requete; |
} else { |
if ($reference->chemin == '') { |
$cible->chemin = $this->chemin; |
if ($reference->requete !== false) { |
$cible->requete = $reference->requete; |
} else { |
$cible->requete = $this->requete; |
} |
} else { |
if (substr($reference->chemin, 0, 1) == '/') { |
$cible->chemin = self::supprimerSegmentsAPoints($reference->chemin); |
} else { |
// Concaténation chemins (RFC 3986, section 5.2.3) |
if ($this->hote !== false && $this->chemin == '') { |
$cible->chemin = '/' . $this->chemin; |
} else { |
$i = strrpos($this->chemin, '/'); |
if ($i !== false) { |
$cible->chemin = substr($this->chemin, 0, $i + 1); |
} |
$cible->chemin .= $reference->chemin; |
} |
$cible->chemin = self::supprimerSegmentsAPoints($cible->chemin); |
} |
$cible->requete = $reference->requete; |
} |
$cible->setAutorite($this->getAutorite()); |
} |
$cible->schema = $this->schema; |
} |
return $cible; |
} |
$cible->fragment = $reference->fragment; |
/** |
* 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 $chemin un chemin |
* |
* @return string un chemin |
*/ |
private static function supprimerSegmentsAPoints($chemin) |
{ |
$sortie = ''; |
return $cible; |
} |
// Assurons de ne pas nous retrouver piégés dans une boucle infinie due à un bug de |
// cette méthode |
$j = 0; |
while ($chemin && $j++ < 100) { |
// Étape A |
if (substr($chemin, 0, 2) == './') { |
$chemin = substr($chemin, 2); |
} elseif (substr($chemin, 0, 3) == '../') { |
$chemin = substr($chemin, 3); |
/** |
* 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 $chemin un chemin |
* |
* @return string un chemin |
*/ |
private static function supprimerSegmentsAPoints($chemin) |
{ |
$sortie = ''; |
// Étape B |
} elseif (substr($chemin, 0, 3) == '/./' || $chemin == '/.') { |
$chemin = '/' . substr($chemin, 3); |
// Assurons de ne pas nous retrouver piégés dans une boucle infinie due à un bug de |
// cette méthode |
$j = 0; |
while ($chemin && $j++ < 100) { |
// Étape A |
if (substr($chemin, 0, 2) == './') { |
$chemin = substr($chemin, 2); |
} elseif (substr($chemin, 0, 3) == '../') { |
$chemin = substr($chemin, 3); |
// Étape C |
} elseif (substr($chemin, 0, 4) == '/../' || $chemin == '/..') { |
$chemin = '/' . substr($chemin, 4); |
$i = strrpos($sortie, '/'); |
$sortie = $i === false ? '' : substr($sortie, 0, $i); |
// Étape B |
} elseif (substr($chemin, 0, 3) == '/./' || $chemin == '/.') { |
$chemin = '/' . substr($chemin, 3); |
// Étape D |
} elseif ($chemin == '.' || $chemin == '..') { |
$chemin = ''; |
// Étape C |
} elseif (substr($chemin, 0, 4) == '/../' || $chemin == '/..') { |
$chemin = '/' . substr($chemin, 4); |
$i = strrpos($sortie, '/'); |
$sortie = $i === false ? '' : substr($sortie, 0, $i); |
// Étape E |
} else { |
$i = strpos($chemin, '/'); |
if ($i === 0) { |
$i = strpos($chemin, '/', 1); |
} |
if ($i === false) { |
$i = strlen($chemin); |
} |
$sortie .= substr($chemin, 0, $i); |
$chemin = substr($chemin, $i); |
} |
} |
// Étape D |
} elseif ($chemin == '.' || $chemin == '..') { |
$chemin = ''; |
return $sortie; |
} |
// Étape E |
} else { |
$i = strpos($chemin, '/'); |
if ($i === 0) { |
$i = strpos($chemin, '/', 1); |
} |
if ($i === false) { |
$i = strlen($chemin); |
} |
$sortie .= substr($chemin, 0, $i); |
$chemin = substr($chemin, $i); |
} |
} |
/** |
* Renvoie une instance de Url representant l'URL canonique du script PHP |
* en cours d'éxécution |
* |
* @return string |
*/ |
public static function getCanonique() |
{ |
if (!isset($_SERVER['REQUEST_METHOD'])) { |
// ALERT - pas d'URL en cours |
throw new Exception('Le script n\'a pas été appellé à travers un serveur web'); |
} |
return $sortie; |
} |
// on part d'une URL relative |
$url = new self($_SERVER['PHP_SELF']); |
$url->schema = isset($_SERVER['HTTPS']) ? 'https' : 'http'; |
$url->hote = $_SERVER['SERVER_NAME']; |
$port = intval($_SERVER['SERVER_PORT']); |
if ($url->schema == 'http' && $port != 80 || |
$url->schema == 'https' && $port != 443) { |
/** |
* Renvoie une instance de Url representant l'URL canonique du script PHP |
* en cours d'éxécution |
* |
* @return string |
*/ |
public static function getCanonique() |
{ |
if (!isset($_SERVER['REQUEST_METHOD'])) { |
// ALERT - pas d'URL en cours |
throw new Exception('Le script n\'a pas été appellé à travers un serveur web'); |
} |
$url->port = $port; |
} |
return $url; |
} |
// on part d'une URL relative |
$url = new self($_SERVER['PHP_SELF']); |
$url->schema = isset($_SERVER['HTTPS']) ? 'https' : 'http'; |
$url->hote = $_SERVER['SERVER_NAME']; |
$port = intval($_SERVER['SERVER_PORT']); |
if ($url->schema == 'http' && $port != 80 || |
$url->schema == 'https' && $port != 443) { |
/** |
* Renvoie l'URL utilisée pour récupérer la requête en cours |
* |
* @return string |
*/ |
public static function getURLDemande() |
{ |
return self::getDemande()->getUrl(); |
} |
$url->port = $port; |
} |
return $url; |
} |
/** |
* Renvoie une instance de Url representant l'URL utilisée pour |
* récupérer la requête en cours |
* |
* @return Url |
*/ |
public static function getDemande() |
{ |
if (!isset($_SERVER['REQUEST_METHOD'])) { |
// ALERTE - pas d'URL en cours |
throw new Exception('Le script n\'a pas été appellé à travers un serveur web'); |
} |
/** |
* Renvoie l'URL utilisée pour récupérer la requête en cours |
* |
* @return string |
*/ |
public static function getURLDemande() |
{ |
return self::getDemande()->getUrl(); |
} |
// On part d'une URL relative |
$url = new self($_SERVER['REQUEST_URI']); |
$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; |
} |
/** |
* Renvoie une instance de Url representant l'URL utilisée pour |
* récupérer la requête en cours |
* |
* @return Url |
*/ |
public static function getDemande() |
{ |
if (!isset($_SERVER['REQUEST_METHOD'])) { |
// ALERTE - pas d'URL en cours |
throw new Exception('Le script n\'a pas été appellé à travers un serveur web'); |
} |
/** |
* Met à jour la valeur de l'option spécifiée. |
* |
* @param string $nomOption une des constantes commençant par self::OPTION_ |
* @param mixed $valeur valeur de l'option |
* |
* @return void |
* @see self::OPTION_STRICTE |
* @see self::OPTION_UTILISER_CROCHETS |
* @see self::OPTION_ENCODER_CLES |
*/ |
function setOption($nomOption, $valeur) |
{ |
if (!array_key_exists($nomOption, $this->options)) { |
return false; |
} |
$this->options[$nomOption] = $valeur; |
} |
// On part d'une URL relative |
$url = new self($_SERVER['REQUEST_URI']); |
$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; |
} |
/** |
* Renvoie la valeur de l'option specifiée. |
* |
* @param string $nomOption Nom de l'option demandée |
* |
* @return mixed |
*/ |
function getOption($nomOption) |
{ |
return isset($this->options[$nomOption]) |
? $this->options[$nomOption] : false; |
} |
public function __toString() { |
return $this->getURL(); |
} |
/** |
* Met à jour la valeur de l'option spécifiée. |
* |
* @param string $nomOption une des constantes commençant par self::OPTION_ |
* @param mixed $valeur valeur de l'option |
* |
* @return void |
* @see self::OPTION_STRICTE |
* @see self::OPTION_UTILISER_CROCHETS |
* @see self::OPTION_ENCODER_CLES |
*/ |
function setOption($nomOption, $valeur) |
{ |
if (!array_key_exists($nomOption, $this->options)) { |
return false; |
} |
$this->options[$nomOption] = $valeur; |
} |
/** |
* Renvoie la valeur de l'option specifiée. |
* |
* @param string $nomOption Nom de l'option demandée |
* |
* @return mixed |
*/ |
function getOption($nomOption) |
{ |
return isset($this->options[$nomOption]) |
? $this->options[$nomOption] : false; |
} |
public function __toString() { |
return $this->getURL(); |
} |
} |
/trunk/framework/Registre.php |
---|
3,18 → 3,18 |
/** |
* Classe registre, qui permet un accès à différentes variables à travers les autres classes. |
* C'est un singleton |
* |
* PHP Version 5 |
* |
* |
* PHP Version 5 |
* |
* @category Class |
* @package Framework |
* @author Jean-Pascal Milcent <jmp@tela-botanica.org> |
* @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/ |
* |
* @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 { |
42,7 → 42,7 |
return self::$registre; |
} |
self::$registre = new Registre; |
return self::$registre; |
return self::$registre; |
} |
/** |
/trunk/framework/Chronometre.php |
---|
1,165 → 1,165 |
<?php |
// declare(encoding='UTF-8'); |
/** Fichier de la classe Chronometre |
* |
* PHP Version 5 |
* |
* |
* PHP Version 5 |
* |
* @category PHP |
* @package Framework |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @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 |
* @version SVN: <svn_id> |
* @link /doc/framework/ |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/framework/ |
*/ |
/** Classe Chronometre() - Permet de stocker et d'afficher |
/** Classe Chronometre() - Permet de stocker et d'afficher |
* les temps d'éxécution de script. |
* |
* Cette classe permet de réaliser un ensemble |
* 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. |
* |
* |
* PHP Version 5 |
* |
* |
* |
* PHP Version 5 |
* |
* @category PHP |
* @package Framework |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @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 |
* @version Release: <package_version> |
* @link /doc/framework/ |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version Release: <package_version> |
* @link /doc/framework/ |
*/ |
class Chronometre { |
/*** Attributs : ***/ |
private $_temps = array(); |
/*** Attributs : ***/ |
private $_temps = array(); |
/** Constructeur : **/ |
public function __construct() { |
$this->setTemps(array('depart' => microtime())); |
} |
/** Constructeur : **/ |
public function __construct() { |
$this->setTemps(array('depart' => microtime())); |
} |
/** Accesseurs : |
* |
* @param string $cle la cle associ�e � un chronom�tre particulier |
* |
* @return int le temps �coul� |
*/ |
public function getTemps($cle = null) { |
$temps = ''; |
if (!is_null($cle)) { |
$temps = $this->_temps[$cle]; |
} else { |
$temps = $this->_temps; |
} |
return $temps; |
} |
/** Accesseurs : |
* |
* @param string $cle la cle associ�e � un chronom�tre particulier |
* |
* @return int le temps �coul� |
*/ |
public function getTemps($cle = null) { |
$temps = ''; |
if (!is_null($cle)) { |
$temps = $this->_temps[$cle]; |
} else { |
$temps = $this->_temps; |
} |
return $temps; |
} |
/** Setteur pour la variable temps |
* |
* @param array() $moment ajoute des points de chronom�trage au tableau _temps |
* |
* @return null |
*/ |
public function setTemps($moment = array ()) { |
array_push($this->_temps, $moment); |
} |
/** Setteur pour la variable temps |
* |
* @param array() $moment ajoute des points de chronom�trage au tableau _temps |
* |
* @return null |
*/ |
public function setTemps($moment = array ()) { |
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. |
* |
* 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 |
* 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, |
* 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. |
* Elle utilise une variable gobale : $_CHRONO_ |
* |
* @author Loic d'Anterroches |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* |
* @param int $indentation_origine l'indentation de base. |
* @param int $indentation le pas d'indentation. |
* @return string la chaine XHTML de mesure des temps. |
*/ |
public function afficherChrono($indentation_origine = 8, $indentation = 4) { |
// Création du chrono de fin |
$GLOBALS['_SCRIPT_']['chrono']->setTemps(array ( |
'fin' => microtime() |
)); |
/** 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 |
* 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, |
* 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. |
* Elle utilise une variable gobale : $_CHRONO_ |
* |
* @author Loic d'Anterroches |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* |
* @param int $indentation_origine l'indentation de base. |
* @param int $indentation le pas d'indentation. |
* @return string la chaine XHTML de mesure des temps. |
*/ |
public function afficherChrono($indentation_origine = 8, $indentation = 4) { |
// Création du chrono de fin |
$GLOBALS['_SCRIPT_']['chrono']->setTemps(array ( |
'fin' => microtime() |
)); |
// 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"; |
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) . |
'<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"; |
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) . |
'</thead>' . "\n"; |
// 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"; |
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) . |
'<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"; |
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) . |
'</thead>' . "\n"; |
$tbody = str_repeat(' ', ($indentation_origine + ($indentation * 1))) . |
'<tbody>' . "\n"; |
$tbody = str_repeat(' ', ($indentation_origine + ($indentation * 1))) . |
'<tbody>' . "\n"; |
$total_tps_ecoule = 0; |
$total_tps_ecoule = 0; |
// Récupération de la premiére mesure |
$tab_depart = & $this->getTemps(0); |
list ($usec, $sec) = explode(' ', $tab_depart['depart']); |
// 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 |
$tps_debut = ((float) $usec + (float) $sec); |
// Ce temps correspond à tps_fin |
$tps_debut = ((float) $usec + (float) $sec); |
foreach ($this->getTemps() as $tab_temps) { |
foreach ($tab_temps as $cle => $valeur) { |
list ($usec, $sec) = explode(' ', $valeur); |
$tps_fin = ((float) $usec + (float) $sec); |
foreach ($this->getTemps() as $tab_temps) { |
foreach ($tab_temps as $cle => $valeur) { |
list ($usec, $sec) = explode(' ', $valeur); |
$tps_fin = ((float) $usec + (float) $sec); |
$tps_ecoule = abs($tps_fin - $tps_debut); |
$total_tps_ecoule += $tps_ecoule; |
$tps_ecoule = abs($tps_fin - $tps_debut); |
$total_tps_ecoule += $tps_ecoule; |
$tbody .= str_repeat(' ', |
($indentation_origine + ($indentation * 2))) . |
'<tr>' . |
'<th>' . $cle . '</th>' . |
'<td>' . number_format($tps_ecoule, 3, ',', ' ') . '</td>' . |
'<td>' . number_format($total_tps_ecoule, 3, ',', ' ') . '</td>' . |
'</tr>' . "\n"; |
$tps_debut = $tps_fin; |
} |
} |
$tbody .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) . |
'</tbody>' . "\n"; |
$tbody .= str_repeat(' ', |
($indentation_origine + ($indentation * 2))) . |
'<tr>' . |
'<th>' . $cle . '</th>' . |
'<td>' . number_format($tps_ecoule, 3, ',', ' ') . '</td>' . |
'<td>' . number_format($total_tps_ecoule, 3, ',', ' ') . '</td>' . |
'</tr>' . "\n"; |
$tps_debut = $tps_fin; |
} |
} |
$tbody .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) . |
'</tbody>' . "\n"; |
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) . |
'<tfoot>' . "\n"; |
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 2))) . |
'<tr>' . |
'<th>' . 'Total du temps écoulé (en s.)' . '</th>' . |
'<td colspan="2">' . |
number_format($total_tps_ecoule, 3, ',', ' ') . '</td>' . |
'</tr>' . "\n"; |
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) . |
'</tfoot>' . "\n"; |
$sortie .= $tbody; |
$sortie .= str_repeat(' ', $indentation_origine) . |
'</table>' . "\n"; |
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) . |
'<tfoot>' . "\n"; |
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 2))) . |
'<tr>' . |
'<th>' . 'Total du temps écoulé (en s.)' . '</th>' . |
'<td colspan="2">' . |
number_format($total_tps_ecoule, 3, ',', ' ') . '</td>' . |
'</tr>' . "\n"; |
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) . |
'</tfoot>' . "\n"; |
$sortie .= $tbody; |
$sortie .= str_repeat(' ', $indentation_origine) . |
'</table>' . "\n"; |
return $sortie; |
} |
return $sortie; |
} |
} |
?> |
/trunk/framework/Config.php |
---|
9,11 → 9,11 |
* |
* @category PHP |
* @package Framework |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright 2009 Tela-Botanica |
* @license GPL-v3 et CECILL-v2 |
* @version SVN: <svn_id> |
* @link /doc/framework/ |
* @link /doc/framework/ |
*/ |
class Config { |
73,14 → 73,14 |
} |
private static function parserFichierIni($fichier_ini) { |
$retour = false; |
$retour = false; |
if (file_exists($fichier_ini)) { |
$ini = parse_ini_file($fichier_ini, true); |
$ini = self::analyserTableauIni($ini); |
self::fusionner($ini); |
$retour = true; |
} |
return $retour; |
$retour = true; |
} |
return $retour; |
} |
private static function fusionner(array $ini) { |
93,19 → 93,19 |
} else { |
if (strpos($param, '.') !== false) { |
$pieces = explode('.', $param, 2); |
if (strlen($pieces[0]) && strlen($pieces[1])) { |
if (isset($config[$pieces[0]])) { |
if (is_array($config[$pieces[0]])) { |
return self::getValeur($pieces[1], $config[$pieces[0]]); |
} |
} |
} |
} else { |
if (isset($config[$param])) { |
return $config[$param]; |
} |
} |
return null; |
if (strlen($pieces[0]) && strlen($pieces[1])) { |
if (isset($config[$pieces[0]])) { |
if (is_array($config[$pieces[0]])) { |
return self::getValeur($pieces[1], $config[$pieces[0]]); |
} |
} |
} |
} else { |
if (isset($config[$param])) { |
return $config[$param]; |
} |
} |
return null; |
} |
} |
125,14 → 125,14 |
private static function analyserTableauIni($config = array()) { |
foreach ($config as $cle => $valeur) { |
if (is_array($valeur)) { |
$config[$cle] = self::analyserTableauIni($valeur); |
} else { |
if (is_array($valeur)) { |
$config[$cle] = self::analyserTableauIni($valeur); |
} else { |
self::evaluerReferences($config, $cle); |
self::evaluerPhp($config, $cle); |
self::evaluerCle($config, $cle, $config[$cle]); |
} |
} |
self::evaluerPhp($config, $cle); |
self::evaluerCle($config, $cle, $config[$cle]); |
} |
} |
return $config; |
} |
140,39 → 140,39 |
if (strpos($cle, '.') !== false) { |
unset($config[$cle]); |
$pieces = explode('.', $cle, 2); |
if (strlen($pieces[0]) && strlen($pieces[1])) { |
if (!isset($config[$pieces[0]])) { |
if ($pieces[0] === '0' && !empty($config)) { |
// convert the current values in $config into an array |
$config = array($pieces[0] => $config); |
} else { |
$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à"); |
} |
$config[$pieces[0]] = self::evaluerCle($config[$pieces[0]], $pieces[1], $valeur); |
} else { |
throw new ErrorException("Clé invalide '$cle'"); |
} |
} else { |
$config[$cle] = $valeur; |
} |
return $config; |
if (strlen($pieces[0]) && strlen($pieces[1])) { |
if (!isset($config[$pieces[0]])) { |
if ($pieces[0] === '0' && !empty($config)) { |
// convert the current values in $config into an array |
$config = array($pieces[0] => $config); |
} else { |
$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à"); |
} |
$config[$pieces[0]] = self::evaluerCle($config[$pieces[0]], $pieces[1], $valeur); |
} else { |
throw new ErrorException("Clé invalide '$cle'"); |
} |
} else { |
$config[$cle] = $valeur; |
} |
return $config; |
} |
private static function evaluerReferences(&$config, $cle) { |
if (preg_match_all('/{ref:([A-Za-z0-9_-]+)}/', $config[$cle], $correspondances, PREG_SET_ORDER)) { |
foreach ($correspondances as $ref) { |
$config[$cle] = str_replace($ref[0], self::getValeur($ref[1], $config), $config[$cle]); |
} |
} |
foreach ($correspondances as $ref) { |
$config[$cle] = str_replace($ref[0], self::getValeur($ref[1], $config), $config[$cle]); |
} |
} |
} |
private static function evaluerPhp(&$config, $cle) { |
if (preg_match('/^php:(.+)$/', $config[$cle], $correspondances)) { |
eval('$config["'.$cle.'"] = '.$correspondances[1].';'); |
} |
eval('$config["'.$cle.'"] = '.$correspondances[1].';'); |
} |
} |
public static function charger($fichier_ini) { |
/trunk/framework/Modele.php |
---|
2,21 → 2,21 |
// 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 |
* 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 |
* |
* |
* PHP Version 5 |
* |
* @category Class |
* @package Framework |
* @author aurelien <aurelien@tela-botanica.org> |
* @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/ |
* |
* @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 { |
48,12 → 48,12 |
* Mot de passe |
*/ |
private $pass; |
/** |
* Encodage de la base de données |
*/ |
private $encodage = null; |
/** |
* Encodage de la base de données |
*/ |
private $encodage = null; |
/** |
* Connexion à la base de données |
*/ |
private $connexion = null; |
61,70 → 61,66 |
/** |
* Constructeur par défaut, appelé à l'initialisation. |
*/ |
final public function __construct() { |
// les différents paramètres nécessaires sont lus à partir du registre |
$this->registre = Registre::getInstance(); |
$this->type = Config::get('bdd_protocole'); |
$this->hote = Config::get('bdd_serveur'); |
$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; |
} |
/** |
* 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 |
*/ |
final protected function requete($requete) { |
// on ne se connecte que lors du premier appel à une requete (lazy connexion) |
if ($this->connexion == null) { |
$this->connecter(); |
} |
final public function __construct() { |
// les différents paramètres nécessaires sont lus à partir du registre |
$this->registre = Registre::getInstance(); |
$this->type = Config::get('bdd_protocole'); |
$this->hote = Config::get('bdd_serveur'); |
$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; |
} |
/** |
* 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 |
*/ |
final protected function requete($requete) { |
// on ne se connecte que lors du premier appel à une requete (lazy connexion) |
if ($this->connexion == null) { |
$this->connecter(); |
} |
return $this->connexion->query($requete); |
} |
/** |
* 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. |
* |
* @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 |
try { |
$this->connexion = new PDO($this->dsn, $this->utilisateur, $this->pass); |
if($this->encodage != null) { |
$this->requete("SET names '".$this->encodage."'"); |
} |
} catch (PDOException $e) { |
echo $e->getMessage(); |
} |
/** |
* 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. |
* |
* @throws PDOException une exception dans le cas ou là connexion échoue |
*/ |
final private function connecter() { |
$this->connexion = new PDO($this->dsn, $this->utilisateur, $this->pass); |
if($this->encodage != null) { |
$this->requete("SET names '".$this->encodage."'"); |
} |
} |
/** |
* 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 |
if ($this->connexion == null) { |
$this->connecter(); |
} |
} |
/** |
* 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 |
if ($this->connexion == null) { |
$this->connecter(); |
} |
return $this->connexion->quote($chaine); |
} |
/** |
* Destructeur de classe, se contente de fermer explicitement la connexion |
*/ |
final public function __destruct() { |
if ($this->connexion != null) { |
$this->connexion = null ; |
} |
} |
return $this->connexion->quote($chaine); |
} |
/** |
* Destructeur de classe, se contente de fermer explicitement la connexion |
*/ |
final public function __destruct() { |
if ($this->connexion != null) { |
$this->connexion = null ; |
} |
} |
} |
?> |
/trunk/framework/GestionnaireException.php |
---|
2,42 → 2,42 |
// declare(encoding='UTF-8'); |
/** |
* classe de gestion des exceptions. |
* |
* PHP Version 5 |
* |
* |
* PHP Version 5 |
* |
* @category Class |
* @package Framework |
* @author aurelien <aurelien@tela-botanica.org> |
* @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/ |
* |
* @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 |
*/ |
private static $exceptions; |
private static $exceptions = array(); |
/** |
* Détermine si l'on affiche ou nom le contexte |
*/ |
private $contexte; |
private static $contexte = false; |
/** |
* Definit si php est lancé en ligne de commande ou en mode serveur |
*/ |
private $mode; |
private static $mode = php_sapi_name ; |
/** |
* le gestionnaire d'exception est un singleton |
* et possède donc un "pointeur statique sur lui-même" |
*/ |
private static $gestionnaireException; |
/** |
* Constructeur avec paramètres optionnel |
* @param bool indique si l'on veut afficher ou non le contexte des exceptions (i.e. la trace) |
44,26 → 44,28 |
*/ |
public function __construct($contexte = false) { |
self::$exceptions = array(); |
$this->contexte = $contexte; |
$this->mode = php_sapi_name(); |
set_exception_handler(array($this,'gererException')); |
self::$mode = $contexte; |
self::$mode = php_sapi_name(); |
set_exception_handler(array(get_class($this),'gererException')); |
set_error_handler(array(get_class($this),'gererErreur')); |
} |
/** |
* Renvoie le booleen définissant si l'on affiche le contexte ou non |
*/ |
public function getContexte() { |
return $this->contexte; |
public static function getContexte() { |
return self::$mode; |
} |
/** |
* 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 |
*/ |
public function setContexte($contexte) { |
$this->contexte = $contexte; |
self::$mode = $contexte; |
} |
/** Fonction d'accès au singleton |
* @return GestionnaireErreur le gestionnaire d'exceptions courant |
*/ |
72,33 → 74,54 |
return self::$gestionnaireException; |
} |
self::$gestionnaireException = new GestionnaireException; |
return self::$gestionnaireException; |
return self::$gestionnaireException; |
} |
/** |
* Fonction de gestion des exceptions, remplace le handler par défaut |
*/ |
public static function gererException(Exception $e) { |
// pour le moment on se contente de l'ajouter au tableau |
self::$exceptions[] = $e; |
// pour le moment on se contente de l'ajouter au tableau et de les afficher |
self::$exceptions[] = $e; |
if($e->getCode() == 0 || $e->getCode() >= error_reporting()) { |
echo $e->getCode().' '.error_reporting(); |
echo self::getExceptions(); |
return; |
} |
} |
public static function gererErreur($niveau, $message, $fichier, $ligne, $contexte){ |
// si aucun rapport d'error, on sort directement |
if (error_reporting() == 0) |
{ |
return; |
} |
// sinon on crée une exception |
$e = new ErrorException($message, 0, $niveau, $fichier, $ligne); |
// que l'on donne au tableau d'exceptions |
self::$exceptions[] = $e; |
} |
/** |
* Renvoie les exceptions au format (X)HTML |
* ou bien au format texte suivant le mode d'utilisation de PHP |
*/ |
public function getExceptions() { |
public static function getExceptions() { |
$retour = ''; |
foreach (self::$exceptions as $e) { |
switch($this->mode) { |
case 'cli' : |
foreach (self::$exceptions as $e) { |
switch(self::$mode) { |
case 'cli' : |
$retour .= $e->getMessage()."\n"; |
$retour .= 'Fichier : '.$e->getFile()."\n"; |
$retour .= 'Ligne : '.$e->getLine()."\n"; |
$retour .= 'Ligne : '.$e->getLine()."\n"; |
$retour .= 'Message : '.$e->getMessage()."\n"; |
$retour .= 'Fichier : '.$e->getFile()."\n"; |
$retour .= 'Ligne : '.$e->getLine()."\n"; |
if ($this->getContexte()) { |
if (self::getContexte()) { |
$retour .= 'Contexte : '."\n".print_r($e->getTraceAsString(), true)."\n"; |
} |
break; |
108,8 → 131,8 |
$retour .= '<span class="debogage_fichier">'.'Fichier : '.$e->getFile().'</span>'."\n"; |
$retour .= '<span class="debogage_ligne">'.'Ligne : '.$e->getLine().'</span>'."\n"; |
$retour .= '</pre>'."\n"; |
if ($this->getContexte()) { |
if (self::getContexte()) { |
$retour .= '<pre>'."\n"; |
$retour .= '<strong>Contexte : </strong>'."\n".print_r($e->getTraceAsString(), true)."\n"; |
$retour .= '</pre>'."\n"; |
119,5 → 142,5 |
return $retour; |
} |
} |
} |
?> |
/trunk/.settings/org.eclipse.core.resources.prefs |
---|
1,3 → 1,7 |
#Tue Sep 01 10:42:29 CEST 2009 |
#Mon Aug 31 15:31:39 CEST 2009 |
eclipse.preferences.version=1 |
encoding//exemple/squelettes/ajout_admin.tpl.html=UTF-8 |
encoding//exemple/squelettes/ident_admin.tpl.html=UTF-8 |
encoding//exemple/squelettes/liste_admin.tpl.html=UTF-8 |
encoding//exemple/squelettes/modif_admin.tpl.html=UTF-8 |
encoding/<project>=UTF-8 |
/trunk/exemple/modeles/ListeAdmin.php |
---|
1,244 → 1,244 |
<?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 { |
private $config = array(); |
/** |
* 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 |
*/ |
class listeAdmin extends Modele { |
private $config = array(); |
/** |
* 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 |
*/ |
public function chargerAdmin() { |
$requete = 'SELECT * '. |
'FROM gen_annuaire '. |
'ORDER BY ga_id_administrateur'; |
$resultat = $this->requete($requete); |
$admin = array(); |
foreach ($resultat->fetchAll() as $ligne) { |
if ($ligne['ga_id_administrateur'] != 0) { |
$admin[] = $ligne; |
} |
} |
return $admin; |
} |
/** |
* 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é |
*/ |
public function loadDetailsAdmin($id) { |
$requete = 'SELECT * '. |
'FROM gen_annuaire '. |
"WHERE ga_id_administrateur = '$id' "; |
$resultat = $this->requete($requete); |
$admin = array(); |
foreach ($resultat->fetchAll() as $ligne) { |
$admin = $ligne; |
} |
return $admin; |
} |
/** |
* 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 |
* @param string le mail |
* @param string le code de langue |
* @param string le mot de passe (optionnel) |
* @param string la confirmation du mot de passe (optionnel) |
* @return array un tableau contenant les erreurs s'il y en a, vide sinon |
*/ |
function modifDetailsAdmin($id, $nom, $prenom, $mail, $lang, $pass = '', $pass_conf = '') { |
$res = array(); |
$nb_admin = 0; |
if (!$this->validerMail($mail)) { |
$res['mail'] = 'Adresse mail invalide'; |
} |
$query_verif_mail = 'SELECT COUNT(*) AS nb_admin '. |
'FROM gen_annuaire '. |
"WHERE ga_mail = '{$this->proteger($mail)}'". |
" AND ga_id_administrateur != $id "; |
if ($res_nb = $this->requete($query_verif_mail)) { |
$ligne = $res_nb->fetch(); |
$nb_admin = $ligne['nb_admin'] ; |
} else { |
$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' ; |
} |
$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 |
if($pass != '' || $pass_conf != '') { |
// 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)) ; |
} else { |
// si non, on notifiera l'utilisateur |
$res['pass'] = 'mot de passe invalide' ; |
} |
} |
$requete = 'SELECT * '. |
'FROM gen_annuaire '. |
'ORDER BY ga_id_administrateur'; |
$resultat = $this->requete($requete); |
$admin = array(); |
foreach ($resultat->fetchAll() as $ligne) { |
if ($ligne['ga_id_administrateur'] != 0) { |
$admin[] = $ligne; |
} |
} |
return $admin; |
} |
$query .= ' WHERE ga_id_administrateur='.$id ; |
if(count($res) != 0) { |
return $res ; |
} |
if($req_maj = $this->requete($query)) { |
} else { |
$res['bdd'] = 'Erreur de la requête dans la base de données' ; |
} |
return $res; |
} |
/** |
* 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 |
*/ |
function suppAdmin($id) { |
$nb_admin = 0 ; |
$res = '' ; |
$query_verif = 'SELECT COUNT(*) AS nb_admin FROM gen_annuaire' ; |
if($res_nb = $this->requete($query_verif)) { |
$ligne = $res_nb->fetch(); |
$nb_admin = $ligne['nb_admin'] ; |
} else { |
$res = 'Erreur dans la base de donn�es' ; |
return $res ; |
} |
if($nb_admin == 2) { |
$res = 'Impossible de supprimer le dernier administrateur' ; |
return $res ; |
} |
$query = 'DELETE FROM gen_annuaire WHERE ga_id_administrateur='.$id ; |
if($res_supp = $this->requete($query)) { |
return $res ; |
} else { |
$res = 'Erreur dans la base de données' ; |
return $res ; |
} |
} |
/** |
* Ajoute un administrateur dans la base de données |
* @param string nom |
* @param string prenom |
* @param string le mail |
* @param string le code de langue |
* @param string le mot de passe |
* @param string la confirmation du mot de passe |
* @return array un tableau contenant les erreurs s'il y en a, vide sinon |
*/ |
function ajoutAdmin($nom,$prenom,$mail,$lang,$pass,$pass_conf) { |
$nouvel_id = 0 ; |
$nb_admin = 0 ; |
$res = array() ; |
if(!$this->validerMail($mail)) { |
$res['mail'] = 'adresse mail invalide' ; |
} |
$query_verif_mail = 'SELECT COUNT(*) AS nb_admin FROM gen_annuaire WHERE ga_mail = '.$this->proteger($mail) ; |
if($res_nb = $this->requete($query_verif_mail)) { |
$ligne = $res_nb->fetch() ; |
$nb_admin = $ligne['nb_admin'] ; |
} else { |
$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' ; |
} |
if($pass != '' || $pass_conf != '') { |
// on vérifie si les deux concordent |
if($pass == $pass_conf) { |
} else { |
// si non, on notifiera l'utilisateur |
$res['pass'] = 'mot de passe invalide' ; |
} |
} |
$query = 'SELECT MAX(ga_id_administrateur) as nouvel_id FROM gen_annuaire' ; |
if($res_requete_id = $this->requete($query)) { |
$ligne = $res_requete_id->fetch() ; |
$nouvel_id = $ligne['nouvel_id'] + 1 ; |
} else { |
return $res ; |
} |
$query = 'INSERT INTO gen_annuaire VALUES ('.$nouvel_id.','.$this->proteger($lang).','. |
$this->proteger($nom).','.$this->proteger($prenom).','.$this->proteger(md5($pass)).','. |
$this->proteger($mail).')' ; |
if(count($res) != 0) { |
return $res ; |
} |
if($res_ajout = $this->requete($query)) { |
} else { |
$res['bdd'] = 'Erreur de la requête dans la base de données' ; |
} |
return $res ; |
} |
/** |
* 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 |
* @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) |
$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 |
// Test de l'adresse e-mail |
if (preg_match($regex, $mail)) { |
return true; |
} else { |
return false; |
} |
} |
/** |
* 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é |
*/ |
public function loadDetailsAdmin($id) { |
$requete = 'SELECT * '. |
'FROM gen_annuaire '. |
"WHERE ga_id_administrateur = '$id' "; |
$resultat = $this->requete($requete); |
$admin = array(); |
foreach ($resultat->fetchAll() as $ligne) { |
$admin = $ligne; |
} |
return $admin; |
} |
/** |
* 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 |
* @param string le mail |
* @param string le code de langue |
* @param string le mot de passe (optionnel) |
* @param string la confirmation du mot de passe (optionnel) |
* @return array un tableau contenant les erreurs s'il y en a, vide sinon |
*/ |
function modifDetailsAdmin($id, $nom, $prenom, $mail, $lang, $pass = '', $pass_conf = '') { |
$res = array(); |
$nb_admin = 0; |
if (!$this->validerMail($mail)) { |
$res['mail'] = 'Adresse mail invalide'; |
} |
$query_verif_mail = 'SELECT COUNT(*) AS nb_admin '. |
'FROM gen_annuaire '. |
"WHERE ga_mail = '{$this->proteger($mail)}'". |
" AND ga_id_administrateur != $id "; |
if ($res_nb = $this->requete($query_verif_mail)) { |
$ligne = $res_nb->fetch(); |
$nb_admin = $ligne['nb_admin'] ; |
} else { |
$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' ; |
} |
$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 |
if($pass != '' || $pass_conf != '') { |
// 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)) ; |
} else { |
// si non, on notifiera l'utilisateur |
$res['pass'] = 'mot de passe invalide' ; |
} |
} |
$query .= ' WHERE ga_id_administrateur='.$id ; |
if(count($res) != 0) { |
return $res ; |
} |
if($req_maj = $this->requete($query)) { |
} else { |
$res['bdd'] = 'Erreur de la requête dans la base de données' ; |
} |
return $res; |
} |
/** |
* 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 |
*/ |
function suppAdmin($id) { |
$nb_admin = 0 ; |
$res = '' ; |
$query_verif = 'SELECT COUNT(*) AS nb_admin FROM gen_annuaire' ; |
if($res_nb = $this->requete($query_verif)) { |
$ligne = $res_nb->fetch(); |
$nb_admin = $ligne['nb_admin'] ; |
} else { |
$res = 'Erreur dans la base de donn�es' ; |
return $res ; |
} |
if($nb_admin == 2) { |
$res = 'Impossible de supprimer le dernier administrateur' ; |
return $res ; |
} |
$query = 'DELETE FROM gen_annuaire WHERE ga_id_administrateur='.$id ; |
if($res_supp = $this->requete($query)) { |
return $res ; |
} else { |
$res = 'Erreur dans la base de données' ; |
return $res ; |
} |
} |
/** |
* Ajoute un administrateur dans la base de données |
* @param string nom |
* @param string prenom |
* @param string le mail |
* @param string le code de langue |
* @param string le mot de passe |
* @param string la confirmation du mot de passe |
* @return array un tableau contenant les erreurs s'il y en a, vide sinon |
*/ |
function ajoutAdmin($nom,$prenom,$mail,$lang,$pass,$pass_conf) { |
$nouvel_id = 0 ; |
$nb_admin = 0 ; |
$res = array() ; |
if(!$this->validerMail($mail)) { |
$res['mail'] = 'adresse mail invalide' ; |
} |
$query_verif_mail = 'SELECT COUNT(*) AS nb_admin FROM gen_annuaire WHERE ga_mail = '.$this->proteger($mail) ; |
if($res_nb = $this->requete($query_verif_mail)) { |
$ligne = $res_nb->fetch() ; |
$nb_admin = $ligne['nb_admin'] ; |
} else { |
$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' ; |
} |
if($pass != '' || $pass_conf != '') { |
// on vérifie si les deux concordent |
if($pass == $pass_conf) { |
} else { |
// si non, on notifiera l'utilisateur |
$res['pass'] = 'mot de passe invalide' ; |
} |
} |
$query = 'SELECT MAX(ga_id_administrateur) as nouvel_id FROM gen_annuaire' ; |
if($res_requete_id = $this->requete($query)) { |
$ligne = $res_requete_id->fetch() ; |
$nouvel_id = $ligne['nouvel_id'] + 1 ; |
} else { |
return $res ; |
} |
$query = 'INSERT INTO gen_annuaire VALUES ('.$nouvel_id.','.$this->proteger($lang).','. |
$this->proteger($nom).','.$this->proteger($prenom).','.$this->proteger(md5($pass)).','. |
$this->proteger($mail).')' ; |
if(count($res) != 0) { |
return $res ; |
} |
if($res_ajout = $this->requete($query)) { |
} else { |
$res['bdd'] = 'Erreur de la requête dans la base de données' ; |
} |
return $res ; |
} |
/** |
* 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 |
* @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) |
$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 |
// Test de l'adresse e-mail |
if (preg_match($regex, $mail)) { |
return true; |
} else { |
return false; |
} |
} |
} |
?> |
/trunk/exemple/admin_administrateur.php |
---|
23,11 → 23,11 |
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(); |
54,7 → 54,7 |
$pass = $_POST['admin_pass']; |
$pass_conf = $_POST['admin_pass_confirm']; |
return $controlleur->modifAdminVa($id, $nom, $prenom, $mail, $lang, $pass, $pass_conf); |
break; |
break; |
case 'suppr_admin': |
$id = $_GET['id_admin']; |
return $controlleur->supprAdmin($id); |
82,11 → 82,11 |
} |
function afficherContenuNavigation() { |
return ''; |
return ''; |
} |
function afficherContenuMenu() { |
return ''; |
return ''; |
} |
?> |
/trunk/exemple/index.php |
---|
7,93 → 7,97 |
$titre = ""; |
$contenu_pied = afficherContenuPied(); |
$contenu_menu = afficherContenuMenu(); |
$erreurs = GestionnaireException::getExceptions(); |
?> |
<!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> ©<a href="http://www.tela-botanica.org/" accesskey="1">Tela Botanica</a> / 2000-2004 - Le réseau des Botanistes Francophones</p> |
</div> |
</div> |
</body> |
<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> |
<?php echo $erreurs; ?> |
</div> |
<div id="pied"> |
<p> ©<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 |
---|
21,7 → 21,7 |
$this->chargerModele('ListeAdmin'); |
$data['erreurs'] = $erreurs; |
$data['admin'] = $this->ListeAdmin->chargerAdmin(); |
$this->chargerVue('liste_admin', $data); |
return $this->liste_admin; |