plugins_asc) || !isset($this->plugins_desc)){ return false; } if($PRIORITE == "ASC") return $this->plugins_asc; if($PRIORITE == "DESC") return $this->plugins_desc; return false; } public function plugin($plugin_name){ if(!isset($this->plugins_asc) || isset($this->plugins_desc)){ return false; } if(!isset($this->plugins_asc[$plugin_name])){ return false; } return $this->plugins_asc[$plugin_name]; } # --------------------------------------------------------------------------------- # init # public function load_plugins($RELOAD = false){ if(!$RELOAD && isset($this->plugins_asc) && isset($this->plugins_desc)){ return true; } $this->plugins_asc = array(); $this->plugins_desc = array(); if(!($dh = opendir($this->path("mw_dir")."plugins/"))){ return false; } $OK = true; while($OK && ($plugin_name = readdir($dh)) !== false){ if(substr($plugin_name, 0 ,1) !== "." && is_dir($this->path("mw_dir")."plugins/".$plugin_name)){ if(($plugin = $this->load_plugin($plugin_name)) === false){ $OK = false; } } } closedir($dh); if(!$OK){ return false; } if(($plugins = $this->plugins()) === false){ return false; } if(file_exists($this->plugins_data_dir()) && is_dir($this->plugins_data_dir())){ if(!($dh = opendir($this->plugins_data_dir()))){ return false; } while(($plugin_name = readdir($dh)) !== false){ if(substr($plugin_name, 0 ,1) != "." && !is_dir($this->plugin_data_file($plugin_name))){ if(!isset($plugins[$plugin_name])) $this->del_plugin_data($plugin_name); } } closedir($dh); } return true; } public function load_plugin($plugin_name){ if(substr($plugin_name, 0 ,1) == "." || !is_dir($this->path("mw_dir")."plugins/".$plugin_name)){ return false; } if(($plugin = $this->plugin_data($plugin_name)) === false){ return false; } if(($plugin["impl"] = $this->plugin_impl($plugin_name)) === false){ return false; } $MAJ = false; if(!isset($plugin["installed"]) || !isset($plugin["enabled"])){ $plugin["installed"] = false; $plugin["enabled"] = false; $plugin["priorite"] = 0; $MAJ = true; } if(!$plugin["installed"] && $plugin["enabled"]){ $plugin["enabled"] = false; $MAJ = true; } if($MAJ){ if(!$this->set_plugin_data($plugin_name, $plugin)){ return false; } } $plugin["title"] = ($plugin_title = $this->plugin_call($plugin["impl"], "title")) ? $plugin_title : ""; $plugin["description"] = ($plugin_description = $this->plugin_call($plugin["impl"], "description")) ? $plugin_description : ""; $plugin["name"] = $plugin_name; if(!isset($this->plugins_asc)) $this->plugins_asc = array(); $this->plugins_asc[$plugin_name] = $plugin; $this->plugins_asc = $this->ordonne_plugins($this->plugins_asc, "ASC"); $this->plugins_desc = $this->ordonne_plugins($this->plugins_asc, "DESC"); return $plugin; } public function plugins_loaded(){ if(($plugins = $this->plugins()) === false){ return; } foreach($plugins as $plugin_name => $plugin){ $plugin["impl"]->loaded($this); } } public function init_plugins(){ if($this->bdd_ready() !== true) return; if(($plugins = $this->plugins("DESC")) === false){ $this->erreur("erreur lors de l'initialisation des plugins", true); } foreach($plugins as $plugin_name => $plugin){ if($plugin["installed"] && $plugin["enabled"]){ if(!$plugin["impl"]->init($this)){ $this->erreur("erreur lors de l'initialisation du plugin ".$plugin_name, true); } } } } public function ordonne_plugins($plugins, $PRIORITE = "ASC"){ $values = array_values($plugins); $maximum = count($values); while($maximum > 0){ $maximumTemporaire = 0; for($i = 0; $i < $maximum - 1; $i++){ if( ($PRIORITE == "ASC" && $values[$i]["priorite"] > $values[$i + 1]["priorite"]) || ($PRIORITE == "DESC" && $values[$i]["priorite"] < $values[$i + 1]["priorite"]) ){ $tmp = $values[$i]; $values[$i] = $values[$i + 1]; $values[$i + 1] = $tmp; $maximumTemporaire = $i + 1; } } $maximum = $maximumTemporaire; } $res = array(); foreach($values as $value) if($value["name"]) $res[$value["name"]] = $value; return $res; } public function plugin_call($impl, $method){ if(method_exists($impl, $method)) return $impl->$method($this); } # --------------------------------------------------------------------------------- # impl # public function plugin_impl($plugin_name){ $plugin = false; if(file_exists($this->path("mw_dir")."plugins")){ if(substr($plugin_name, 0 ,1) !== "." && is_dir($this->path("mw_dir")."plugins/".$plugin_name)){ if(file_exists($this->path("mw_dir")."plugins/".$plugin_name."/".$plugin_name.".php")){ if(!class_exists($plugin_name)){ require_once $this->path("mw_dir")."plugins/".$plugin_name."/".$plugin_name.".php"; } if(class_exists($plugin_name)){ $plugin = new $plugin_name(); } } } } return $plugin; } # --------------------------------------------------------------------------------- # data # public function plugins_data_dir(){ return $this->path("content")."data/plugins/"; } public function plugin_data_file($plugin_name){ return $this->plugins_data_dir().$plugin_name; } public function plugin_data($plugin_name){ $data_file = $this->plugin_data_file($plugin_name); $data = array(); if(file_exists($data_file)){ if($content = file_get_contents($data_file)){ $data = unserialize($content); } } return $data; } public function set_plugin_data($plugin_name, $data){ if(!is_dir($this->plugins_data_dir())) @mkdir($this->plugins_data_dir()); if(!is_dir($this->plugins_data_dir())) return false; $data_file = $this->plugin_data_file($plugin_name); $content = serialize($data); $OK = false; if($fh = fopen($data_file, "w")){ if(fwrite($fh, $content) !== false){ $OK = true; } fclose($fh); } return $OK; } public function del_plugin_data($plugin_name){ $data_file = $this->plugin_data_file($plugin_name); if(file_exists($data_file)) return @unlink($data_file); return true; } } // ------------------------------------------------------------------------------------------- // class mw_plugin // abstract class mw_plugin{ public function title(){ return "(sans titre)"; } public function description(){ return ""; } public function loaded($env){ } public function install($env){ return true; } public function uninstall($env){ return true; } public function enable($env){ return true; } public function disable($env){ return true; } public function init($env){ return true; } }