diff --git a/controllers/site/pages.php b/controllers/site/pages.php new file mode 100644 index 0000000..6847e19 --- /dev/null +++ b/controllers/site/pages.php @@ -0,0 +1,21 @@ +prepare('title', 'Home Page'); + $renderer->prepare('content', 'Welcome to the home page!'); + + // Display the view using the namespace + $renderer->display('home'); +} + +function closed() { + global $renderer; + // Prepare data for the view + $renderer->prepare('title', 'Game closed'); + $renderer->prepare('content', 'The game is currently closed for maintanence. Please check back later.'); + + // Display the view using the namespace + $renderer->display('home'); +} \ No newline at end of file diff --git a/index.php b/index.php index 3c7a485..8184284 100644 --- a/index.php +++ b/index.php @@ -24,10 +24,10 @@ define('DS', DIRECTORY_SEPARATOR); // PHP paths for init define('PATH_ROOT', __DIR__.DS); -define('PATH_BOOT', PATH_ROOT.'kernel'.DS.'boot'.DS); +define('PATH_KERNEL', PATH_ROOT.'kernel'.DS); // Init -require(PATH_BOOT.'init.php'); -require(PATH_BOOT.'site.php'); +require(PATH_KERNEL.'init.php'); +require(PATH_KERNEL.'core.php'); ?> \ No newline at end of file diff --git a/kernel/core.php b/kernel/core.php new file mode 100644 index 0000000..cf3308f --- /dev/null +++ b/kernel/core.php @@ -0,0 +1,11 @@ +registerNamespace('admin', 2, false); // Admin namespace requires level 2 +$router->registerNamespace('user', 1, false); // User namespace requires level 1 +$router->registerNamespace('site', 0, false); // Site namespace requires level 0 + +$router->loadController(); diff --git a/kernel/init.php b/kernel/init.php new file mode 100644 index 0000000..ae74715 --- /dev/null +++ b/kernel/init.php @@ -0,0 +1,38 @@ +name = $name; + $this->authLevel = $authLevel; + $this->haveCharacterId = $haveCharacterId; + } + + public function canShow() { + // FIXME: handle auth level correctly + return $this->authLevel < 1000; + } +} \ No newline at end of file diff --git a/kernel/renderer.php b/kernel/renderer.php new file mode 100644 index 0000000..88b2248 --- /dev/null +++ b/kernel/renderer.php @@ -0,0 +1,38 @@ +twig = new \Twig\Environment($loader); + } + + public function prepare($key, $value) { + $this->data[$key] = $value; + } + + public function display($template) { + global $router; + try { + echo $this->twig->render("{$router->namespace}/{$template}.twig", $this->data); + die(); + } catch (\Twig\Error\LoaderError $e) { + $this->error(500); + } + } + + public function error($errorCode) { + $errorTemplate = PATH_ROOT . "/theme/default/error/{$errorCode}.twig"; + if (file_exists($errorTemplate)) { + echo $this->twig->render("error/{$errorCode}.twig"); + } else { + echo $this->twig->render("error/generic.twig"); + } + die(); + } +} \ No newline at end of file diff --git a/kernel/router.php b/kernel/router.php new file mode 100644 index 0000000..8d449df --- /dev/null +++ b/kernel/router.php @@ -0,0 +1,74 @@ +namespaces[$name] = new NamespaceHandler($name, $authLevel, $haveCharacterId); + } + + public function loadController() { + global $renderer; + $this->parseUrl(); + if (!$this->currentNamespaceHandler->canShow()) { + $renderer->error(403); + } + $controllerFile = $this->getControllerPath(); + require_once $controllerFile; + + if (is_callable($this->func)) { + call_user_func($this->func); + } else { + $renderer->error(404); + } + } + + private function getFromUrl($requestParts, $index, $default) { + return (isset($requestParts[$index]) && $requestParts[$index] != null) ? $requestParts[$index] : $default; + } + + private function parseUrl() { + global $renderer; + $requestUri = trim($_SERVER['REQUEST_URI'], '/'); + $requestParts = explode('/', $requestUri); + + $this->namespace = $this->getFromUrl($requestParts, 0, 'site'); + if (!isset($this->namespaces[$this->namespace])) { + $renderer->error(404); + } + + $this->currentNamespaceHandler = $this->namespaces[$this->namespace]; + + if ($this->currentNamespaceHandler->haveCharacterId) { + $this->characterId = $this->getFromUrl($requestParts, 1, -1); + $this->controller = $this->getFromUrl($requestParts, 2, "pages"); + $this->func = $this->getFromUrl($requestParts, 3, "index"); + } else { + $this->controller = $this->getFromUrl($requestParts, 1, "pages"); + $this->func = $this->getFromUrl($requestParts, 2, "index"); + } + } + + private function getControllerPath() { + global $renderer; + $controllerPath = PATH_ROOT . "controllers/{$this->namespace}/{$this->controller}.php"; + if (!file_exists($controllerPath)) { + $renderer->error(404); + } + return $controllerPath; + } +} \ No newline at end of file diff --git a/theme/default/error/404.twig b/theme/default/error/404.twig new file mode 100644 index 0000000..6f015bc --- /dev/null +++ b/theme/default/error/404.twig @@ -0,0 +1,12 @@ + + + + + + 404 Not Found + + +

404 Not Found

+

The page you are looking for does not exist.

+ + \ No newline at end of file diff --git a/theme/default/error/generic.twig b/theme/default/error/generic.twig new file mode 100644 index 0000000..a98a818 --- /dev/null +++ b/theme/default/error/generic.twig @@ -0,0 +1,12 @@ + + + + + + Error + + +

Error

+

I am error.

+ + \ No newline at end of file diff --git a/theme/default/site/home.twig b/theme/default/site/home.twig new file mode 100644 index 0000000..5a6b3ac --- /dev/null +++ b/theme/default/site/home.twig @@ -0,0 +1,12 @@ + + + + + + {{ title }} + + +

{{ title }}

+

{{ content }}

+ + \ No newline at end of file