diff options
Diffstat (limited to 'core/modules.inc.php')
-rw-r--r-- | core/modules.inc.php | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/core/modules.inc.php b/core/modules.inc.php new file mode 100644 index 0000000..c1ebc80 --- /dev/null +++ b/core/modules.inc.php @@ -0,0 +1,164 @@ +<?PHP + require_once('core/xmlparser.inc.php'); + require_once('core/db.inc.php'); + + function Uses() { + foreach(func_get_args() as $file) { + if(isset($GLOBALS['modules']->code[$file])) + require_once($GLOBALS['modules']->code[$file]['path'] . 'code/' . $file . '.inc.php'); + else + die('Fatal: a required code file was not found.'); + } + } + + class Modules { + var $modules = array(); + var $pages = array(); + var $code = array(); + var $templates = array(); + + function Modules() { + $module = $this->Load('base.xml'); + if(!$module) die('Fatal: could not load Neon base.'); + + $module['path'] = ''; + + $this->modules['base'] = $module; + + + $dir = opendir('modules'); + + while($moddir = readdir($dir)) { + if($moddir[0] == '.' || !is_dir('modules/' . $moddir) || !is_file('modules/' . $moddir . '/module.xml')) + continue; + + $module = $this->Load('modules/' . $moddir . '/module.xml'); + + if(!$module) continue; + + $module['path'] = 'modules/' . $moddir . '/'; + $this->modules[$module['name']] = $module; + } + + closedir($dir); + + $res = $GLOBALS['db']->Execute('SELECT name, enabled FROM modules'); + + $row[0] = 'base'; + $row[1] = 1; + + do { + if(!array_key_exists($row[0], $this->modules)) { + $GLOBALS['db']->Execute('DELETE FROM modules WHERE name = ?', $row[0]); + continue; + } + + if(!$row[1]) continue; + + $this->modules[$row[0]]['enabled'] = true; + + foreach($this->modules[$row[0]]['pages'] as $page) + $this->pages[$page] = &$this->modules[$row[0]]; + foreach($this->modules[$row[0]]['code'] as $code) + $this->code[$code] = &$this->modules[$row[0]]; + foreach($this->modules[$row[0]]['templates'] as $template) + $this->templates[$template] = &$this->modules[$row[0]]; + } while($row = $res->FetchRow()); + } + + function Load($file) { + if(!is_file($file)) return null; + + $data = $GLOBALS['xmlparser']->ParseFile($file); + if(!$data) return null; + + $info = $GLOBALS['xmlparser']->FindTag($data, 'info'); + if(!$info) return null; + + $name = $GLOBALS['xmlparser']->FindTag($info, 'name'); + if(!$name) return null; + if(count($name['children']) != 1) return null; + if(!is_string($name['children'][0])) return null; + $name = $name['children'][0]; + + $version = $GLOBALS['xmlparser']->FindTag($info, 'version'); + if(!$version) return null; + if(count($version['children']) != 1) return null; + if(!is_string($version['children'][0])) return null; + $version = $version['children'][0]; + + $desc = $GLOBALS['xmlparser']->FindTag($info, 'desc'); + if($desc && (count($desc['children']) == 1) && is_string($desc['children'][0])) $desc = $desc['children'][0]; + else $desc = ''; + + + $module = array('name' => $name, 'version' => $version, 'desc' => $desc, 'code' => array(), + 'pages' => array(), 'templates' => array(), 'config' => false, 'enabled' => false); + + if($GLOBALS['xmlparser']->FindTag($info, 'config')) $module['config'] = true; + + $files = $GLOBALS['xmlparser']->FindTag($data, 'files'); + if(!$files) return $module; + + foreach($files['children'] as $file) { + if(!is_array($file)) continue; + if(count($file['children']) != 1) continue; + if(!is_string($file['children'][0])) continue; + + switch($file['tag']) { + case 'page': + $type = $file['attribs']['type']; + if(!$type) $type = 'c'; + + array_push($module['pages'], $file['children'][0] . '.' . $type); + break; + case 'code': + array_push($module['code'], $file['children'][0]); + break; + case 'template': + array_push($module['templates'], $file['children'][0]); + } + } + + return $module; + } + + function Exists($name) { + return array_key_exists($name, $this->modules); + } + + function Enabled($name) { + return $this->Exists($name) && $this->modules[$name]['enabled']; + } + + function HasConfig($name) { + if(!$this->Exists($name)) return false; + + return $this->modules[$name]['config']; + } + + function Enable($name, $enable = true) { + if(!$this->Exists($name)) return false; + + if($this->Enabled($name) == $enable) return true; + + $res = $GLOBALS['db']->Execute('SELECT id FROM modules WHERE name = ?', $name); + + if($res->RecordCount()) { + $GLOBALS['db']->Execute('UPDATE modules SET enabled = ? WHERE name = ?', array(intval($enable), $name)); + + return ($GLOBALS['db']->Affected_Rows() > 0); + } + + $GLOBALS['db']->Execute('INSERT INTO modules (name, enabled) VALUES (?, ?)', array($name, intval($enable))); + + return ($GLOBALS['db']->Affected_Rows() > 0); + } + + function Disable($name) { + return $this->Enable($name, false); + } + } + + $GLOBALS['modules'] = new Modules; +?> |