Bontiv-Sourceer source code viewer
Root | Help
./PhpMyCMS/inc/module.php
<?php
include_once "sql.php";
/**
 * Gestion des plugins / Modules
 *
 * @version $Id$
 * @copyright 2009
 */

/** Ducumentation Technique
*
* -----------------
* Ajout d'un module de la base des modules du site
* Class: module($name, $parent, $infos)
*
* Vous devez creer un objet module.
* Exemple: $Mon_Module = new module($name, $parent, $infos)
*
* ---- Liste des arguments
* --$name : Nom technique du module (doit être unique. Si un autre module
* veux être installé sous le nom d'un module déjà installé, alors le script
* demandera la désinstallation du module déjà présent. Le nom doit être un
* identifiant valide (voir http://php.net/language.variables).
*
* --$parent : Désigne le module parent dont dépends le plugin, ou si c'est la
* déclaration d'un module, alors il doit contenir son propre nom.
*
* --$infos : tableau associatif contenant les informations sur l'auteur, la
* version et la description du module.
*
* ---- Valeur de retour
* Une instance de la configuration du module. ATTENTION il ne faut surtout pas
* détruire l'objet sinon le module rique de ne pas pouvoir être appellé.
*
* ---------------------
* Défini l'ordre de chargement des modules
* Class: module
* Static Method: SetCouche()
*
* Défini l'ordre de chargement des modules.
*
* ---------------------
* Récupérer une liste des modules existant sur le site
* Class: module
* Static Method: ListMod()
*
* Permet de récupérer une liste des modules présents sur le site. Attention,
* cette liste comprend AUSSI les modules non installés.
*
* ---- Valeur de retour
* retourne un tableau de tous les modules / plugins qui se sont déclarés
*
* ----------------------
* Inclure un fichier de tous les répertoire des modules
* Class: module
* Static Method: GlobalInclude($file, $inst = TRUE)
*
* Permet de charger le fichier $file contenu dans chacun des répertoires des
* modules selon l'ordre défini par les dépendances.
*
* ---- Liste des arguments
* --$file : Non du fichier à inclure. Recherche dans tous les répertoires de
* module ce fichier et l'inclus s'il existe.
*
* --$inst (défaut: TRUE) : Si cette valeur est à TRUE alors ne recherche le
* fichier que dans les modules qui sont installés. Sinon recherche dans tous
* les modules du site.
*
* ----------------------
* Savoir si un module est installé ou non
* Class: module
* Static Method: Is_Installed($mod)
*
* ---- List des arguments
* --$mod : Nom technique d'un module dont on veux savoir s'il est installé ou
* non.
*
* ---- Valeur de retour
* Retourne TRUE si le module est installé, sinon FALSE.
* **/

final class module {

    static private
$modlist = array();
    static private
$ModOk = array();
    static private
$ModDisp = array();
    static private
$ext = array();

    static public function
LoadMods() {
       
$data = new Data('installed');
       
$data->Select();
        while(
$data->next()){
            switch(
$data->type){
                case
'mod':
                   
array_push(self::$ModDisp, $data->name);
                   
self::$modlist = array_merge(self::$modlist, array($data->name => $data->row));
                   
self::$modlist[$data->name]['depends'] = explode(',', trim($data->depends, ','));
                   
self::$modlist[$data->name]['depends'] = array_map('trim', self::$modlist[$data->name]['depends']);
                   
//var_dump(self::$modlist[$data->name]['depends']);
                   
break;
                case
'ext':
                   
array_push(self::$ext, array(
                       
'name' => $data->name,
                       
'parent' => $data->parent,
                       
'depends' => array_map('trim',
                           
explode(',', trim($data->depends, ','))
                            )
                        )
                    );

                    break;
            }
// switch
       
} // while
   
}

    static private function
IncModDepends($mod) {;
       
$ModOk = array_intersect(self::$ModDisp, self::$modlist[$mod]['depends']);
        if (
count(array_diff($ModOk, self::$modlist[$mod]['depends']))) {
           
trigger_error('Module: dépendance non trouvé:'
               
.implode(', ', array_diff($ModOk, self::$modlist[$mod]['depends'])),
               
E_USER_ERROR);
            die;
        }
       
$ToInst = array_diff($ModOk, self::$ModOk);
        foreach(
$ToInst as $module){
            if (!
array_search($module, self::$ModOk)) {
               
self::IncModDepends($module);
            }
        }
       
self::$ModOk[] = $mod;
    }

    static function
SetCouche(){
        foreach(
self::$ModDisp as $mod){
            if (
array_search($mod, self::$ModOk) === false) {
               
self::IncModDepends($mod);
            }
        }
    }

    static function
ListMod($ext = true){
       
$list = self::$ModDisp;
        if (
$ext) {
            foreach(
self::$ext as $ext){
               
$list[] = $ext['name'];
            }
        }
        return
$list;
    }

    static function
GlobalInclude($file, $inst = TRUE){
        if (
$inst) {
           
$dir = self::$ModOk;
        } else {
           
$dir = scandir(PATH.'/mod/');
           
$dir = array_diff($dir, array('.', '..'));
           
trigger_error('global scan', E_USER_WARNING);
           
$dir = array();
        }

       
//des Modules
       
foreach($dir as $mod){
            if (
file_exists(PATH.'/mod/'.$mod.'/'.$file)) {
                include_once
PATH.'/mod/'.$mod.'/'.$file;
            }
        }

       
//des extentions
       
foreach(self::$ext as $mod){
            if (
file_exists(PATH.'/ext/'.$mod['name'].'/'.$file)) {
                include_once
PATH.'/ext/'.$mod['name'].'/'.$file;
            }
        }
    }

    static function
LoadAll($prefix, $fun){
        foreach(
self::$ModOk as $mod){
           
ExeModFun($prefix.'_'.$mod, $fun);
        }
    }

    static function
Is_Installed($mod){
        return (isset(
self::$ModOk[$mod]))?(TRUE):(FALSE);
    }
}
?>
Presented with Bontiv-Sourceer