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