source: trunk/Common/Module.php@ 374

Last change on this file since 374 was 374, checked in by chronos, 13 years ago
  • Opraveno: Při inicializaci modulů se musí nejdříve zinicializovat moduly uvedené v závislostech.
File size: 5.8 KB
Line 
1<?php
2
3include_once(dirname(__FILE__).'/Model.php');
4
5class Module
6{
7 var $Name;
8 var $Version;
9 var $License;
10 var $Creator;
11 var $Description;
12 var $Dependencies;
13 var $Models = array();
14 var $Database;
15 var $Installed;
16 var $Initialized;
17 var $System;
18
19 function __construct($Database, $System)
20 {
21 $this->Database = &$Database;
22 $this->System = &$System;
23 $this->Initialized = false;
24 $this->Installed = false;
25 }
26
27 function Install()
28 {
29 DebugLog('Installing module '.$this->Name.'...');
30 foreach($this->Models as $ModelName)
31 {
32 $Model = new $ModelName($this->Database, $this->System);
33 $Model->Module = &$this;
34 $Model->Install();
35 unset($Model);
36 }
37 $this->Database->query('UPDATE SystemModule SET Installed=1 WHERE Name="'.$this->Name.'"');
38 }
39
40 function UnInstall()
41 {
42 DebugLog('Uninstalling module '.$this->Name.'...');
43 foreach($this->Models as $ModelName)
44 {
45 $Model = new $ModelName($this->Database, $this->System);
46 $Model->UnInstall();
47 unset($Model);
48 }
49 $this->Database->query('UPDATE SystemModule SET Installed=0 WHERE Name="'.$this->Name.'"');
50 }
51
52 function Init()
53 {
54 $this->Initialized = true;
55 foreach($this->Dependencies as $Dependency)
56 if(!$this->System->Modules[$Dependency]->Initialized)
57 $this->System->Modules[$Dependency]->Init();
58 }
59}
60
61class ModularSystem
62{
63 var $Database;
64 var $Modules = array();
65 var $Models = array();
66
67 function __construct($Database)
68 {
69 $this->Database = &$Database;
70 }
71
72 function ModulePresent($Name)
73 {
74 return(array_key_exists($Name, $this->Modules));
75 }
76
77 function Init($Installed = true)
78 {
79 $Query = 'SELECT `Id`, `Name` FROM `SystemModule`';
80 if($Installed) $Query .= ' WHERE `Installed`=1';
81 else $Query .= ' WHERE `Installed`=0';
82 $DbResult = $this->Database->query($Query);
83 while($Module = $DbResult->fetch_array())
84 {
85 include_once('Modules/'.$Module['Name'].'/'.$Module['Name'].'.php');
86 $ModuleClassName = 'Module'.$Module['Name'];
87 $this->Modules[$Module['Name']] = new $ModuleClassName($this->Database, $this);
88 $this->Modules[$Module['Name']]->Id = $Module['Id'];
89 }
90 foreach($this->Modules as $Index => $Module)
91 $this->Modules[$Index]->Init();
92 }
93
94 function Install()
95 {
96 //DebugLog('Installing modular system core...');
97 $this->Database->query('CREATE TABLE IF NOT EXISTS `SystemModule` (
98 `Id` int(11) NOT NULL AUTO_INCREMENT,
99 `Name` varchar(255) COLLATE utf8_czech_ci NOT NULL,
100 `Creator` varchar(255) COLLATE utf8_czech_ci NOT NULL,
101 `Version` varchar(255) COLLATE utf8_czech_ci NOT NULL,
102 `License` varchar(255) COLLATE utf8_czech_ci NOT NULL,
103 `Installed` int(11) NOT NULL,
104 `Description` text COLLATE utf8_czech_ci NOT NULL,
105 `Dependecies` varchar(255) COLLATE utf8_czech_ci NOT NULL,
106 PRIMARY KEY (`Id`)
107) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1;');
108 $this->Database->query('CREATE TABLE IF NOT EXISTS `SystemModel` (
109 `Id` int(11) NOT NULL AUTO_INCREMENT,
110 `Name` varchar(255) COLLATE utf8_czech_ci NOT NULL,
111 `Module` int(11) NOT NULL,
112 KEY (`Module`),
113 PRIMARY KEY (`Id`)
114) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1;');
115 $this->Database->query('CREATE TABLE IF NOT EXISTS `SystemModelProperty` (
116 `Id` int(11) NOT NULL AUTO_INCREMENT,
117 `Name` varchar(255) COLLATE utf8_czech_ci NOT NULL,
118 `Type` varchar(255) COLLATE utf8_czech_ci NOT NULL,
119 `Model` int(11) NOT NULL,
120 KEY (`Model`),
121 PRIMARY KEY (`Id`)
122) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1;');
123 $this->ReloadList();
124 $this->Init(false);
125 foreach($this->Modules as $Index => $Module)
126 {
127 $this->Modules[$Index]->Install();
128 }
129 }
130
131 function UnInstall()
132 {
133 DebugLog('Uninstalling modular system core...');
134 foreach($this->Modules as $Index => $Module)
135 $this->Modules[$Index]->UnInstall();
136
137 // Delete tables with reverse order
138 $this->Database->query('DROP TABLE IF EXISTS `SystemModelProperty`');
139 $this->Database->query('DROP TABLE IF EXISTS `SystemModel`');
140 $this->Database->query('DROP TABLE IF EXISTS `SystemModule`');
141 }
142
143 function ReloadList()
144 {
145 // Load list of modules from database
146 $Modules = array();
147 $DbResult = $this->Database->query('SELECT * FROM `SystemModule`');
148 while($DbRow = $DbResult->fetch_assoc())
149 $Modules[$DbRow['Name']] = $DbRow;
150
151 // Load list of modules on disk
152 $ModulesOnDisk = array();
153 $Files = scandir('Modules');
154 foreach($Files as $File)
155 if(is_dir('Modules/'.$File) and ($File != '.') and ($File != '..') and (substr($File, 0, 1) != '.'))
156 {
157 $ModulesOnDisk[] = $File;
158 }
159
160 // Add new
161 foreach($ModulesOnDisk as $ModuleName)
162 if(!array_key_exists($ModuleName, $Modules))
163 {
164 DebugLog('Adding module '.$ModuleName.' to list');
165 include_once('Modules/'.$ModuleName.'/'.$ModuleName.'.php');
166 $ModuleClassName = 'Module'.$ModuleName;
167 if(class_exists($ModuleClassName))
168 {
169 $Module = new $ModuleClassName($this->Database, $this);
170 $this->Database->insert('SystemModule', array('Name' => $Module->Name,
171 'Version' => $Module->Version, 'Creator' => $Module->Creator,
172 'Description' => $Module->Description, 'License' => $Module->License,
173 'Installed' => 0, 'Dependencies' => implode(',', $Module->Dependencies)));
174 unset($Module);
175 } else throw new Exception('Missing class '.$ModuleClassName.' in module '.$ModuleName);
176 }
177
178 // Remove missing
179 foreach($Modules as $Module)
180 if(($Module['Installed'] == 0) and !in_array($Module['Name'], $ModulesOnDisk))
181 {
182 DebugLog('Removing module '.$Module['Name'].' from list');
183 $this->Database->query('DELETE FROM `SystemModule` WHERE `Id` = '.$Module['Id']);
184 }
185 }
186}
187
188?>
Note: See TracBrowser for help on using the repository browser.