code[$file])) require_once($GLOBALS['modules']->code[$file]); elseif(isset($GLOBALS['modules']->templates[$file])) require_once($GLOBALS['modules']->templates[$file]); else require_once($file); } class Modules { var $modules = array(); var $pages = array(); var $code = array(); var $templates = array(); function Modules() { $dir = opendir('modules'); while($moddir = readdir($dir)) { if($moddir[0] != '.' && is_dir('modules/' . $moddir) && is_file('modules/' . $moddir . '/module.xml')) { $data = $GLOBALS['xmlparser']->ParseFile('modules/' . $moddir . '/module.xml'); if(!$data) continue; $info = $GLOBALS['xmlparser']->FindTag($data, 'info'); if(!$info) continue; $name = $GLOBALS['xmlparser']->FindTag($info, 'name'); if(!$name) continue; if(count($name['children']) != 1) continue; if(!is_string($name['children'][0])) continue; $name = $name['children'][0]; $version = $GLOBALS['xmlparser']->FindTag($info, 'version'); if(!$version) continue; if(count($version['children']) != 1) continue; if(!is_string($version['children'][0])) continue; $version = $version['children'][0]; $desc = $GLOBALS['xmlparser']->FindTag($info, 'desc'); if(!$desc) continue; if(count($desc['children']) != 1) continue; if(!is_string($desc['children'][0])) continue; $desc = $desc['children'][0]; $this->modules[$name] = array('name' => $name, 'version' => $version, 'desc' => $desc, 'code' => array(), 'templates' => array(), 'config' => false, 'enabled' => false); if($GLOBALS['xmlparser']->FindTag($info, 'config')) $this->modules[$name]['config'] = true; $files = $GLOBALS['xmlparser']->FindTag($data, 'files'); if(!$files) continue; 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'; $pagename = $file['children'][0] . '.' . $type; $realname = 'modules/' . $moddir . '/pages/' . strtr($type, array('c' => 'content', 'e' => 'editor', 'n' => 'nav')) . '/' . $file['children'][0] . '.xml'; $this->modules[$name]['pages'][$pagename] = $realname; break; case 'code': $filename = 'code/' . $file['children'][0] . '.inc.php'; $realname = 'modules/' . $moddir . '/code/' . $file['children'][0] . '.inc.php'; $this->modules[$name]['code'][$filename] = $realname; break; case 'template': $filename = 'templates/' . $file['children'][0] . '.inc.php'; $realname = 'modules/' . $moddir . '/templates/' . $file['children'][0] . '.inc.php'; $this->modules[$name]['templates'][$filename] = $realname; } } } } closedir($dir); $res = $GLOBALS['db']->Execute('SELECT name, enabled FROM modules'); while($row = $res->FetchRow()) { 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; $this->pages = array_merge($this->pages, $this->modules[$row[0]]['pages']); $this->code = array_merge($this->code, $this->modules[$row[0]]['code']); $this->templates = array_merge($this->templates, $this->modules[$row[0]]['templates']); } } 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; ?>