developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Ticket #31: jInstallerModulesMgr.class.php

File jInstallerModulesMgr.class.php, 9.0 KB (added by foxmask, 12 years ago)

class to be able to install / unistall / activate / deactivate modules

Line 
1<?php
2/**
3* @package     jelix
4* @subpackage  installer
5* @author               foxmask
6* @contributor
7* @copyright   2008 foxmask
8* @link        http://www.jelix.org
9* @licence     GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
10*/
11
12/*
13 * This class will manage the installation of the Jelix Modules
14 *
15 * thus :
16 * 1) it reads the module.xml file to get info about the each module
17 * 2) it put _install/_distable/_installed_version files to know the status of the module
18 *
19 */
20
21class jInstallerModulesMgr extends jInstallerModule { 
22
23        private $modules  = array();
24        private $disabled = array();
25        private $activated = array();
26        private $installed = array();
27       
28        private $id;
29        private $mroot;
30        private $idModule;
31       
32        /*
33          * set the idModule if needed
34          *
35        */
36        public function __construct($idModule='') {
37                if ($idModule!='')
38                        $this->idModule = $idModule;
39               
40        }
41       
42        /**
43        Loads modules.
44        */
45    function loadModules() {
46       
47        #getting the 'classpath' of all the existing modules on the filesystem
48                global $gJConfig;
49       
50                $module_list = split(' *, *',$gJConfig->modulesPath);
51       
52        $module_list = $gJConfig->_modulesPathList;
53       
54        foreach($module_list as $k=>$path){
55           
56            #we want all the modules in modulesPath except the core and jelix one.
57            if (preg_match('#/([A-Za-z0-9_-]+)/$#',$path,$m) and ! preg_match('#[core||jelix]-modules#',$path)) {
58                $module_name = $m[1];
59                if (file_exists($path.'/module.xml'))
60                {
61                                        $this->id = $module_name;
62                                        $this->mroot = $path;
63                                       
64                                        $this->modules[$this->id] = simplexml_load_file($path.'/module.xml');
65                    $this->modules[$this->id]['root_writable'] = is_writable($path);
66                                        $this->modules[$this->id]['root'] = $this->mroot;
67                                       
68                                        $this->id = null;
69                                        $this->mroot = null;
70                }
71            }
72           
73        }
74                return $this->modules;
75    }
76   
77        /**
78        This method installs module with ID <var>$idModule</var> and having a _install
79        file. This file should throw exception on failure or true if it installs
80        successfully.
81       
82        <var>$msg</var> is an out parameter that handle installer message.
83       
84        @return <b>mixed</b>
85        */
86        public function install() {
87                try {
88                        $i = $this->loadModuleFile($this->modules[$this->idModule]['root'].'/install/_install.php');
89                        #create the _installed_version file and put the version from the module.xml file inside
90                        if ($i === true) {
91                                if (!jFile::write($this->modules[$this->idModule]['root'].'/_installed_version',$this->modules[$this->idModule]['version'])) {
92                                        throw new Exception(jLocale::get('moduleinstaller.cannot.installed.module'));                   
93                                }
94                                #create the file _installed to say "i'm installed"
95                                if (!jFile::write($this->modules[$this->idModule]['root'].'/_installed','')) {
96                                        throw new Exception(jLocale::get('moduleinstaller.cannot.installed.module'));                   
97                                }                       
98                               
99                                return true;
100                        }   
101                       
102                } catch (Exception $e) {
103                        return $e->getMessage();
104                }
105               
106                return null;
107        }   
108
109   
110        /**
111        This method uninstalls module with ID <var>$idModule</var> and having a _uninstall
112        file. This file should throw exception on failure or true if it installs
113        successfully.
114       
115        @return <b>mixed</b>
116        */
117        public function uninstall() {
118                try {
119            $i = $this->loadModuleFile($this->modules[$this->idModule]['root'].'/install/_uninstall.php');
120                        if ($i === true) {
121                                #drop the file _installed to say "i'm uninstalled"
122                                if (@unlink($this->modules[$this->idModule]['root'].'/_installed') === false) {
123                                        throw new Exception(jLocale::get('moduleinstaller.cannot.uninstalled.module'));
124                                }                               
125                                return true;
126                        }           
127                       
128                } catch (Exception $e) {
129                        return $e->getMessage();
130                }
131               
132                return null;
133        }
134       
135        /**
136        This method uninstalls module with ID <var>$idModule</var> and having a _uninstall
137        file. This file should throw exception on failure or true if it installs
138        successfully.
139       
140        <var>$msg</var> is an out parameter that handle installer message.
141       
142        @return <b>mixed</b>
143        */
144        public function deleteModule() {
145                try {
146            jFile::removeDir($this->modules[$this->idModule]['root'],true);
147                       
148                } catch (Exception $e) {
149                        return $e->getMessage();
150                }
151               
152                return null;
153        }
154       
155    #
156    #statements of the modules
157        #
158       
159    /*
160     * Find all the Activated modules by checking
161     * that no _disabled file exists in the directory of all the modules
162     */   
163    function getActivatedModules() {
164
165                foreach ($this->modules as $id => &$m)
166        {
167            if (!file_exists($this->modules[$id]['root'].'/_disabled'))           
168                $this->activated[$id] = $this->modules[$id];
169                }
170               
171        return $this->activated;       
172    }
173       
174    /*
175     * Find all the Deactivated modules by
176     * searching the _disabled file if the directory of all the modules
177     */
178    function getDeactivatedModules() {
179       
180                foreach ($this->modules as $id => &$m)
181        {
182            if (file_exists($this->modules[$id]['root'].'/_disabled'))           
183                $this->disabled[$id] = $this->modules[$id];
184                }
185               
186        return $this->disabled;
187    }
188       
189    /*
190     * Find all the Installed modules by
191     * searching the _installed file if the directory of all the modules
192     */   
193    function getInstalledModules() {
194       
195                foreach ($this->modules as $id => &$m)
196       
197            if (file_exists($this->modules[$id]['root'].'/_installed'))           
198                $this->installed[$id] = $this->modules[$id];
199               
200        return $this->installed;
201       
202    }
203
204    /*
205     * Activate a module by giving the <b>$id</b>
206     */ 
207    function activateModule() {
208               
209                if (!isset($this->modules[$this->idModule])) {
210                        throw new Exception(jLocale::get('moduleinstaller.no.such.module'));
211                }
212               
213                if (!$this->modules[$this->idModule]['root_writable']) {
214                        throw new Exception(jLocale::get('moduleinstaller.cannot.activate.module'));
215                }
216       
217                if (@unlink($this->modules[$this->idModule]['root'].'/_disabled') === false) {
218                        throw new Exception(jLocale::get('moduleinstaller.cannot.activate.module'));
219                }
220    }
221   
222    /*
223     * Deactivate a module by using the the <b>$id</b> given in the __construct
224     */     
225    function deactivateModule() {
226               
227                #if (!isset($this->modules[$this->idModule])) {
228                if (!isset($this->modules[$this->idModule])) {
229                        throw new Exception(jLocale::get('moduleinstaller.no.such.module'));
230                }
231               
232                if (!$this->modules[$this->idModule]['root_writable']) {
233                        throw new Exception(jLocale::get('moduleinstaller.cannot.deactivate.module'));         
234                }
235
236                if (!jFile::write($this->modules[$this->idModule]['root'].'/_disabled','')) {
237                        throw new Exception(jLocale::get('moduleinstaller.cannot.deactivate.module'));                 
238                }
239               
240                return true;
241    }
242
243        /**
244        Returns true if the module with ID <var>$id</var> exists.
245       
246        @return <b>boolean</b>
247        */
248        public function moduleExists() {
249                return isset($this->modules[$this->idModule]);
250        }
251   
252        /**
253        Returns all modules associative array or only one module if <var>$id</var>
254        is present.
255       
256        @param  id              <b>string</b>           Optionnal module ID
257        @return <b>array</b>
258        */
259        public function getModules($id=null) {
260                if ($id && isset($this->modules[$id])) {
261                        return $this->modules[$id];
262                }
263                return $this->modules;
264        }
265   
266   
267        private function loadModuleFile($________) {
268                if (!file_exists($________)) {
269                        return;
270                }
271               
272                return require $________;
273        }
274       
275        /**
276        Returns a module information by a Xpath query
277       
278        @param  id              <b>string</b>           Module ID
279        @param  info            <b>string</b>           Information to retrieve by the Xpath query
280        @return <b>string</b>
281        */
282        public function moduleInfo($id,$info) {
283                $xmlStr = file_get_contents($this->modules[$id]['root'].'/module.xml');
284                $xmlStr = str_replace("xmlns=","a=",$xmlStr);
285                $xml    = simplexml_load_string($xmlStr);               
286
287                $result = $xml->xpath($info);
288
289                return isset($result[0]) ? $result[0] : null;
290        }
291
292        /*
293         * get the version from the <b>$id</b> module
294         * @param       id              <b>string</b>           Module ID
295         * @return <b>string</b>
296         **/
297        public function getVersion($id) {               
298                return (file_exists($this->modules[$id]['root'].'/_installed_version')) ? jFile::read($this->modules[$id]['root'].'/_installed') : 0;
299        }
300               
301        /*
302         * write the version in the _installed_version file
303         * @param       id              <b>string</b>           Module ID
304         **/   
305        public function setVersion($id,$version) {
306               
307                if (!jFile::write($this->modules[$id]['root'].'/_installed_version',$version)) {
308                        throw new Exception(jLocale::get('moduleinstaller.cannot.installed.module'));                   
309                }
310               
311        }
312       
313        /*
314         * remove the version in the _installed_version file
315         * @param       id              <b>string</b>           Module ID
316         **/   
317        public function delVersion($id) {
318                if (@unlink($this->modules[$id]['root'].'/_installed_version') === false) {
319                        throw new Exception(jLocale::get('moduleinstaller.cannot.delete.module'));
320                }               
321        }
322
323}