<?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);
}
}
?>