1df183466dc47d463cacbfd5ec5d991d24921136
[mtweb] / mw / env / modules / mw_env_plugins.php
1 <?php
2
3   class mw_env_plugins extends mw_env{
4
5     var $plugins_asc;
6     var $plugins_desc;
7
8     function plugins($PRIORITE = "ASC"){
9       $this->init_plugins($PRIORITE);
10       if($PRIORITE == "ASC") return $this->plugins_asc;
11       if($PRIORITE == "DESC") return $this->plugins_desc;
12       return false;
13     }
14
15     # ---------------------------------------------------------------------------------
16     #                                                                              init
17     #
18
19     function init_plugins($PRIORITE = "ASC"){
20       if(isset($this->plugins_asc) || isset($this->plugins_desc)){
21         if($PRIORITE == "ASC"){
22           if(!isset($this->plugins_asc)) $this->plugins_asc = $this->ordonne_plugins($this->plugins_desc, $PRIORITE);
23         }
24         elseif($PRIORITE == "DESC"){
25           if(!isset($this->plugins_desc)) $this->plugins_desc = $this->ordonne_plugins($this->plugins_asc, $PRIORITE);
26         }
27         return;
28       }
29       $plugins = array();
30       if(!class_exists("mw_plugin")){
31         require $this->path("mw_dir")."plugins/mw_plugin.php";
32         if(!class_exists("mw_plugin")){
33           $plugins = false;
34           return;
35         }
36       }
37       if($dh = opendir($this->path("mw_dir")."plugins/")){
38         $OK = true;
39         while($OK && ($plugin_name = readdir($dh)) !== false){
40           if(substr($plugin_name, 0 ,1) !== "." && is_dir($this->path("mw_dir")."plugins/".$plugin_name)){
41             if(!isset($plugins[$plugin_name])){
42               if(($plugin = $this->plugin_data($plugin_name)) !== false){
43                 $MAJ = false;
44                 if(!isset($plugin["installed"]) || !isset($plugin["enabled"])){
45                   $plugin["installed"] = false;
46                   $plugin["enabled"] = false;
47                   $plugin["priorite"] = 0;
48                   $MAJ = true;
49                 }
50                 if(!$plugin["installed"] && $plugin["enabled"]){
51                   $plugin["enabled"] = false;
52                   $MAJ = true;
53                 }
54                 if($MAJ) $OK = $this->set_plugin_data($plugin_name, $plugin);
55                 if($OK){
56                   if(($plugin["impl"] = $this->plugin_impl($plugin_name)) !== false){
57                     $plugin["title"] =  ($plugin_title = $this->plugin_call($plugin["impl"], "title")) ? $plugin_title : "";
58                     $plugin["description"] = ($plugin_description = $this->plugin_call($plugin["impl"], "description")) ? $plugin_description : "";
59                     $plugin["name"] = $plugin_name;
60                     $plugins[$plugin_name] = $plugin;
61                   }
62                 }
63               }
64               else $OK = false;
65             }
66           }
67           if(!$OK) $plugins = false;
68         }
69         closedir($dh);
70         if($plugins !== false){
71           if(file_exists($this->plugins_data_dir()) && is_dir($this->plugins_data_dir())){
72             if($dh = opendir($this->plugins_data_dir())){
73               $plugins_data_files = array();
74               $OK = true;
75               while($OK && ($plugin_name = readdir($dh)) !== false){
76                 if(substr($plugin_name, 0 ,1) != "." && !is_dir($this->plugin_data_file($plugin_name))){
77                   if(!isset($plugins[$plugin_name])) $this->del_plugin_data($plugin_name);
78                 }
79                 if(!$OK) $plugins = false;
80               }
81               closedir($dh);
82             }
83           }
84         }
85       }
86       else $plugins = false;
87       if($plugins !== false){
88         if($PRIORITE == "ASC") $this->plugins_asc = $this->ordonne_plugins($plugins, $PRIORITE);
89         elseif($PRIORITE == "DESC") $this->plugins_desc = $this->ordonne_plugins($plugins, $PRIORITE);
90       }
91       else{
92         $this->plugins_asc = false;
93         $this->plugins_desc = false;
94       }
95     }
96
97     function ordonne_plugins($plugins, $PRIORITE = "ASC"){
98       $values = array_values($plugins);
99       $maximum = count($values);
100       while($maximum > 0){
101         $maximumTemporaire = 0;
102         for($i = 0; $i < $maximum - 1; $i++){
103           if(
104                ($PRIORITE == "ASC" && $values[$i]["priorite"] > $values[$i + 1]["priorite"])
105             || ($PRIORITE == "DESC" && $values[$i]["priorite"] < $values[$i + 1]["priorite"])
106           ){
107             $tmp = $values[$i];
108             $values[$i] = $values[$i + 1];
109             $values[$i + 1] = $tmp;
110             $maximumTemporaire = $i + 1;
111           }
112         }
113         $maximum = $maximumTemporaire;
114       }
115       $res = array();
116       foreach($values as $value) if($value["name"]) $res[$value["name"]] = $value;
117       return $res;
118     }
119
120     function plugin_call($impl, $method){
121       if(method_exists($impl, $method)) return $impl->$method($this);
122     }
123
124     # ---------------------------------------------------------------------------------
125     #                                                                              impl
126     #
127
128     function plugin_impl($plugin_name){
129       $plugin = false;
130       if(file_exists($this->path("mw_dir")."plugins")){
131         if(substr($plugin_name, 0 ,1) !== "." && is_dir($this->path("mw_dir")."plugins/".$plugin_name)){
132           if(file_exists($this->path("mw_dir")."plugins/".$plugin_name."/".$plugin_name.".php")){
133             require $this->path("mw_dir")."plugins/".$plugin_name."/".$plugin_name.".php";
134             if(class_exists($plugin_name)){
135               $plugin = new $plugin_name();
136             }
137           }
138         }
139       }
140       return $plugin;
141     }
142
143     # ---------------------------------------------------------------------------------
144     #                                                                              data
145     #
146
147     function plugins_data_dir(){
148       return $this->path("content")."data/plugins/";
149     }
150
151     function plugin_data_file($plugin_name){
152       return $this->plugins_data_dir().$plugin_name;
153     }
154
155     function plugin_data($plugin_name){
156       $data_file = $this->plugin_data_file($plugin_name);
157       $data = array();
158       if(file_exists($data_file)){
159         if($content = file_get_contents($data_file)){
160           $data = unserialize($content);
161         }
162       }
163       return $data;
164     }
165
166     function set_plugin_data($plugin_name, $data){
167       $data_file = $this->plugin_data_file($plugin_name);
168       $content = serialize($data);
169       $OK = false;
170       if($fh = fopen($data_file, "w")){
171         if(fwrite($fh, $content) !== false){
172           $OK = true;
173         }
174         fclose($fh);
175       }
176       return $OK;
177     }
178
179     function del_plugin_data($plugin_name){
180       $data_file = $this->plugin_data_file($plugin_name);
181       if(file_exists($data_file)) return @unlink($data_file);
182       return true;
183     }
184
185   }
186
187 ?>