source: trunk/Modules/Module.php@ 343

Last change on this file since 343 was 343, checked in by chronos, 13 years ago
  • Upraveno: Správa uživatelů je nyní přetvořena na modul modulárního systému.
  • Upraveno: Hlavní objekt System je nyní odvozen z třídy ModularSystem.
File size: 4.4 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 * 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 PRIMARY KEY (`Id`)
96) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1;');
97 $this->ReloadList();
98 $this->Init(false);
99 foreach($this->Modules as $Index => $Module)
100 {
101 $this->Modules[$Index]->Install();
102 }
103 }
104
105 function UnInstall()
106 {
107 DebugLog('Uninstalling modular system core...');
108 foreach($this->Modules as $Index => $Module)
109 $this->Modules[$Index]->UnInstall();
110 $this->Database->query('DROP TABLE IF EXISTS `Module`');
111 }
112
113 function ReloadList()
114 {
115 // Load list of modules from database
116 $Modules = array();
117 $DbResult = $this->Database->query('SELECT * FROM `Module`');
118 while($DbRow = $DbResult->fetch_assoc())
119 $Modules[$DbRow['Name']] = $DbRow;
120
121 // Load list of modules on disk
122 $ModulesOnDisk = array();
123 $Files = scandir(dirname(__FILE__));
124 foreach($Files as $File)
125 if(is_dir(dirname(__FILE__).'/'.$File) and ($File != '.') and ($File != '..'))
126 {
127 $ModulesOnDisk[] = $File;
128 }
129
130 // Add new
131 foreach($ModulesOnDisk as $ModuleName)
132 if(!array_key_exists($ModuleName, $Modules))
133 {
134 DebugLog('Adding module '.$ModuleName.' to list');
135 include_once(dirname(__FILE__).'/'.$ModuleName.'/'.$ModuleName.'.php');
136 $ModuleClassName = 'Module'.$ModuleName;
137 if(class_exists($ModuleClassName))
138 {
139 $Module = new $ModuleClassName($this->Database, $this);
140 $this->Database->insert('Module', array('Name' => $Module->Name,
141 'Version' => $Module->Version, 'Creator' => $Module->Creator,
142 'Description' => $Module->Description, 'License' => $Module->License,
143 'Installed' => 0));
144 unset($Module);
145 } else throw new Exception('Missing class '.$ModuleClassName.' in module '.$ModuleName);
146 }
147
148 // Remove missing
149 foreach($Modules as $Module)
150 if(($Module['Installed'] == 0) and !in_array($Module['Name'], $ModulesOnDisk))
151 {
152 DebugLog('Removing module '.$Module['Name'].' from list');
153 $this->Database->query('DELETE FROM `Module` WHERE `Id` = '.$Module['Id']);
154 }
155 }
156}
157
158?>
Note: See TracBrowser for help on using the repository browser.