source: trunk/Modules/Module.php@ 360

Last change on this file since 360 was 360, checked in by chronos, 14 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
RevLine 
[340]1<?php
2
[341]3include_once(dirname(__FILE__).'/../Model.php');
4
[340]5class Module
6{
7 var $Name;
8 var $Version;
9 var $License;
10 var $Creator;
11 var $Description;
12 var $Dependencies;
[342]13 var $Models = array();
[341]14 var $Database;
15 var $Installed;
[343]16 var $System;
[340]17
[343]18 function __construct($Database, $System)
[341]19 {
20 $this->Database = &$Database;
[343]21 $this->System = &$System;
[341]22 }
23
[340]24 function Install()
[341]25 {
26 DebugLog('Installing module '.$this->Name.'...');
27 foreach($this->Models as $ModelName)
28 {
[343]29 $Model = new $ModelName($this->Database, $this->System);
[342]30 $Model->Install();
31 unset($Model);
[341]32 }
[342]33 $this->Database->query('UPDATE Module SET Installed=1 WHERE Name="'.$this->Name.'"');
[340]34 }
35
36 function UnInstall()
37 {
[341]38 DebugLog('Uninstalling module '.$this->Name.'...');
39 foreach($this->Models as $ModelName)
40 {
[343]41 $Model = new $ModelName($this->Database, $this->System);
[342]42 $Model->UnInstall();
[341]43 unset($Model);
44 }
[342]45 $this->Database->query('UPDATE Module SET Installed=0 WHERE Name="'.$this->Name.'"');
[340]46 }
[343]47
48 function Init()
49 {
50 }
[340]51}
52
[341]53class ModularSystem
54{
55 var $Database;
56 var $Modules = array();
[343]57 var $Models = array();
[341]58
59 function __construct($Database)
60 {
61 $this->Database = &$Database;
[342]62 }
63
[343]64 function ModulePresent($Name)
65 {
66 return(array_key_exists($Name, $this->Modules));
67 }
68
[342]69 function Init($Installed = true)
70 {
[351]71 $Query = 'SELECT Name FROM `Module`';
[342]72 if($Installed) $Query .= ' WHERE `Installed`=1';
73 else $Query .= ' WHERE `Installed`=0';
74 $DbResult = $this->Database->query($Query);
[341]75 while($Module = $DbResult->fetch_array())
76 {
[343]77 include_once(dirname(__FILE__).'/'.$Module['Name'].'/'.$Module['Name'].'.php');
[342]78 $ModuleClassName = 'Module'.$Module['Name'];
[343]79 $this->Modules[$Module['Name']] = new $ModuleClassName($this->Database, $this);
80 $this->Modules[$Module['Name']]->Init();
[342]81 }
[341]82 }
83
84 function Install()
85 {
[358]86 //DebugLog('Installing modular system core...');
[341]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,
[342]94 `Description` text COLLATE utf8_czech_ci NOT NULL,
[360]95 `Dependecies` varchar(255) COLLATE utf8_czech_ci NOT NULL,
[341]96 PRIMARY KEY (`Id`)
[342]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)
[341]101 {
[342]102 $this->Modules[$Index]->Install();
[341]103 }
104 }
105
106 function UnInstall()
107 {
108 DebugLog('Uninstalling modular system core...');
[342]109 foreach($this->Modules as $Index => $Module)
110 $this->Modules[$Index]->UnInstall();
[341]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();
[342]118 $DbResult = $this->Database->query('SELECT * FROM `Module`');
[341]119 while($DbRow = $DbResult->fetch_assoc())
120 $Modules[$DbRow['Name']] = $DbRow;
121
122 // Load list of modules on disk
123 $ModulesOnDisk = array();
[343]124 $Files = scandir(dirname(__FILE__));
[341]125 foreach($Files as $File)
[347]126 if(is_dir(dirname(__FILE__).'/'.$File) and ($File != '.') and ($File != '..') and (substr($File, 0, 1) != '.'))
[341]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');
[343]136 include_once(dirname(__FILE__).'/'.$ModuleName.'/'.$ModuleName.'.php');
[341]137 $ModuleClassName = 'Module'.$ModuleName;
138 if(class_exists($ModuleClassName))
139 {
[343]140 $Module = new $ModuleClassName($this->Database, $this);
[341]141 $this->Database->insert('Module', array('Name' => $Module->Name,
142 'Version' => $Module->Version, 'Creator' => $Module->Creator,
143 'Description' => $Module->Description, 'License' => $Module->License,
[360]144 'Installed' => 0, 'Dependecies' => implode(',', $Module->Dependencies)));
[341]145 unset($Module);
146 } else throw new Exception('Missing class '.$ModuleClassName.' in module '.$ModuleName);
147 }
148
149 // Remove missing
150 foreach($Modules as $Module)
[342]151 if(($Module['Installed'] == 0) and !in_array($Module['Name'], $ModulesOnDisk))
[341]152 {
[342]153 DebugLog('Removing module '.$Module['Name'].' from list');
154 $this->Database->query('DELETE FROM `Module` WHERE `Id` = '.$Module['Id']);
[341]155 }
156 }
157}
158
[358]159?>
Note: See TracBrowser for help on using the repository browser.