diff options
author | Simon Rettberg | 2014-05-19 15:30:59 +0200 |
---|---|---|
committer | Simon Rettberg | 2014-05-19 15:30:59 +0200 |
commit | f6ceaa03052e6878afd53a4bbb7f4429849fe25a (patch) | |
tree | 9f5582c8c275494728f6d6dcf656479714688934 /index.php | |
parent | Working on config.tgz composition through config modules (diff) | |
download | slx-admin-f6ceaa03052e6878afd53a4bbb7f4429849fe25a.tar.gz slx-admin-f6ceaa03052e6878afd53a4bbb7f4429849fe25a.tar.xz slx-admin-f6ceaa03052e6878afd53a4bbb7f4429849fe25a.zip |
OO style modules
Diffstat (limited to 'index.php')
-rw-r--r-- | index.php | 85 |
1 files changed, 61 insertions, 24 deletions
@@ -1,51 +1,89 @@ <?php +/** + * Page class which all "modules" must be extending from + */ +abstract class Page +{ + protected function doPreprocess() {} + protected function doRender() {} + protected function doAjax() {} + public static function preprocess() { self::$instance->doPreprocess(); } + public static function render() { self::$instance->doRender(); } + public static function ajax() { self::$instance->doAjax(); } + /** + * + * @var \Page + */ + private static $instance = false; + public static function set($name) + { + $name = preg_replace('/[^A-Za-z]/', '', $name); + $modulePath = 'modules/' . strtolower($name) . '.inc.php'; + if (!file_exists($modulePath)) { + Util::traceError('Invalid module file: ' . $modulePath); + } + require_once $modulePath; + $className = 'Page_' . $name; + if (!class_exists($className) || get_parent_class($className) !== 'Page') { + Util::traceError('Module not found: ' . $name); + } + self::$instance = new $className(); + } +} + +// Error reporting (hopefully goind to stderr, not being printed on pages) error_reporting(E_ALL); +// Set variable if this is an ajax request +$isAsync = (isset($_REQUEST['async'])) + || (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'); + // Autoload classes from ./inc which adhere to naming scheme <lowercasename>.inc.php function slxAutoloader($class) { $file = 'inc/' . preg_replace('/[^a-z0-9]/', '', mb_strtolower($class)) . '.inc.php'; if (!file_exists($file)) return; require_once $file; } - spl_autoload_register('slxAutoloader'); -if (empty($_REQUEST['do'])) { - // No specific module - set default - $moduleName = 'main'; -} else { - $moduleName = preg_replace('/[^a-z]/', '', $_REQUEST['do']); -} +// Now determine which module to run +Page::set(empty($_REQUEST['do']) ? 'Main' : $_REQUEST['do']); -$modulePath = 'modules/' . $moduleName . '.inc.php'; - -if (!file_exists($modulePath)) { - Util::traceError('Invalid module: ' . $moduleName); +// Deserialize any messages to display +if (!$isAsync && isset($_REQUEST['message'])) { + Message::fromRequest(); } -// Deserialize any messages -if (isset($_REQUEST['message'])) { - Message::fromRequest(); +// CSRF/XSS check +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + User::load(); + if (!Util::verifyToken()) { + if ($isAsync) { + die('CSRF/XSS? Missing token in POST request!'); + } else { + Util::redirect('?do=Main'); + } + } } -// CSRF/XSS -if ($_SERVER['REQUEST_METHOD'] === 'POST' && !Util::verifyToken()) { - Util::redirect('?do=' . $moduleName); +// AJAX Stuff? Just do so. Otherwise, run preprocessing +if ($isAsync) { + Page::ajax(); + exit(0); } -// Load module - it will execute pre-processing, or act upon request parameters -require_once($modulePath); -unset($modulePath); +// Normal mode - preprocess first.... +Page::preprocess(); -// Main menu +// Generate Main menu $menu = new Menu; Render::addTemplate('main-menu', $menu); Message::renderList(); -// Render module. If the module wants to output anything, it will be done here -render_module(); +// Render page. If the module wants to output anything, it will be done here... +Page::render(); if (defined('CONFIG_DEBUG') && CONFIG_DEBUG) { Message::addWarning('debug-mode'); @@ -53,4 +91,3 @@ if (defined('CONFIG_DEBUG') && CONFIG_DEBUG) { // Send page to client. Render::output(); - |