source: branches/Modular/Common/Module.php@ 403

Last change on this file since 403 was 403, checked in by chronos, 13 years ago
  • Upraveno: Instalace a odinstalace základních modulů v opačném pořadí.
File size: 9.0 KB
Line 
1<?php
2
3include_once(dirname(__FILE__).'/Model.php');
4
5class Module
6{
7 var $Id;
8 var $Name;
9 var $Version;
10 var $License;
11 var $Creator;
12 var $Description;
13 var $Dependencies;
14 var $Models = array();
15 var $SupportedModels = array();
16 var $Database;
17 var $Installed;
18 var $Initialized;
19 var $System;
20
21 function __construct($Database, $System)
22 {
23 $this->Database = &$Database;
24 $this->System = &$System;
25 $this->Initialized = false;
26 $this->Installed = false;
27 }
28
29 function Install()
30 {
31 if($this->Installed) return;
32 DebugLog('Installing module '.$this->Name.'...');
33 $this->Installed = true;
34 foreach($this->Dependencies as $Dependency)
35 $this->System->Modules[$Dependency]->Install();
36 $this->LoadModels();
37 foreach($this->Models as $Index => $Module)
38 {
39 $this->Models[$Index]->Install();
40 }
41 $this->Database->query('UPDATE SystemModule SET Installed=1 WHERE Name="'.$this->Name.'"');
42 }
43
44 function UnInstall()
45 {
46 DebugLog('Uninstalling module '.$this->Name.'...');
47 $this->LoadModels();
48 foreach(array_reverse($this->Models, true) as $Index => $Model)
49 {
50 $this->Models[$Index]->UnInstall();
51 }
52 $this->Database->query('UPDATE SystemModule SET Installed=0 WHERE Name="'.$this->Name.'"');
53 $this->Installed = false;
54 }
55
56 function Init()
57 {
58 if($this->Initialized) return;
59 $this->Initialized = true;
60 foreach($this->Dependencies as $Dependency)
61 $this->System->Modules[$Dependency]->Init();
62 }
63
64 function LoadModels()
65 {
66 $this->Models = array();
67 foreach($this->SupportedModels as $ModelName)
68 {
69 $NewModel = new $ModelName($this->Database, $this->System);
70 $NewModel->Module = &$this;
71 $this->Models[$ModelName] = $NewModel;
72 }
73 }
74}
75
76class ModularSystem
77{
78 var $Database;
79 var $Modules = array();
80 var $Models = array();
81 var $Menu = array();
82
83 function __construct($Database)
84 {
85 $this->Database = &$Database;
86 }
87
88 function ModulePresent($Name)
89 {
90 return(array_key_exists($Name, $this->Modules));
91 }
92
93 function LoadModules($Installed = true)
94 {
95 //DebugLog('Loading modules...');
96 $this->Modules = array();
97 $Query = 'SELECT `Id`, `Name`,`Installed` FROM `SystemModule`';
98 if($Installed) $Query .= ' WHERE `Installed`=1';
99 else $Query .= ''; // WHERE `Installed`=0';
100 $DbResult = $this->Database->query($Query);
101 while($Module = $DbResult->fetch_array())
102 {
103 //echo($Module['Name'].',');
104 include_once('Modules/'.$Module['Name'].'/'.$Module['Name'].'.php');
105 $ModuleClassName = 'Module'.$Module['Name'];
106 $NewModule = new $ModuleClassName($this->Database, $this);
107 $NewModule->Id = $Module['Id'];
108 $NewModule->Installed = $Module['Installed'];
109 $this->Modules[$Module['Name']] = $NewModule;
110 }
111 }
112
113 function Init()
114 {
115 $this->LoadModules();
116 foreach($this->Modules as $Index => $Module)
117 $this->Modules[$Index]->Init();
118 }
119
120 function Install()
121 {
122 //DebugLog('Installing modular system core...');
123 $this->Database->query('CREATE TABLE IF NOT EXISTS `SystemVersion` (
124 `Id` int(11) NOT NULL AUTO_INCREMENT,
125 `Version` varchar(255) COLLATE utf8_czech_ci NOT NULL,
126 `Description` datetime NOT NULL,
127 PRIMARY KEY (`Id`)
128) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1;');
129 $this->Database->query('CREATE TABLE IF NOT EXISTS `SystemModule` (
130 `Id` int(11) NOT NULL AUTO_INCREMENT,
131 `Name` varchar(255) COLLATE utf8_czech_ci NOT NULL,
132 `Creator` varchar(255) COLLATE utf8_czech_ci NOT NULL,
133 `Version` varchar(255) COLLATE utf8_czech_ci NOT NULL,
134 `License` varchar(255) COLLATE utf8_czech_ci NOT NULL,
135 `Installed` int(11) NOT NULL,
136 `Description` text COLLATE utf8_czech_ci NOT NULL,
137 PRIMARY KEY (`Id`)
138) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1;');
139
140 $this->Database->query('CREATE TABLE IF NOT EXISTS `SystemModuleDependency` (
141 `Id` int(11) NOT NULL AUTO_INCREMENT,
142 `Module` int(11) NOT NULL,
143 `DependencyModule` int(11) NOT NULL,
144 PRIMARY KEY (`Id`),
145 KEY (`Module`),
146 KEY (`DependencyModule`),
147 UNIQUE (`Module` , `DependencyModule`)
148) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1;');
149 $this->Database->query('ALTER TABLE `SystemModuleDependency` ADD CONSTRAINT `SystemModuleDependency_ibfk_1` FOREIGN KEY ( `Module` ) REFERENCES `SystemModule` (`Id`)');
150 $this->Database->query('ALTER TABLE `SystemModuleDependency` ADD CONSTRAINT `SystemModuleDependency_ibfk_2` FOREIGN KEY ( `DependencyModule` ) REFERENCES `SystemModule` (`Id`)');
151
152 $this->Database->query('CREATE TABLE IF NOT EXISTS `SystemModel` (
153 `Id` int(11) NOT NULL AUTO_INCREMENT,
154 `Name` varchar(255) COLLATE utf8_czech_ci NOT NULL,
155 `Module` int(11) NOT NULL,
156 KEY (`Module`),
157 PRIMARY KEY (`Id`)
158) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1;');
159 $this->Database->query('ALTER TABLE `SystemModel` ADD CONSTRAINT `SystemModel_ibfk_1` FOREIGN KEY ( `Module` ) REFERENCES `SystemModule` (`Id`)');
160
161 $this->Database->query('CREATE TABLE IF NOT EXISTS `SystemModelProperty` (
162 `Id` int(11) NOT NULL AUTO_INCREMENT,
163 `Name` varchar(255) COLLATE utf8_czech_ci NOT NULL,
164 `Type` varchar(255) COLLATE utf8_czech_ci NOT NULL,
165 `Model` int(11) NOT NULL,
166 KEY (`Model`),
167 PRIMARY KEY (`Id`)
168) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1;');
169 $this->Database->query('ALTER TABLE `SystemModelProperty` ADD CONSTRAINT `SystemModelProperty_ibfk_1` FOREIGN KEY ( `Model` ) REFERENCES `SystemModel` (`Id`)');
170
171 $this->ReloadList();
172 $this->LoadModules(false);
173 //$this->Modules['System']->Install();
174 foreach($this->Modules as $Index => $Module)
175 {
176 $this->Modules[$Index]->Install();
177 }
178 }
179
180 function UnInstall()
181 {
182 DebugLog('Uninstalling modular system core...');
183 foreach(array_reverse($this->Modules, true) as $Index => $Module)
184 $this->Modules[$Index]->UnInstall();
185
186 // Delete tables with reverse order
187 $this->Database->query('ALTER TABLE `SystemModelProperty` DROP FOREIGN KEY `SystemModelProperty_ibfk_1`');
188 $this->Database->query('DROP TABLE IF EXISTS `SystemModelProperty`');
189 $this->Database->query('ALTER TABLE `SystemModel` DROP FOREIGN KEY `SystemModel_ibfk_1`');
190 $this->Database->query('DROP TABLE IF EXISTS `SystemModel`');
191 $this->Database->query('ALTER TABLE `SystemModuleDependency` DROP FOREIGN KEY `SystemModuleDependency_ibfk_1`');
192 $this->Database->query('ALTER TABLE `SystemModuleDependency` DROP FOREIGN KEY `SystemModuleDependency_ibfk_2`');
193 $this->Database->query('DROP TABLE IF EXISTS `SystemModuleDependency`');
194 $this->Database->query('DROP TABLE IF EXISTS `SystemModule`');
195 $this->Database->query('DROP TABLE IF EXISTS `SystemVersion`');
196 }
197
198 function IsInstalled()
199 {
200 $DbResult = $this->Database->query('SELECT table_name FROM information_schema.tables
201WHERE table_schema = "'.$this->Database->Database.'" AND table_name = "SystemVersion";');
202 if($DbResult->num_rows > 0) return(true);
203 else return(false);
204 }
205
206 function ReloadList()
207 {
208 // Load list of modules from database
209 $Modules = array();
210 $DbResult = $this->Database->query('SELECT * FROM `SystemModule`');
211 while($DbRow = $DbResult->fetch_assoc())
212 $Modules[$DbRow['Name']] = $DbRow;
213
214 // Load list of modules on disk
215 $ModulesOnDisk = array();
216 $Files = scandir('Modules');
217 foreach($Files as $File)
218 if(is_dir('Modules/'.$File) and ($File != '.') and ($File != '..') and (substr($File, 0, 1) != '.'))
219 {
220 $ModulesOnDisk[] = $File;
221 }
222
223 // Add new
224 foreach($ModulesOnDisk as $ModuleName)
225 if(!array_key_exists($ModuleName, $Modules))
226 {
227 DebugLog('Adding module '.$ModuleName.' to list');
228 include_once('Modules/'.$ModuleName.'/'.$ModuleName.'.php');
229 $ModuleClassName = 'Module'.$ModuleName;
230 if(class_exists($ModuleClassName))
231 {
232 $Module = new $ModuleClassName($this->Database, $this);
233 $this->Database->insert('SystemModule', array('Name' => $Module->Name,
234 'Version' => $Module->Version, 'Creator' => $Module->Creator,
235 'Description' => $Module->Description, 'License' => $Module->License,
236 'Installed' => 0));
237 unset($Module);
238 } else throw new Exception('Missing class '.$ModuleClassName.' in module '.$ModuleName);
239 }
240
241 // Remove missing
242 foreach($Modules as $Module)
243 if(($Module['Installed'] == 0) and !in_array($Module['Name'], $ModulesOnDisk))
244 {
245 DebugLog('Removing module '.$Module['Name'].' from list');
246 $this->Database->query('DELETE FROM `SystemModule` WHERE `Id` = '.$Module['Id']);
247 }
248
249 // Reload dependencies
250 $this->LoadModules(false);
251 foreach($this->Modules as $Module)
252 {
253 foreach($Module->Dependencies as $Dependency)
254 {
255 $this->Database->insert('SystemModuleDependency', array('Module' => $Module->Id,
256 'DependencyModule' => $this->Modules[$Dependency]->Id));
257 }
258 }
259 }
260}
261
262?>
Note: See TracBrowser for help on using the repository browser.