source: trunk/Modules/Module.php@ 360

Last change on this file since 360 was 360, checked in by chronos, 13 years ago
  • Upraveno: Administrace síťových zařízení přesunuta do systémového modulu Network. Zde doplněny použité modely pro inicializaci databáze.
  • Upraveno: Relace ManyToMany má nyní vhodnější parametry pro sestavení pomocné tabulky.
File size: 4.6 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 $System;
17
18 function __construct($Database, $System)
19 {
20 $this->Database = &$Database;
21 $this->System = &$System;
22 }
23
24 function Install()
25 {
26 DebugLog('Installing module '.$this->Name.'...');
27 foreach($this->Models as $ModelName)
28 {
29 $Model = new $ModelName($this->Database, $this->System);
30 $Model->Install();
31 unset($Model);
32 }
33 $this->Database->query('UPDATE Module SET Installed=1 WHERE Name="'.$this->Name.'"');
34 }
35
36 function UnInstall()
37 {
38 DebugLog('Uninstalling module '.$this->Name.'...');
39 foreach($this->Models as $ModelName)
40 {
41 $Model = new $ModelName($this->Database, $this->System);
42 $Model->UnInstall();
43 unset($Model);
44 }
45 $this->Database->query('UPDATE Module SET Installed=0 WHERE Name="'.$this->Name.'"');
46 }
47
48 function Init()
49 {
50 }
51}
52
53class ModularSystem
54{
55 var $Database;
56 var $Modules = array();
57 var $Models = array();
58
59 function __construct($Database)
60 {
61 $this->Database = &$Database;
62 }
63
64 function ModulePresent($Name)
65 {
66 return(array_key_exists($Name, $this->Modules));
67 }
68
69 function Init($Installed = true)
70 {
71 $Query = 'SELECT Name FROM `Module`';
72 if($Installed) $Query .= ' WHERE `Installed`=1';
73 else $Query .= ' WHERE `Installed`=0';
74 $DbResult = $this->Database->query($Query);
75 while($Module = $DbResult->fetch_array())
76 {
77 include_once(dirname(__FILE__).'/'.$Module['Name'].'/'.$Module['Name'].'.php');
78 $ModuleClassName = 'Module'.$Module['Name'];
79 $this->Modules[$Module['Name']] = new $ModuleClassName($this->Database, $this);
80 $this->Modules[$Module['Name']]->Init();
81 }
82 }
83
84 function Install()
85 {
86 //DebugLog('Installing modular system core...');
87 $this->Database->query('CREATE TABLE IF NOT EXISTS `Module` (
88 `Id` int(11) NOT NULL AUTO_INCREMENT,
89 `Name` varchar(255) COLLATE utf8_czech_ci NOT NULL,
90 `Creator` varchar(255) COLLATE utf8_czech_ci NOT NULL,
91 `Version` varchar(255) COLLATE utf8_czech_ci NOT NULL,
92 `License` varchar(255) COLLATE utf8_czech_ci NOT NULL,
93 `Installed` int(11) NOT NULL,
94 `Description` text COLLATE utf8_czech_ci NOT NULL,
95 `Dependecies` varchar(255) COLLATE utf8_czech_ci NOT NULL,
96 PRIMARY KEY (`Id`)
97) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1;');
98 $this->ReloadList();
99 $this->Init(false);
100 foreach($this->Modules as $Index => $Module)
101 {
102 $this->Modules[$Index]->Install();
103 }
104 }
105
106 function UnInstall()
107 {
108 DebugLog('Uninstalling modular system core...');
109 foreach($this->Modules as $Index => $Module)
110 $this->Modules[$Index]->UnInstall();
111 $this->Database->query('DROP TABLE IF EXISTS `Module`');
112 }
113
114 function ReloadList()
115 {
116 // Load list of modules from database
117 $Modules = array();
118 $DbResult = $this->Database->query('SELECT * FROM `Module`');
119 while($DbRow = $DbResult->fetch_assoc())
120 $Modules[$DbRow['Name']] = $DbRow;
121
122 // Load list of modules on disk
123 $ModulesOnDisk = array();
124 $Files = scandir(dirname(__FILE__));
125 foreach($Files as $File)
126 if(is_dir(dirname(__FILE__).'/'.$File) and ($File != '.') and ($File != '..') and (substr($File, 0, 1) != '.'))
127 {
128 $ModulesOnDisk[] = $File;
129 }
130
131 // Add new
132 foreach($ModulesOnDisk as $ModuleName)
133 if(!array_key_exists($ModuleName, $Modules))
134 {
135 DebugLog('Adding module '.$ModuleName.' to list');
136 include_once(dirname(__FILE__).'/'.$ModuleName.'/'.$ModuleName.'.php');
137 $ModuleClassName = 'Module'.$ModuleName;
138 if(class_exists($ModuleClassName))
139 {
140 $Module = new $ModuleClassName($this->Database, $this);
141 $this->Database->insert('Module', array('Name' => $Module->Name,
142 'Version' => $Module->Version, 'Creator' => $Module->Creator,
143 'Description' => $Module->Description, 'License' => $Module->License,
144 'Installed' => 0, 'Dependecies' => implode(',', $Module->Dependencies)));
145 unset($Module);
146 } else throw new Exception('Missing class '.$ModuleClassName.' in module '.$ModuleName);
147 }
148
149 // Remove missing
150 foreach($Modules as $Module)
151 if(($Module['Installed'] == 0) and !in_array($Module['Name'], $ModulesOnDisk))
152 {
153 DebugLog('Removing module '.$Module['Name'].' from list');
154 $this->Database->query('DELETE FROM `Module` WHERE `Id` = '.$Module['Id']);
155 }
156 }
157}
158
159?>
Note: See TracBrowser for help on using the repository browser.