begin process at 2012 05 27 17:57:14
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > PHP5 - CLASSE DE GESTION DE MODULES

PHP5 - CLASSE DE GESTION DE MODULES


 Information sur la source

Note :
10 / 10 - par 3 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :poo, php5, statique, abstraction, module Niveau :Initié Date de création :20/07/2006 Vu :8 026

Auteur : FhX

Ecrire un message privé
Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note

 Description

Alors, je savais pas si je devais mettre ca dans les tutos ou ici. Je tente ici sait on jamais.
Aujourd'hui, quoi de neuf ? Gestion de modules d'un site web.
Un truc tout simple bien entendu.
La gestion des modules se fait via un simple fichier XML. Dans ce fichier, on établi si oui ou non on veut activer le module. C'est pour le moment quelque chose de très simple.
Voici le code :

Source

  • <?php
  • // Toute classe doit hériter de celle ci.
  • abstract class Core {
  • static private $module = array();
  • static private $modconf = NULL;
  • public function __construct($modname) {
  • if ( !isset(self::$modconf) ) self::$modconf = simplexml_load_file('./class/init.xml');
  • if ( self::isModLoadable($modname) ) {
  • self::$module[$modname] = TRUE;
  • } else {
  • throw new Exception('Module impossible à instancier');
  • }
  • }
  • static private function isModLoadable($modname) {
  • foreach ( self::$modconf->module as $module ) {
  • if ( (string) strtolower($module->name) == strtolower($modname)
  • && (string) strtolower($module->loadable) == 'true' )
  • return TRUE;
  • }
  • return FALSE;
  • }
  • }
  • // Voici donc la classe en elle-même. C'est un truc tout simple n'est-ce-pas ?
  • // L'emploi des propriétés statiques est faite pour controler les modules. (et encore, c'est pas très poussé pour le moment !
  • // Voici le fichier XML :
  • ?>
  • <?xml version="1.0" encoding="iso-8859-1"?>
  • <modules>
  • <module>
  • <name>mysql</name>
  • <loadable>TRUE</loadable>
  • </module>
  • <module>
  • <name>news</name>
  • <loadable>TRUE</loadable>
  • </module>
  • <module>
  • <name>test</name>
  • <loadable>FALSE</loadable>
  • </module>
  • </modules>
  • <?php
  • // La aussi, c'est du simple, on voit aisément la relation entre la classe du haut et le fichier ci-dessus.
  • // Prenons une classe d'un projet :
  • class x extends Core {
  • public $y;
  • private $z;
  • public function __construct() {
  • parent::__construct(__CLASS__);
  • }
  • // .... etc...
  • }
  • // En instanciant mon objet, je vais vérifier via la méthode statique si je peux oui ou non utiliser mon module.
  • // Voici comment se passe l'instanciation :
  • try {
  • $x = new x;
  • $x->doSomething();
  • $x->try();
  • } catch ( Exception $e ) {
  • echo $e->getMessage();
  • }
  • // Que va t'il se passer ? Si le module 'x' est présent dans mon fichier XML, et que 'loadable' => TRUE alors je peux continuer à utiliser mon objet, SINON on passe par la case d'exception.
  • // On peut voir ca avec un système de news et de commentaires.
  • // Imaginons qu'on puisse n'avoir que les news et les commentaires desactivés :
  • try {
  • $news = new NewsFactory;
  • $news->method();
  • // ...
  • // Fin d'affichage de la news, affichage des commentaires :
  • try {
  • $comments = new CommentsFactory;
  • $comments->show();
  • // ...
  • } catch ( Exception $e1 ) {
  • // Signifie que les commentaires seront desactivés
  • }
  • } catch ( Exception $e2 ) {
  • // Signifie que les news et les commentaires sont desactivés
  • }
  • ?>
<?php
// Toute classe doit hériter de celle ci.
abstract class Core {
	
 static private $module = array();
 static private $modconf = NULL;
	
 public function __construct($modname) {
 	
   if ( !isset(self::$modconf) ) self::$modconf = simplexml_load_file('./class/init.xml');
   
   if ( self::isModLoadable($modname) ) {
   	    self::$module[$modname] = TRUE;
   } else {
   	    throw new Exception('Module impossible à instancier');
   }
   
 }

 static private function isModLoadable($modname) {
 	   
   foreach ( self::$modconf->module as $module ) {
   	          if ( (string) strtolower($module->name) == strtolower($modname)
   	            && (string) strtolower($module->loadable) == 'true' )
   	          return TRUE;
   }
  return FALSE;
 	
 }
 
}

