code[$file])) require_once($GLOBALS['modules']->GetCodePath($file)); 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 GetCodePath($name) { return $this->code[$name]['path'] . 'code/' . $name . '.inc.php'; } function GetPagePath($name, $type) { return $this->pages[$name . '.' . $type]['path'] . 'pages/' . strtr($type, array('c' => 'content', 'e' => 'editor', 'n' => 'nav', 'b' => 'base')) . '/' . $name . '.xml'; } function GetTemplatePath($name) { return $this->templates[$name]['path'] . 'templates/' . $name . '.inc.php'; } 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; ?>