Subversion Repositories Applications.framework

Compare Revisions

Ignore whitespace Rev 185 → Rev 186

/trunk/framework/I18n.php
146,12 → 146,62
private static function chargerFichierIni($fichier_ini, $langue) {
self::$traductions[$langue] = false;
if (file_exists($fichier_ini)) {
self::$traductions[$langue] = parse_ini_file($fichier_ini, true);
$ini = parse_ini_file($fichier_ini, true);
Debug::printr($ini, 'Avant :');
$ini = self::analyserTableauIni($ini);
Debug::printr($ini, 'Aprés :');
self::$traductions[$langue] = $ini;
}
return (self::$traductions[$langue] === false) ? false : true;
}
/**
* Analyse un tableau de traductions pour évaluer les clés.
* @param array $i18n le tableau de traductions
* @return array le tableau analysé et modifié si nécessaire.
*/
private static function analyserTableauIni($i18n = array()) {
//ATTENTION : il est important de passer la valeur par référence car nous la modifions dynamiquement dans la boucle
foreach ($i18n as $cle => &$valeur) {
if (is_array($valeur)) {
$i18n[$cle] = self::analyserTableauIni($valeur);
} else {
$i18n = self::evaluerCle($i18n, $cle, $valeur);
}
}
return $i18n;
}
/**
* Dans le cas des chaines de traduction à sous clé (ex.: cle.souscle), cette méthode
* évalue les valeurs correspondantes et créée les sous tableaux associés.
* @param array $i18n tableau de traductions (par référence)
* @param string $cle la cle dans le tableau
* @param string $valeur la valeur à affecter
*/
private static function evaluerCle($i18n, $cle, $valeur) {
if (strpos($cle, '.') !== false) {
unset($i18n[$cle]);
$pieces = explode('.', $cle, 2);
if (strlen($pieces[0]) && strlen($pieces[1])) {
if (isset($i18n[$pieces[0]]) && !is_array($i18n[$pieces[0]])) {
$m = "Ne peut pas créer de sous-clé pour '{$pieces[0]}' car la clé existe déjà";
trigger_error($m, E_USER_WARNING);
} else {
$i18n[$pieces[0]][$pieces[1]] = $valeur;
$i18n[$pieces[0]] = self::evaluerCle($i18n[$pieces[0]], $pieces[1], $valeur);
}
} else {
$m = "Clé invalide '$cle'";
trigger_error($m, E_USER_WARNING);
}
} else {
$i18n[$cle] = $valeur;
}
return $i18n;
}
/**
* Cherche l'information sur la langue demandée par l'application
*/
private static function trouverLangue() {
/trunk/framework/Application.php
3,31 → 3,41
/**
* Classe fournissant des informations au Framework sur l'application.
*
* PHP version 5
*
* @category Debogage
* @package Framework
// Auteur principal :
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
// Autres auteurs :
* @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$$
* @copyright 1999-2009 Tela Botanica (accueil@tela-botanica.org)
* @category PHP 5.2
* @package Framework
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
* @version SVN : $Id$
* @link /doc/framework/
*/
class Application {
 
/**
* tableau d'informations sur l'application
* Tableau d'informations sur l'application
*/
private static $info = null;
/**
* chemin de base de l'application
* Chemin de base de l'application
*/
private static $chemin = null;
 
/**
* Modificateur pour le chemin de base
* Initialise différentes classes du Framework nécessaires pour le fonctionnement de l'application.
* Ces classes sont ensuites controlées via les fichiers de config.ini.
* Elle est appelée automatiquement suite à la définition du chemin de l'application via Application::setChemin().
*/
private static function initialiser() {
// Instanciation du gestionnaire d'exception
GestionnaireException::getInstance();
// Instanciation du gestionnaire de logs
Log::getInstance();
}
/**
* Permet d'indiquer le chemin de base de l'Application.
* Cette méthode doit obligatoirement être utilisée par l'application pour que le Framework fonctionne correctement.
* @param string $chemin_fichier_principal chemin de base
*/
public static function setChemin($chemin_fichier_principal) {
36,6 → 46,7
trigger_error("Le fichier indiqué n'existe pas. Utilisez __FILE__ dans la méthode set().", E_USER_ERROR);
} else {
self::$chemin = dirname($chemin_fichier_principal).DS;
self::initialiser();
}
} else {
trigger_error("Le chemin de l'application a déjà été enregistré auprès du Framework", E_USER_WARNING);
/trunk/framework/config.defaut.ini
21,6 → 21,10
; Débogage
; Indique si oui ou non on veut afficher le débogage.
fw_debogage = true
; Indique sous quelle forme les méssages de débogage doivent s'afficher :
; - Debug::MODE_ECHO : le message est affiché en utilisant echo
; - Debug::MODE_NOTICE : le message est affiché en utilisant une erreur de type notice
fw_debogage_mode = "php:Debug::MODE_ECHO"
; 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.
/trunk/framework/Chronometre.php
1,32 → 1,27
<?php
// declare(encoding='UTF-8');
/** Classe Chronometre() - Permet de stocker et d'afficher
* les temps d'éxécution de script.
/** Classe Chronometre() - Permet de stocker et d'afficher 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
* sein d'un tableau XHTML.
* 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
*
* @category PHP
* @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
* @version Release: <package_version>
* @link /doc/framework/
* @category PHP 5.2
* @package Framework
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
* @version SVN : $Id$
* @link /doc/framework/
*/
class Chronometre {
/*** Attributs : ***/
private $_temps = array();
private static $instance = null;
private static $temps = array();
 
/** Constructeur : **/
public function __construct() {
$this->setTemps(array('depart' => microtime()));
private function __construct() {
self::setTemps('depart', microtime());
}
 
/** Accesseurs :
35,12 → 30,12
*
* @return int le temps écoulé
*/
public function getTemps($cle = null) {
private static function getTemps($cle = null) {
$temps = '';
if (!is_null($cle)) {
$temps = $this->_temps[$cle];
$temps = self::$temps[$cle];
} else {
$temps = $this->_temps;
$temps = self::$temps;
}
return $temps;
}
51,39 → 46,46
*
* @return null
*/
public function setTemps($moment = array ()) {
array_push($this->_temps, $moment);
private static function setTemps($cle, $moment) {
array_push(self::$temps, array($cle => $moment));
}
 
/*** Méthodes : ***/
 
/** Méthode afficherChrono() -
/**
* Effectue un chronometrage.
*
* @param string le nom du point de chronométrage
* @return null
*/
public static function chrono($cle) {
$moment = microtime();
self::verifierCreationInstance();
self::setTemps($cle, $moment);
}
/**
* 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.
* 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>
* @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) {
public static function afficherChrono($indentation_origine = 8, $indentation = 4) {
self::verifierCreationInstance();
// Création du chrono de fin
$GLOBALS['_SCRIPT_']['chrono']->setTemps(array (
'fin' => microtime()
));
self::setTemps('fin', microtime());
 
// Début création de l'affichage
$sortie = str_repeat(' ', $indentation_origine) .
105,13 → 107,13
$total_tps_ecoule = 0;
 
// Récupération de la premiére mesure
$tab_depart = & $this->getTemps(0);
$tab_depart = self::getTemps(0);
list ($usec, $sec) = explode(' ', $tab_depart['depart']);
 
// Ce temps correspond à tps_fin
$tps_debut = ((float) $usec + (float) $sec);
 
foreach ($this->getTemps() as $tab_temps) {
foreach (self::getTemps() as $tab_temps) {
foreach ($tab_temps as $cle => $valeur) {
list ($usec, $sec) = explode(' ', $valeur);
$tps_fin = ((float) $usec + (float) $sec);
148,5 → 150,14
 
return $sortie;
}
/**
* Vérifie si l'instance de classe à été crée, si non la crée
*/
private static function verifierCreationInstance() {
if (empty(self::$instance)) {
self::$instance = new Chronometre();
}
}
}
?>
/trunk/framework/Config.php
5,15 → 5,14
* Elle offre l'accès en lecture seule aux paramètres de config.
* C'est une Singleton.
*
* PHP Version 5
*
* @category PHP
* @package Framework
* @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/
* @category PHP 5.2
* @package Framework
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
* @version SVN : $Id$
* @link /doc/framework/
*/
 
class Config {
167,7 → 166,7
* @return array le tableau analysé
*/
private static function analyserTableauIni($config = array()) {
foreach ($config as $cle => $valeur) {
foreach ($config as $cle => &$valeur) {
if (is_array($valeur)) {
$config[$cle] = self::analyserTableauIni($valeur);
} else {
/trunk/framework/Debug.php
5,20 → 5,20
* L'affichage et l'utilisation de ces fonctions sont améliorés via cette classe.
* Cette classe est inspirée de la classe Zend_Debug.
*
* PHP version 5
*
* @category Debogage
* @package Framework
// Auteur principal :
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
// Autres auteurs :
* @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$$
* @copyright 1999-2009 Tela Botanica (accueil@tela-botanica.org)
* @category PHP 5.2
* @package Framework
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
* @version SVN : $Id$
* @link /doc/framework/
*/
class Debug {
 
const MODE_ECHO = 'echo';
const MODE_NOTICE = 'e_user_notice';
/**
* mode de php (cli ou sapi)
*/
42,7 → 42,7
* @param boolean $echo si true on affiche le résultat, si false on ne renvoie que la chaine sans l'afficher
* @return string la chaine à afficher representant le dump ou null si echo
*/
public static function dump($variable, $mot_cle = null, $echo = true) {
public static function dump($variable, $mot_cle = null, $echo = false) {
// var_dump de la variable dans un buffer et récupération de la sortie
ob_start();
var_dump($variable);
56,13 → 56,13
}
 
/**
* Equivalent de print_r
* Equivalent de print_r.
* @param mixed $variable la variable à afficher
* @param string $mot_cle le mot cle à associer
* @param boolean $echo faire un echo ou non
* @return string la chaine contenant la variable printée ou null si echo
*/
public static function printr($variable, $mot_cle = null, $echo = true) {
public static function printr($variable, $mot_cle = null, $echo = false) {
// Récupération de la sortie
$sortie = print_r($variable, true);
 
85,10 → 85,14
$sortie = self::traiterSortieSuivantMode($mot_cle, $sortie);
 
// Affichage et/ou retour
self::verifierParametresConfig();
if (Config::get('fw_debogage') == true) {
if ($echo) {
if ($echo === true || Config::get('fw_debogage_mode') == self::MODE_ECHO) {
echo $sortie;
return null;
} else if (Config::get('fw_debogage_mode') == self::MODE_NOTICE) {
trigger_error($sortie, E_USER_NOTICE);
return null;
} else {
return $sortie;
}
119,5 → 123,23
}
return $sortie;
}
/**
* Vérifie que tous les paramêtres de config nécessaires au fonctionnement de cette classe existe dans les fichiers
* de configurations.
*/
private static function verifierParametresConfig() {
$ok = true;
$parametres = array('fw_debogage', 'fw_debogage_mode');
foreach ($parametres as $param) {
if (is_null(Config::get($param))) {
$classe = get_class();
$m = "L'utilisation de la classe $classe nécessite de définir '$param' dans un fichier de configuration.";
trigger_error($m, E_USER_WARNING);
$ok = false;
}
}
return $ok;
}
}
?>