// Voici donc la classe en elle-même. C'est un truc tout simple n'est-ce-pas ?
// L'emploi des propriétés statiques est faite pour controler les modules. (et encore, c'est pas très poussé pour le moment !
// Voici le fichier XML :
?>
<?xml version="1.0" encoding="iso-8859-1"?>
<modules>
 <module>
  <name>mysql</name>
  <loadable>TRUE</loadable>
 </module>
 <module>
  <name>news</name>
  <loadable>TRUE</loadable>
 </module>
 <module>
  <name>test</name>
  <loadable>FALSE</loadable>
 </module>
</modules>
<?php
// La aussi, c'est du simple, on voit aisément la relation entre la classe du haut et le fichier ci-dessus.

// Prenons une classe d'un projet :
class x extends Core {

 public $y;
 private $z;

 public function __construct() {
  parent::__construct(__CLASS__);
 }

 // .... etc...

}

// En instanciant mon objet, je vais vérifier via la méthode statique si je peux oui ou non utiliser mon module.
// Voici comment se passe l'instanciation :

try {
 $x = new x;
 $x->doSomething();
 $x->try();
} catch ( Exception $e ) {
 echo $e->getMessage();
}

// Que va t'il se passer ? Si le module 'x' est présent dans mon fichier XML, et que 'loadable' => TRUE alors je peux continuer à utiliser mon objet, SINON on passe par la case d'exception.
// On peut voir ca avec un système de news et de commentaires.
// Imaginons qu'on puisse n'avoir que les news et les commentaires desactivés :

try {
 $news = new NewsFactory;
 $news->method();
 // ...
 // Fin d'affichage de la news, affichage des commentaires :
  try {
   $comments = new CommentsFactory;
   $comments->show();
   // ...
  } catch ( Exception $e1 ) {
    // Signifie que les commentaires seront desactivés
  }

} catch ( Exception $e2 ) {
  // Signifie que les news et les commentaires sont desactivés
}

?>

 Conclusion

Ca peut marcher pour n'importe quel type de module.
On peut étendre la classe Core pour une utilisation plus poussé des methodes :
if ( Core::module_loaded($modulename) )
Core::Unload_module($modulename);

etc...

Et encore, les possibilités sont immenses !
Si vous avez des suggestions, je prend. Je compte developper un ptit truc sympa avec ca. J'ai de la reserve de code sur l'ordi mais je compte pas encore vous le faire partager... un peu plus tard surement :p


 Sources du même auteur

PHP5 - UTILISATION DES ITÉRATEURS ET DE LA RÉFLECTION.
PHP 5 - CLASSE MYSQL (STYLE MYSQLI)
[PHP5] CLASSE DATE/HEURE
PHP5 - GESTION DE MODULES EN OBJET
PHP5 - CLASSE DE NEWS ET DE COMMENTAIRES

 Sources de la même categorie

Source avec Zip GÉNÉRATION AUTOMATIQUE DE FICHIER .CLASS.PHP EN FONCTION D'U... par ig3
CLASSE D'OBJET DE CRYPTAGE ET DÉCRYPTAGE DE CHAINES DE CARAC... par 8Tnerolf8
Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture TODO LIST (AJAX/PHP5) par VinceMonkeyz
Source avec Zip [PHP5.2] CLASSE PDO par hornetbzz
CLASS RECHERCHE PHP5 POO par mtrix000
CLASS AUTHENTIFICATION PHP5 POO par mtrix000
PHP5 - GESTION DE MODULES EN OBJET par FhX

Commentaires et avis

Commentaire de FhX le 20/07/2006 23:39:01

Quand je me relis, j'ai pas l'impression d'être clair, surtout pour un débutant.
Jme trompe ?

Commentaire de wizad le 21/07/2006 07:17:59

Je n'ai pas bien été attentif au code (vient de me reveiller) mais de réputation ça doit être un trés bon code (et pour une fois c'est une classe originale).

Commentaire de glad le 21/07/2006 08:20:35

Salut,

Ca a l'air pas mal ton truc...
On peut avoir un exemple détaillé ?
Merci
à +

Commentaire de malalam le 21/07/2006 09:49:06 administrateur CS

Yeah, FhX qui se met doucment au XML :-) Ca me fait plaisir ;-)

Bon...très bonne classe, très bonne idée, très bien codée!

Juste, un truc que je changerais...une petite optimisation que tu vas vite comprendre avec cet exemple :

<?php
$sXml = <<<XML
<?xml version="1.0" encoding="iso-8859-1"?>
<modules>
<module>
  <name>mysql</name>
  <loadable>TRUE</loadable>
