reorganisation init
[mtweb] / mw / env / modules / mw_env_plugins.php
1 <?php
2
3   class mw_env_plugins extends mw_env{
4
5     public $plugins_asc;
6     public $plugins_desc;
7
8     public function plugins($PRIORITE = "ASC"){
9       if(!isset($this->plugins_asc) || !isset($this->plugins_desc)){
10         return false;
11       }
12       if($PRIORITE == "ASC") return $this->plugins_asc;
13       if($PRIORITE == "DESC") return $this->plugins_desc;
14       return false;
15     }
16
17     public function plugin($plugin_name){
18       if(!isset($this->plugins_asc) || isset($this->plugins_desc)){
19         return false;
20       }
21       if(!isset($this->plugins_asc[$plugin_name])){
22         return false;
23       }
24       return $this->plugins_asc[$plugin_name];
25     }
26
27     # ---------------------------------------------------------------------------------
28     #                                                                              init
29     #
30
31     public function load_plugins($RELOAD = false){
32       if(!$RELOAD && isset($this->plugins_asc) && isset($this->plugins_desc)){
33         return true;
34       }
35       $this->plugins_asc = array();
36       $this->plugins_desc = array();
37       if(!($dh = opendir($this->path("mw_dir")."plugins/"))){
38         return false;
39       }
40       $OK = true;
41       while($OK && ($plugin_name = readdir($dh)) !== false){
42         if(substr($plugin_name, 0 ,1) !== "." && is_dir($this->path("mw_dir")."plugins/".$plugin_name)){
43           if(($plugin = $this->load_plugin($plugin_name)) === false){
44             $OK = false;
45           }
46         }
47       }
48       closedir($dh);
49       if(!$OK){
50         return false;
51       }
52       if(($plugins = $this->plugins()) === false){
53         return false;
54       }
55       if(file_exists($this->plugins_data_dir()) && is_dir($this->plugins_data_dir())){
56         if(!($dh = opendir($this->plugins_data_dir()))){
57           return false;
58         }
59         while(($plugin_name = readdir($dh)) !== false){
60           if(substr($plugin_name, 0 ,1) != "." && !is_dir($this->plugin_data_file($plugin_name))){
61             if(!isset($plugins[$plugin_name])) $this->del_plugin_data($plugin_name);
62           }
63         }
64         closedir($dh);
65       }
66       return true;
67     }
68
69     public function load_plugin($plugin_name){
70       if(substr($plugin_name, 0 ,1) == "." || !is_dir($this->path("mw_dir")."plugins/".$plugin_name)){
71         return false;
72       }
73       if(($plugin = $this->plugin_data($plugin_name)) === false){
74         return false;
75       }
76       if(($plugin["impl"] = $this->plugin_impl($plugin_name)) === false){
77         return false;
78       }
79       $MAJ = false;
80       if(!isset($plugin["installed"]) || !isset($plugin["enabled"])){
81         $plugin["installed"] = false;
82         $plugin["enabled"] = false;
83         $plugin["priorite"] = 0;
84         $MAJ = true;
85       }
86       if(!$plugin["installed"] && $plugin["enabled"]){
87         $plugin["enabled"] = false;
88         $MAJ = true;
89       }
90       if($MAJ){
91         if(!$this->set_plugin_data($plugin_name, $plugin)){
92           return false;
93         }
94       }
95       $plugin["title"] =  ($plugin_title = $this->plugin_call($plugin["impl"], "title")) ? $plugin_title : "";
96       $plugin["description"] = ($plugin_description = $this->plugin_call($plugin["impl"], "description")) ? $plugin_description : "";
97       $plugin["name"] = $plugin_name;
98       if(!isset($this->plugins_asc)) $this->plugins_asc = array();
99       $this->plugins_asc[$plugin_name] = $plugin;
100       $this->plugins_asc = $this->ordonne_plugins($this->plugins_asc, "ASC");
101       $this->plugins_desc = $this->ordonne_plugins($this->plugins_asc, "DESC");
102       return $plugin;
103     }
104
105     public function plugins_loaded(){
106       if(($plugins = $this->plugins()) === false){
107         return;
108       }
109       foreach($plugins as $plugin_name => $plugin){
110         $plugin["impl"]->loaded($this);
111       }
112     }
113
114     public function init_plugins(){
115       if($this->bdd_ready() !== true) return;
116       if(($plugins = $this->plugins("DESC")) === false){
117         $this->erreur("erreur lors de l'initialisation des plugins", true);
118       }
119       foreach($plugins as $plugin_name => $plugin){
120         if($plugin["installed"] && $plugin["enabled"]){
121           if(!$plugin["impl"]->init($this)){
122             $this->erreur("erreur lors de l'initialisation du plugin ".$plugin_name, true);
123           }
124         }
125       }
126     }
127
128     public function ordonne_plugins($plugins, $PRIORITE = "ASC"){
129       $values = array_values($plugins);
130       $maximum = count($values);
131       while($maximum > 0){
132         $maximumTemporaire = 0;
133         for($i = 0; $i < $maximum - 1; $i++){
134           if(
135                ($PRIORITE == "ASC" && $values[$i]["priorite"] > $values[$i + 1]["priorite"])
136             || ($PRIORITE == "DESC" && $values[$i]["priorite"] < $values[$i + 1]["priorite"])
137           ){
138             $tmp = $values[$i];
139             $values[$i] = $values[$i + 1];
140             $values[$i + 1] = $tmp;
141             $maximumTemporaire = $i + 1;
142           }
143         }
144         $maximum = $maximumTemporaire;
145       }
146       $res = array();
147       foreach($values as $value) if($value["name"]) $res[$value["name"]] = $value;
148       return $res;
149     }
150
151     public function plugin_call($impl, $method){
152       if(method_exists($impl, $method)) return $impl->$method($this);
153     }
154
155     # ---------------------------------------------------------------------------------
156     #                                                                              impl
157     #
158
159     public function plugin_impl($plugin_name){
160       $plugin = false;
161       if(file_exists($this->path("mw_dir")."plugins")){
162         if(substr($plugin_name, 0 ,1) !== "." && is_dir($this->path("mw_dir")."plugins/".$plugin_name)){
163           if(file_exists($this->path("mw_dir")."plugins/".$plugin_name."/".$plugin_name.".php")){
164             if(!class_exists($plugin_name)){
165               require_once $this->path("mw_dir")."plugins/".$plugin_name."/".$plugin_name.".php";
166             }
167             if(class_exists($plugin_name)){
168               $plugin = new $plugin_name();
169             }
170           }
171         }
172       }
173       return $plugin;
174     }
175
176     # ---------------------------------------------------------------------------------
177     #                                                                              data
178     #
179
180     public function plugins_data_dir(){
181       return $this->path("content")."data/plugins/";
182     }
183
184     public function plugin_data_file($plugin_name){
185       return $this->plugins_data_dir().$plugin_name;
186     }
187
188     public function plugin_data($plugin_name){
189       $data_file = $this->plugin_data_file($plugin_name);
190       $data = array();
191       if(file_exists($data_file)){
192         if($content = file_get_contents($data_file)){
193           $data = unserialize($content);
194         }
195       }
196       return $data;
197     }
198
199     public function set_plugin_data($plugin_name, $data){
200       if(!is_dir($this->plugins_data_dir())) @mkdir($this->plugins_data_dir());
201       if(!is_dir($this->plugins_data_dir())) return false;
202       $data_file = $this->plugin_data_file($plugin_name);
203       $content = serialize($data);
204       $OK = false;
205       if($fh = fopen($data_file, "w")){
206         if(fwrite($fh, $content) !== false){
207           $OK = true;
208         }
209         fclose($fh);
210       }
211       return $OK;
212     }
213
214     public function del_plugin_data($plugin_name){
215       $data_file = $this->plugin_data_file($plugin_name);
216       if(file_exists($data_file)) return @unlink($data_file);
217       return true;
218     }
219
220   }
221
222   // -------------------------------------------------------------------------------------------
223   //                                                                             class mw_plugin
224   //
225
226   abstract class mw_plugin{
227
228     public function title(){
229       return "(sans titre)";
230     }
231
232     public function description(){
233       return "";
234     }
235
236     public function loaded($env){
237     }
238
239     public function install($env){
240       return true;
241     }
242
243     public function uninstall($env){
244       return true;
245     }
246
247     public function enable($env){
248       return true;
249     }
250
251     public function disable($env){
252       return true;
253     }
254
255     public function init($env){
256       return true;
257     }
258
259   }