Diese Klasse managed so ziemlich alles...
Liefert eine MDB2-Instanz einer Datenbankverbindung.
Setzt die interne Variable $_moduleCreateObject. Wird auf true gesetzt, wenn ein Modul sich registrieren soll (Näheres siehe Beispielmodul).
“getter” zu setModuleCreateObject. Da das einen boolean zurückliefert verzichte ich auf das Präfix “get”.
Sezt das aktive Modul, was beim aktuellen Seitenaufruf den Inhalt erzeugen soll.
Ruft die Methode “generateContent()” des als “ActiveModule” gesetzten Moduls auf.
Liefert das Standard-Schema oder stirbt, wenn es nicht gefunden wurde (und CMS_DIE_ON_NO_DEFAULT_SCHEME wahr ist).
Liefert den Namen des in $_REQUEST[’schema’] vorgegebenen Schemas, vorrausgesetzt, es existiert. Wenn CMS_DIE_ON_INCORRECT_SCHEME_NAME wird abgebrochen, ansonsten null zurückgegeben.
Liefert den Namen, unter dem das ganze Projekt erreicht werden kann.
Liefert den Inhalt der Haupt-Admin-Seite.
Liefert den Inhalt der Admin-Seite. Wenn ein Modul (und ein Schema) angegeben ist, wird $modul→generateAdminContent() aufgerufen, wenn nicht, dann nicht. Wenn ein Modul ($_REQUEST[’modul’]) angegeben und vorhanden ist wird bevor irgendwelcher Inhalt ausgegeben wird, $modul→xajaxSettings() aufgerufen. Dadurch kann jedes Modul seine eigenen xajax-Späße implementieren.
Liefert das Standardmodule für das in $schema angegebene Schema. Wenn das nicht vorhanden ist, wird je nach Einstellung von $dieOnProblem ein Fehler ausgeworfen oder mit null weitergemacht.
Liefert das angeforderte Modul (liest $_REQUEST[’modul’]). Bricht mit einem Fehler ab, wenn $dieOnProblems wahr ist und kein existentes Modul angefordert wurde. Liefert das Standardmodul, wenn $dieOnProblems = false (und ein Standardmodul eingestellt ist).
Liefert ein xajax-Objekt zurück. $dirPrefix ist die Verzeichnistiefe, von der aus man das aufruft, bezogen auf die allgemeine index.php.
/** * Die folgende Klasse ist so ne Art Oberklasse. * * Da gibt es auch eine Tabelle dafür ;) * installedSchemes: vorhandene Schemata (getrennt durch kommata) * defaultScheme : Wenn keine Schema angegeben, welches wird gezeigt * * @package CMSmain */ class CMSmain { /** * * Speichert die Referenz zur Datenbank. * ist öffentlich, wenn es auch nen getter gibt... * @public * @var integer */ private $_dns = array(); private $_activeModule; private $_moduleCreateObject = false; function __construct(){ /** * * Wir brauchen die DB-Angaben * * @global $CMS_DB */ global $CMS_DB; require_once 'MDB2.php'; $this->_dsn = array( "phptype" => "pgsql", "username" => $CMS_DB['user'], "password" => $CMS_DB['password'], "hostspec" => $CMS_DB['host'].(isset($CMS_DB['port']) ? ":{$CMS_DB['port']}" : ""), "database" => $CMS_DB['database'] ); /** * * Interessanterweise funktioniert das mit nem anderen Port nur, wenn man nen ganzen String übergibt * */ $dsn_string= $this->_dsn['phptype']."://". $this->_dsn['username'].":". $this->_dsn['password']."@tcp(". $this->_dsn['hostspec'].")/". $this->_dsn['database']; $this->dbRef=& MDB2::connect($dsn_string); if (PEAR::isError($this->dbRef)) { die($this->dbRef->getMessage()); } } /** * getter für $dbRef * @params * @return int */ function getDbRef(){ return $this->dbRef; } function setModuleCreateObject($b_tmp){ $this->_moduleCreateObject = ($b_tmp === true); } function moduleCreateObject(){ return $this->_moduleCreateObject; } function callGenerateContent($type){ $this->_activeModule->generateContent($type); } function setActiveModule ($obj){ $this->_activeModule = $obj; } /** * * Liefert das default-Schema oder stirbt (dfeaultmäßig) mit einer Standardseite * Wenn der optionale Parameter auf true ist, dann liefert sie auch null zurück. * @params [dieOnNull] * @return string */ private function getDefaultScheme($dieOnNull = CMS_DIE_ON_NO_DEFAULT_SCHEME){ $sql = "SELECT * FROM cmsmain"; $query_res =& $this->dbRef->query($sql); if (PEAR::isError($query_res)) { die($query_res->getMessage()); } $res =& $query_res->fetchRow(MDB2_FETCHMODE_ASSOC); if ( $res['default_scheme'] === null && $dieOnNull ){ die ("<html>\n<head>\n<title>Default Schützen-CMS-page</title>\n". "<style type='text/css'>\nbody{background:#fff;color:#000;}\nh1{\ncolor:#360}\n</style>\n". "</head>\n<body>\n<h1>Sorry</h1>\n". "<p>Content will (hopefully) be added later. This site is developing!</p>\n". "</body>\n</html>"); } $query_res->free(); return $res['default_scheme']; } /** * Diese Funktion entscheidet, welches Schema aktuell aufgerufen wurde. * Liest den Parameter $scheme, wenn unbekannt oder nicht vorhanden fällt es auf das * als Default eingestellte Schema zurück. Wenn $dieOnProblems === true, dann stirbt die * Funktion bei einem Schemaname, der Zeichen außerhalb von a-zA-Z_0-9 enthält * * @params [dieOnProblems = CMS_DIE_ON_INCORRECT_SCHEME_NAME] * @return string */ function getOrderedScheme($dieOnProblems = CMS_DIE_ON_INCORRECT_SCHEME_NAME){ $schemeSet = isset($_REQUEST['schema']); if ($schemeSet) $scheme = $_REQUEST['schema']; else $scheme = $this->getDefaultScheme(); $badName = preg_match("/[^A-Za-z_0-9]/",$scheme); if ($badName && $dieOnProblems) die ("Illegal character in parameter < code>\$scheme< /code>. Only A-Z,a-z,0-9 and _ are allowed."); elseif ($badName) $scheme = $this->getDefaultScheme(); $sql = "SELECT available_schemes FROM cmsmain LIMIT 1;"; $query_res =& $this->dbRef->query($sql); if (PEAR::isError($query_res)) { die($query_res->getMessage()); } $res =& $query_res->fetchRow(MDB2_FETCHMODE_ASSOC); if (PEAR::isError($res)) { die($res->getMessage()); } $available_schemes = split(",",$res['available_schemes']); $scheme_known = in_array($scheme,$available_schemes); if(!$scheme_known) if ($dieOnProblems) die ("Scheme unknown"); else $scheme=$this->getDefaultScheme; return $scheme; } /** * * Liefert die webadresse des CMS ohne Protokoll. Also den Ort, wo die index-Datei liegt. * @return string */ function getMainWWWAddress(){ $sql = "SELECT wwwaddress FROM cmsmain LIMIT 1;"; $query_res =& $this->dbRef->query($sql); if (PEAR::isError($query_res)) { die($query_res->getMessage()); } $res =& $query_res->fetchRow(MDB2_FETCHMODE_ASSOC); if (PEAR::isError($res)) { die($res->getMessage()); } return $res['wwwaddress']; } /** * * Liefert die Admin-Seite * @return string */ function getMainAdminContent(){ global $CMS_DIRECTORIES; // Genrelle "globale" Module $sql = "SELECT global_modules, available_schemes FROM cmsmain WHERE id = 1;"; $query_res =& $this->dbRef->query($sql); if (PEAR::isError($query_res)){ die ($query_res->getMessage() . "$sql"); } $res =& $query_res->fetchRow(MDB2_FETCHMODE_ASSOC); if (PEAR::isError($res)){ die ($res->getMessage() . "$sql (\$res)"); } $text.= "<h2>Global</h2>\n"; if($res['global_modules'] === null || $res['global_modules'] === ''){ $text.= "<p>Keine globalen Module vorhanden</p>"; } else { $global_modules = split (",",$res['global_modules']); $text.="<ul>\n"; foreach ($global_modules as $mod){ require_once "../{$CMS_DIRECTORIES['modules']}/$mod.php"; eval ("\$tmp_mod= new $mod ();"); $text.="<li class='modulemenuentry'><a href='?modul=$mod'>"; if(file_exists('../'.$CMS_DIRECTORIES['modules'].'/'.$mod.'/'.$tmp_mod->getIconPath()) && !is_dir('../'.$CMS_DIRECTORIES['modules'].'/'.$mod.'/'.$tmp_mod->getIconPath())){ $text.= "<img src='../{$CMS_DIRECTORIES['modules']}/$mod/".$tmp_mod->getIconPath()."' alt='".$tmp_mod->getModuleName()."' title='".addslashes($tmp_mod->getDescription())."'/>"; } else { $text.= "<img src='../{$CMS_DIRECTORIES['includes']}/img/module.png' alt='".$tmp_mod->getModuleName()."' title='".addslashes($tmp_mod->getDescription())."'/>"; } $text .= "<span>".$tmp_mod->getModuleName()."</span></a></li>"; } $text.="</ul>\n"; } $text.= "<h2>Schemata</h2>\n"; if($res['available_schemes'] === null || $res['available_schemes'] === ''){ $text.= "<p>Keine Schemata vorhanden.</p>"; } else { $available_schemes = split(",",$res['available_schemes']); foreach ($available_schemes as $scheme){ $sql = "SELECT title, installed_modules FROM $scheme.main WHERE id = 1;"; $query_res2 =& $this->dbRef->query($sql); if (PEAR::isError($query_res2)){ die ($query_res2->getMessage() . " $sql"); } $res2 =& $query_res2->fetchRow(MDB2_FETCHMODE_ASSOC); if (PEAR::isError($res2)){ die ($res2->getMessage() . " $sql (\$res2)"); } $text.= "<h3>{$res2['title']}</h3>\n"; if($res2['installed_modules'] === null || $res2['installed_modules'] === ''){ $text.= "<p>Keine Module in diesem Schema vorhanden.</p>"; } else { $installed_modules = split (",",$res2['installed_modules']); $text.="<ul>\n"; foreach ($installed_modules as $mod){ require_once "../{$CMS_DIRECTORIES['modules']}/$mod.php"; eval ("\$tmp_mod= new $mod ();"); $text.= "<li class='modulemenuentry'><a href='?schema=$scheme&modul=$mod'>"; if(file_exists('../'.$CMS_DIRECTORIES['modules'].'/'.$mod.'/'.$tmp_mod->getIconPath()) && !is_dir('../'.$CMS_DIRECTORIES['modules'].'/'.$mod.'/'.$tmp_mod->getIconPath())){ $text.= "<img src='../{$CMS_DIRECTORIES['modules']}/$mod/".$tmp_mod->getIconPath()."' alt='".$tmp_mod->getModuleName()."' title='".addslashes($tmp_mod->getDescription())."'/>"; } else { $text.= "<img src='../{$CMS_DIRECTORIES['includes']}/img/module.png' alt='".$tmp_mod->getModuleName()."' title='".addslashes($tmp_mod->getDescription())."'/>"; } $text .= "<span>".$tmp_mod->getModuleName()."</span></a></li>"; } $text.="</ul>\n"; } } } return $text; } function getAdminPage(){ global $CMS_DIRECTORIES, $CMSxajax; $mainAdminPage = (!isset($_REQUEST['modul']) || $_REQUEST['modul'] == ''); $unknownModule = preg_match("/[^A-Za-z_0-9]/",$_REQUEST['modul']) || !file_exists("../".$CMS_DIRECTORIES['modules']."/".$_REQUEST['modul'].".php"); if(!$mainAdminPage && !$unknownModule) { require "../".$CMS_DIRECTORIES['modules']."/".$_REQUEST['modul'].".php"; eval ("\$admin_module = new ".$_REQUEST['modul']."();"); $admin_module->xajaxSettings($CMSxajax); } $text = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"; $text.= "<html xmlns=\"http://www.w3.org/1999/xhtml\">"; $text.= "<head profile=\"http://gmpg.org/xfn/11\">"; $text.= "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />"; $text.= "<link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"admin.css\" />"; if ($CMSxajax != null) {$text.= $CMSxajax->getJavascript("../".$CMS_DIRECTORIES['includes']."/xajax");} $text.= "</head>\n"; $text.= "<body>\n"; $text.= "<div id='adminContent'>\n"; if($mainAdminPage){ $text.= $this->getMainAdminContent(); } else { if ($unknownModule){ $text.= "unbekanntes Modul"; } else { $text.= $admin_module->generateAdminContent(); } } $text.= "</div>"; $text.= "</body>\n</html>"; return $text; } private function getDefaultModule($schema,$dieOnProblems = CMS_DIE_ON_NO_DEFAULT_MODULE){ $sql = "SELECT default_module FROM $schema.main WHERE id = 1;"; $query_res =& $this->dbRef->query($sql); if(PEAR::isError($query_res)){ die ($query_res->getMessage(). "$sql"); } $res =& $query_res->fetchRow(MDB2_FETCHMODE_ASSOC); if(PEAR::isError($res)){ die ($res->getMessage(). "$sql 2"); } $module = $res['default_module']; if (($module === null || $module === "") && $dieOnProblems){ die ("Kein Default-Modul! $sql"); } return $module; } function getOrderedModule($dieOnProblems = CMS_DIE_ON_INCORRECT_MODULE_NAME){ $schema = $this->getOrderedScheme(); if (!isset($_REQUEST['modul'])) $module = $this->getDefaultModule($schema); else $module = $_REQUEST['modul']; $badName = preg_match("/[^A-Za-z_0-9]/",$module); if($badName && $dieOnProblems) die ("incorrect module name"); elseif ($badName) $module = $this->getDefaultModule($schema); $sql = "SELECT installed_modules FROM $schema.main WHERE id = 1;"; $query_res =& $this->dbRef->query($sql); if(PEAR::isError($query_res)){ die ($query_res->getMessage(). "$sql"); } $res =& $query_res->fetchRow(MDB2_FETCHMODE_ASSOC); if(PEAR::isError($res)){ die ($res->getMessage(). "$sql 2"); } $installed_modules= split(",",$res['installed_modules']); $module_installed = in_array($module,$installed_modules); if ( !$module_installed && $dieOnProblems ) die ("Module not installed or known"); elseif (!$module_installed) $module = $this->getDefaultModule($schema); return $module; } function loadXajax($dirPrefix = ""){ global $CMS_DIRECTORIES; if (file_exists($dirPrefix."/{$CMS_DIRECTORIES['includes']}/xajax/xajax.inc.php")){ require_once $dirPrefix."/{$CMS_DIRECTORIES['includes']}/xajax/xajax.inc.php"; } else { die ("Xajax not found."); } return new xajax(); } }