</module>
<module>
  <name>news</name>
  <loadable>TRUE</loadable>
</module>
<module>
  <name>test</name>
  <loadable>FALSE</loadable>
</module>
</modules>
XML;
$sMod = 'news';
$oXml = simplexml_load_string ($sXml);
$aResult = $oXml -> xpath ('//module[name="'.$sMod.'"]');
echo $aResult[0] -> loadable;
?>

10, en tous cas !

Commentaire de Naixn le 21/07/2006 10:42:30

Très sympa comme code, que je trouve facile à comprendre, à condition de bien tout lire, donc je ne vois pas de problème :)

Je pense que ce qu'il serait sympa de configurer via le fichier XML, ce serait le nom d'une variable avec sa valeur nécessaire pour que "loadable" soit "true". J'entends par là une variable de session par exemple.
En effet, ça permettrait de loader le module de commentaire seulement si la personne est logguée, via $_SESSION['loggued'] = true, ou $_SESSION['level'] > 0 (0 pas loggué, 1 membre, 2 modérateur, etc.), elle ne pourra voir et poster des commentaire qu'à ce moment là.
Tout ça ne sont que des exemples parmis tant d'autres, mais je pense que ça pourra servir :)

Malalam > Juste pour info de mon côté, le xpath est donc plus optimisé que de faire une recherche en foreach ? :) Je pense que oui, sinon, tu ne l'aurais pas proposé, mais je préfère m'en assurer, et si tu sais pourquoi, si tu pouvais m'en informer :)

Merci à vous deux en tout cas :)

Commentaire de malalam le 21/07/2006 10:54:48 administrateur CS

Pour être franc, je n'ai pas fait de bench. Mais disons que là, on fait un accès direct au bon noeud, via une recherche Xpath; Xpath étant fait pour, je présume qu'il est optimisé. Alors que dans l'autre cas, on parcourt tout le flux xml (en fait, il y a un Xpath aussi, qui se place à la racine du document, renvoie le document sous forme de tableau d'objets simplexml...on parcourt ce tableau d'objet et on vérifie celui que l'on cherche. Dans mon cas, le xPath se place directement sur le noeud contenant l'élément recherché, il renvoie un tableau avec l'élément name, et l'élément loadable correspondants, auquels on accède directement).

Commentaire de wizad le 21/07/2006 10:56:15

<module>
  <name>mysql</name>
  <loadable>TRUE</loadable>
  <params>
      <param name="acces_type">0 (0 pas loggué, 1 membre, 2 modérateur, etc.)</param>
  </params>
</module>

Commentaire de FhX le 21/07/2006 11:00:09

Ah vi en effet Malalam, je savais même pas qu'on pouvait faire ca avec XPath. Je voyais plus ou moins le truc, mais je captais pas comment ca marchait (:/). Hop hop hop, je modifie :p


Pour Naixn, en effet, je pense pouvoir intégrer un système avec niveau d'utilisateur. De toute facon, j'en ai pas le choix :)

Commentaire de Naixn le 21/07/2006 11:16:07

Fhx > C'est pas forcément niveau utilisateur non plus.
Genre je sais pas, tu es sur un hébergement Free, donc un truc qui met trois piges à charger de temps à autre. En fonction du temps que ça a mis à charger un partie du code, tu vas loader, ou non, un module du site. Et dans ce cas là, il faut avoir un temps de réponse inférieur à tant de microsecondes, etc.
Enfin c'est un exemple pris à la volée, mais je pense que ça peut servir, et ça s'intègre de toute façon bien, à mon avis, avec le système d'utilisateur :)

Commentaire de Garno le 22/07/2006 22:23:58

Quel est l'avantage d'utiliser un fichier XML plutôt qu'une table MySQL dans ce cas-ci ? Moi j'utilise XML seulement lorsque j'ai besoin de portabilité comme pour les fichiers de langue ou les configurations selon les styles de site. Mais ici je ne vois pas du tout l'utiliter d'un fichier XML. Est-ce que vous pouvez m'éclairer :) ?

Sinon c'est une bonne source qui aide a comprendre le fonctionnement des modules mais il y a seulement l'élément XML qui me chicotte.

Commentaire de FhX le 23/07/2006 17:59:04

XML peut être utilisé pour tout et n'importe quoi, comme une base de donnée.
J'aurais pu utiliser un fichier .ini, une base de donnée SQL, un simple fichier .txt bref, les possibilités sont nombreuses.
Pourquoi un XML ?
Imagine que la configuration de ton site repose sur un XML, il est assez aisé de pouvoir implémenter mon code dedand.
Bref, les gouts et les couleurs quoi :)

