Subversion Repositories Applications.framework

Compare Revisions

Ignore whitespace Rev 238 → Rev 239

/trunk/framework/Registre.php
1,86 → 1,69
<?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 et paramètres à travers les autres classes.
* C'est un remplaçant à la variable magique $_GLOBALS de Php.
* C'est un singleton.
* Si vous avez besoin de modifier dynamiquement des paramètres de configuration, utiliser le @see Registe, il est fait pour ça.
* Si vous voulez paramètré votre application via le fichier config.ini, utilisez plutôt la classe @see Config.
*
* @category php 5.2
* @package Framework
* @author Jean-Pascal Milcent <jmp@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @author Jean-Pascal MILCENT <jmp@tela-botanica.org>
* @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
* @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 $Id$
* @link /doc/framework/
*
*/
class Registre {
 
/** Tableau associatif stockant les variables */
private $stockage = array();
/** Tableau associatif stockant les variables. */
private static $stockage = array();
/** 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 */
private function __construct() { }
 
/**
* 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) {
return self::$registre;
}
self::$registre = new Registre;
return self::$registre;
}
 
/**
* Ajoute un objet au tableau selon un intitulé donné
* 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);
public static function set($intitule, $objet) {
if (is_array($objet) && isset(self::$stockage[$intitule])) {
self::$stockage[$intitule] = array_merge((array) self::$stockage[$intitule], (array) $objet);
$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;
self::$stockage[$intitule] = $objet;
}
}
 
/**
* Renvoie l'objet associé à l'intitulé donné en paramètre
* Renvoie le contenu 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])) {
return $this->stockage[$intitule];
}
return null;
public static function get($intitule) {
$retour = (isset(self::$stockage[$intitule])) ? self::$stockage[$intitule] : null;
return $retour;
}
 
/**
* 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é.
* @param string l'intitulé de l'entrée du registre à détruire.
*/
public function detruire($intitule) {
if (isset($this->stockage[$intitule])) {
unset($this->stockage[$intitule]);
public static function detruire($intitule) {
if (isset(self::$stockage[$intitule])) {
unset(self::$stockage[$intitule]);
}
}
 
/**
* Teste si un objet est présent sous un intitulé donné
* Teste si le registre contient une donnée pour un intitulé d'entrée donné.
* @param string l'intitulé de l'entrée du registre à tester.
* @return boolean true si un objet associé à cet intitulé est présent, false sinon
*/
public function existe($intitule) {
if (isset($this->stockage[$intitule])){
return true;
}
return false;
public static function existe($intitule) {
$retour = (isset(self::$stockage[$intitule])) ? true : false;
return $retour;
}
}
?>
/trunk/framework/Chronometre.php
11,19 → 11,14
* @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$
* @version $Id$
* @link /doc/framework/
*/
class Chronometre {
/*** Attributs : ***/
private static $instance = null;
private static $pointArretNumero = 1;
private static $temps = array();
 
/** Constructeur : **/
private function __construct() {
self::setTemps('depart', microtime());
}
 
/** Accesseurs :
*
* @param string $cle la cle associée à un chronomètre particulier
31,12 → 26,7
* @return int le temps écoulé
*/
private static function getTemps($cle = null) {
$temps = '';
if (!is_null($cle)) {
$temps = self::$temps[$cle];
} else {
$temps = self::$temps;
}
$temps = (is_null($cle)) ? self::$temps : self::$temps[$cle];
return $temps;
}
 
53,14 → 43,16
/*** Méthodes : ***/
/**
* Effectue un chronometrage.
* Effectue un chronometrage.
* Vous pouvez indiquer le nom du point de chronométrage.
* Si vous n'indiquez rien, un nombre sera généré en débutant à 1.
*
* @param string le nom du point de chronométrage
* @return null
*/
public static function chrono($cle) {
public static function chrono($cle = null) {
$cle = ($cle == null) ? self::$pointArretNumero++ : $cle;
$moment = microtime();
self::verifierCreationInstance();
self::setTemps($cle, $moment);
}
75,37 → 67,16
* Le développeur initial de cette fonction est Loic d'Anterroches.
* Elle a été modifiée par Jean-Pascal Milcent.
*
* @author Loic d'Anterroches
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
*
* @param int $indentation_origine l'indentation de base.
* @param int $indentation le pas d'indentation.
* @author Loic d'Anterroches
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @param string l'eventuel nom du point de chronométrage de fin.
* @return string la chaine XHTML de mesure des temps.
*/
public static function afficherChrono($indentation_origine = 8, $indentation = 4) {
self::verifierCreationInstance();
public static function afficherChrono($cle = null) {
// Création du chrono de fin
self::setTemps('fin', microtime());
self::chrono();
 
// Début création de l'affichage
$sortie = str_repeat(' ', $indentation_origine) .
'<table id="chrono" lang="fr" summary="Résultat du
chronométrage du programme affichant la page actuelle.">' . "\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) .
'<caption>Chronométrage</caption>' . "\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) .
'<thead>' . "\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 2))) .
'<tr><th>Action</th><th>Temps écoulé (en s.)</th>
<th>Cumul du temps écoulé (en s.)</th></tr>' . "\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) .
'</thead>' . "\n";
 
$tbody = str_repeat(' ', ($indentation_origine + ($indentation * 1))) .
'<tbody>' . "\n";
 
$total_tps_ecoule = 0;
 
// Récupération de la premiére mesure
$tab_depart = self::getTemps(0);
list ($usec, $sec) = explode(' ', $tab_depart['depart']);
112,7 → 83,8
 
// Ce temps correspond à tps_fin
$tps_debut = ((float) $usec + (float) $sec);
 
$tbody = '';
foreach (self::getTemps() as $tab_temps) {
foreach ($tab_temps as $cle => $valeur) {
list ($usec, $sec) = explode(' ', $valeur);
120,44 → 92,30
 
$tps_ecoule = abs($tps_fin - $tps_debut);
$total_tps_ecoule += $tps_ecoule;
 
$tbody .= str_repeat(' ',
($indentation_origine + ($indentation * 2))) .
'<tr>' .
'<th>' . $cle . '</th>' .
'<td>' . number_format($tps_ecoule, 3, ',', ' ') . '</td>' .
'<td>' . number_format($total_tps_ecoule, 3, ',', ' ') . '</td>' .
'</tr>' . "\n";
$tps_debut = $tps_fin;
// Gestion affichage
$total_tps_ecoule_fmt = number_format($total_tps_ecoule, 3, ',', ' ');
$tps_ecoule_fmt = number_format($tps_ecoule, 3, ',', ' ');
$tbody .= '<tr><th>'.$cle.'</th><td>'.$tps_ecoule_fmt.'</td><td>'.$total_tps_ecoule_fmt.'</td></tr>'."\n";
}
}
$tbody .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) .
'</tbody>' . "\n";
$total_tps_ecoule_final_fmt = number_format($total_tps_ecoule, 3, ',', ' ');
// Début création de l'affichage
$sortie = '<table id="chrono" lang="fr" summary="Résultat duchronométrage du programme affichant la page actuelle.">'."\n".
'<caption>Chronométrage</caption>'."\n".
'<thead>'."\n".
' <tr><th>Action</th><th>Temps écoulé (en s.)</th><th>Cumul du temps écoulé (en s.)</th></tr>'."\n".
'</thead>'."\n".
'<tbody>'."\n".
$tbody.
'</tbody>'."\n".
'<tfoot>'."\n".
' <tr><th>Total du temps écoulé (en s.)</th><td colspan="2">'.$total_tps_ecoule_final_fmt.'</td></tr>'."\n".
'</tfoot>'."\n".
'</table>'."\n";
 
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) .
'<tfoot>' . "\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 2))) .
'<tr>' .
'<th>' . 'Total du temps écoulé (en s.)' . '</th>' .
'<td colspan="2">' .
number_format($total_tps_ecoule, 3, ',', ' ') . '</td>' .
'</tr>' . "\n";
$sortie .= str_repeat(' ', ($indentation_origine + ($indentation * 1))) .
'</tfoot>' . "\n";
$sortie .= $tbody;
$sortie .= str_repeat(' ', $indentation_origine) .
'</table>' . "\n";
 
return $sortie;
}
/**
* Vérifie si l'instance de classe à été crée, si non la créer
*/
private static function verifierCreationInstance() {
if (empty(self::$instance)) {
self::$instance = new Chronometre();
}
}
}
?>
/trunk/framework/Bdd.php
179,12 → 179,19
}
/**
* @deprecated changement de nom. Disparaîtra dans la version 0.4. Utiliser à la place : @see requeter
*/
final protected function requete($requete) {
return $this->requeter($requete, $mode);
}
/**
* Execute une requête et retourne le résultat tel que renvoyé par l'abstraction courante.
*
* @param string la requête à effectuer
* @return mixed un objet contenant le résultat de la requête
*/
public function requete($requete) {
public function requeter($requete) {
$this->connecter();
 
$retour = null;
209,8 → 216,15
}
return $retour;
}
 
/**
* @deprecated changement de nom. Disparaîtra dans la version 0.4. Utiliser à la place : @see recuperer
*/
final protected function requeteUn($requete, $mode = self::MODE_ASSOC) {
return $this->recuperer($requete, $mode);
}
/**
* Execute une requête et retourne le premier résultat sous forme de tableau (par défaut) ou d'objet.
* Les noms des champs de la base de données correspondent aux noms des clés du tableau ou aux noms des attributs de l'objet.
*
218,7 → 232,7
* @param string le mode de retour ASSOC (Bdd::MODE_ASSOC) pour un tableau ou OBJECT (Bdd::MODE_OBJET) pour un objet.
* @return mixed un objet ou un tableau contenant le résultat de la requête
*/
public function requeteUn($requete, $mode = self::MODE_ASSOC) {
public function recuperer($requete, $mode = self::MODE_ASSOC) {
$this->connecter();
 
$retour = null;
248,8 → 262,15
}
return $retour;
}
 
/**
* @deprecated changement de nom. Disparaîtra dans la version 0.4. Utiliser à la place : @see recupererTous
*/
final protected function requeteTous($requete, $mode = self::MODE_ASSOC) {
return $this->recupererTous($requete, $mode);
}
/**
* Execute une requête et retourne un tableau de résultats. Un résultat peut être présentés sous forme
* de tableau (par défaut) ou d'objet.
* Les noms des champs de la base de données correspondent aux noms des clés du tableau résultat ou
259,9 → 280,9
* @param string le mode de retour des résultats : ASSOC (Bdd::MODE_ASSOC) pour un tableau ou OBJECT (Bdd::MODE_OBJET) pour un objet.
* @return array un tableau contenant les résultats sous forme d'objets ou de tableau (par défaut).
*/
public function requeteTous($requete, $mode = self::MODE_ASSOC) {
public function recupererTous($requete, $mode = self::MODE_ASSOC) {
$this->connecter();
 
$retour = null;
switch ($this->abstraction) {
case self::ABSTRACTION_PDO :
336,6 → 357,38
}
 
/**
* Retourne l'identifiant de la dernière ligne insérée, ou la dernière valeur d'une séquence d'objets, dépendamment, dans
* le cas de PDO, du driver utilisé. Les méthodes utilisées pour retourner l'identifiant peuvent avoir des comportements
* différent. Consulter la documentation PHP correspondant à l'abstraction choisie avant de l'utiliser :
* @link(http://fr.php.net/manual/fr/pdo.lastinsertid.php, PDO::lastInsertId([ string $name = NULL ]))
* @link(http://php.net/manual/en/mysqli.insert-id.php, mysqli->insert_id())
* @link(http://fr.php.net/manual/fr/function.mysql-insert-id.php, mysql_insert_id())
* @link(http://fr.php.net/manual/fr/sqlite3.lastinsertrowid.php, SQLite3::lastInsertRowID())
* @param mixed un paramètre éventuel à transmettre (en fonction de l'abstraction de BDD utilisée).
* @return mixed le dernier identifiant de clé primaire ajouté dans la base de données (string ou int).
*/
public function recupererIdDernierAjout($parametres = null) {
$this->connecter();
 
$retour = $chaine;
switch ($this->abstraction) {
case self::ABSTRACTION_PDO :
$retour = $this->connexion->lastInsertId($parametres);
break;
case self::ABSTRACTION_MYSQL :
$retour = mysql_insert_id($this->connexion);
break;
case self::ABSTRACTION_MYSQLI :
$retour = $this->connexion->insert_id();
break;
case self::ABSTRACTION_SQLITE3 :
$retour = $this->connexion->lastInsertRowID();
break;
}
return $retour;
}
/**
* Destructeur de classe, se contente de fermer explicitement la connexion à la base de donnée.
*/
protected function __destruct() {
/trunk/framework/Controleur.php
5,14 → 5,14
* qui devrait être appelée de l'extérieur.
* Elle est abstraite donc doit obligatoirement être étendue.
*
* @category php5
* @package Framework
* @category php 5.2
* @package Framework
* @author Aurélien PERONNET <aurelien@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version SVN: $Id$
* @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
* @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 $Id$
* @link /doc/framework/
*
*/
20,8 → 20,17
/** Variable statique indiquant que les tableaux _GET et _POST ont déjà été encodé au format de l'appli. */
private static $encodage = false;
 
/** Registre global, normalement accessible partout */
private $registre;
/** Chemin de base vers les classes métiers de la partie Modèle de l'application. */
private $base_chemin_modele = null;
/** Chemin de base vers les fichiers squelette de la partie Vue de l'application. */
private $base_chemin_squelette = null;
/** Chemin de base vers les classes controleurs de la partie Controleur de l'application. */
private $base_chemin_controleur = null;
/** Base de l'url de l'application. */
private $base_url_applicaton = null;
 
/**
* Constructeur par défaut
/trunk/framework/Config.php
4,7 → 4,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.
* C'est une Singleton.
*
* Si vous avez besoin de modifier dynamiquement des paramètres de configuration, utiliser le @see Registe, il est fait pour ça.
*
* @category PHP 5.2
* @package Framework
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>