J'aime bien SQL moi aussi, mais la sur le coup jvoulais le faire avec XML. Pour utiliser ma classe avec SQL, suffit de réécrire la classe pour SQL c'est tout :)

Commentaire de malalam le 24/07/2006 09:20:23 administrateur CS

Hello,

curieusement, moi, je vois ça dans l'autre sens : quel intérêt d'utiliser une base de données quand on peut s'en passer ? La plupart des sites s'appuient lourdement sur une base de données. Quand c'est un petit site perso, pas de problème...quand c'est un site plus lourd...on a tout intérêt à soulager le serveur de base de données. J'utilise souvent XML dans ce cadre-ci. XML me sert à faire des tracelog, à faire de la localisation, à faire, comme ici, de la configuration, et parfois même, je m'en sers comme vraie base de données. Pour décrire un produit, par exemple, XML est parfait; il a même un gros avantage par rapport à une bdd : c'est un langage de description de données. Quand je parle de description d'un produit, je ne parle pas de description textuelle : sa description dans le but de le générer par la suite, en pdf par exemple.

Commentaire de Garno le 25/07/2006 02:32:52

Salut,

Est-il plus rapide d'utiliser XML plutôt que MySQL car je comprend qu'il est très utile de créer des fichiers XML pour ensuite générer des fichiers mais pour le reste je n'en vois pas dutout l'utilité ou plutôt l'avantage de devoir gèrer de multiple fichiers plutôt qu'une simple base de données. Merci d'éclairer mes lanternes :)

Je sais pas si ce commentaire à sa place dans cette source mais je tente quand même puisque je veux absolument éclaircir ce point pour ma culture personnelle ;)

Commentaire de wizad le 25/07/2006 07:16:48

De façons objective les deux choix peuvent être les plus rapide cela dépend surtout de l'architecture des scripts et des serveurs utilisé : par exemple l'un des avantage de mysql peut être le fait de refiler le traitement pour la selection de données à une autre machine que celle fesant tourner apache (et ainsi ne pas pénaliser les autres utilisateur du site) => éviter les surcharge de la machine apache. Cette méthode se base sur le principe de la délégation des taches de façons à améliorer les rendements. Il en existe d'autre qui se valent et dispose chacune de leurs avantages et inconvénients. Il est aprés possible d'étendre le raisonement à l'architecture des site en eux mêmes.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

HELP ME!! instalation du module PHP sur ApacheWin [ par benny54 ] Help me!!!!est ce que quelqu'un pourrait m'aidé pour l'installation du module PHP sur un serveur web Apache Win32?iamtheboss@oreka.com PHP: gif animé devient statique [ par JEROMAX ] Salutje ne sais pas si c'est le bon endroit pour poser cette question mais j'y vais quand même.. ;-)Mon probleme est le suivant: Je rafraichi une div Suggestion Nix! [ par Jackboy ] Salut, maintenant vous allez faire la vérification de nos posts et commantaires. Sans être trop radicale en supprimant un message, rajouter dans ce si differnec entre php 4 et php5 [ par hardelgylls ] Bonjourpetite question :j'ai passer un oral et l'examinateur m'a demandé quel était la différence entre php4 et php5. et la gros blanc, est ce que qqu Doc PHP5 sniff sniff [ par slhuilli ] Bonjour, Bonsoir,Je suis a la recherche d'un PDF qui recenserait les mots-clefs + explications (bref un bouquin complet) sur PHP 5 qui parait-il est executer vb ou delphi [ par fmazoue ] est ce que c possible d'executer sur une page internet des module en vb ou delphi ????parce que en fait je voudrai que l'on puisse coller une image su module d'archivage [ par inssetman ] Bonjour ! :)voilà j'aimerais savoir si vous avez une piste, ou même mieux si qq avait déjà fait qq chose de similaire, sil i pouvait m'envoyer ses sou Php : Générer un document html statique ? [ par tatapol ] Salut,J'aimerai savoir si quelqu'un sait comment générer un document html via php. en fait, je voudrais créer des pages statiques... comment dire... " Class POO retourné le nom de l'objet [ par MeTh ] Bonjour,Comment retourné le nom de l'objet déclaré?exemple :$monobjet = new GridR();comment recuperé $monobjet dans ma class?Merci Pb passage PHP4 -> PHP5 [ par Galmiza ] Salut,J'ai acheté un bouquin pour débuter le PHP.J'ai suivi a la lettre les instructions du livre:-installer EasyPHP 1.7-installer PHP 5.0..-lancer Ea


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,827 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales