VENOM-10: WIP

This commit is contained in:
Maurice Grönwoldt 2020-11-18 17:50:01 +01:00
commit 5c44d50989
33 changed files with 890 additions and 601 deletions

View file

@ -38,6 +38,8 @@ class AdminController implements RenderController
}
Asset::get()->addCSS('styles', 'style.css', 1);
Asset::get()->addJS('scripts', 'scripts.min.js', 1);
// Components are the Rendering-Pipeline to know how each Admin-Component needs to be rendered
Asset::get()->addJS('components', 'components.min.js', 5);
return true;
}

View file

@ -5,6 +5,7 @@ namespace Venom\Admin;
use Venom\Admin\Routes\LoginRoute;
use Venom\Admin\Routes\TemplateLoader;
use Venom\Routing\Router;
use Venom\Venom;
@ -12,9 +13,7 @@ class AdminRouterInit
{
public static function registerAdminRouters(Venom $venom): void
{
$router = new Router(Router::ADMIN_ROUTER, 1.0, '/admin/api');
$router->addRoutes(self::getRoutes());
$venom->addRouter(Router::ADMIN_ROUTER, $router);
$venom->getRouter(Router::ADMIN_ROUTER)->addRoutes(self::getRoutes());
}
public static function getRoutes(): array
@ -31,6 +30,15 @@ class AdminRouterInit
"GET" => 'handle'
]
]
],
'/templateLoader' => [
'cl' => TemplateLoader::class,
'roles' => ['ROLE_GUEST'],
'routes' => [
'*' => [
"GET" => 'handle'
]
]
]
];
}

View file

@ -21,8 +21,7 @@ class LoginRoute implements Route
{
if ($fnc === 'logout') {
Security::get()->logout();
$url = ArgumentHandler::get()->getPostItem('REDIRECT_TO', '/admin/');
header('Location: ' . $url);
echo '{"reload": true}';
die();
}
return true;

View file

@ -0,0 +1,23 @@
<?php
namespace Venom\Admin\Routes;
use Venom\Core\ArgumentHandler;
use Venom\Helper\TemplateUtil;
use Venom\Routing\Route;
class TemplateLoader implements Route
{
public function handle(): bool
{
header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', time() + (60 * 60 * 60 * 30)));
header('Cache-Control: public');
$id = ArgumentHandler::get()->getItem('tpl', '..');
if (strpos($id, '..')) {
return false;
}
echo TemplateUtil::includeTemplate('jsTemplates/' . $id, '.tpl');
die();
}
}

View file

@ -4,9 +4,11 @@
namespace Venom\Core;
use Venom\Venom;
interface Module
{
public function register(): bool;
public function register(Venom $venom): bool;
public function init(): void;
}

View file

@ -0,0 +1,25 @@
<?php
namespace Venom\Helper;
class AdminHelper
{
public static function getResponse($content, bool $shouldReload = false, string $component = '', $extra = false)
{
$response = [
'content' => $content,
'component' => $component
];
if ($shouldReload) {
$response['reload'] = true;
}
if ($extra) {
$response['extra'] = $extra;
}
echo json_encode($response);
die();
}
}

View file

@ -0,0 +1,58 @@
<?php
namespace Venom\Helper;
use Venom\Core\Config;
class TemplateUtil
{
private static ?TemplateUtil $instance = null;
private string $baseTemplate;
private string $templateDir;
private function __construct()
{
if (Config::getInstance()->isAdmin()) {
$base = 'base';
$theme = 'admin';
} else {
$data = Config::getInstance()->getRenderer();
$theme = $data->theme;
$base = $data->baseFile ?? 'base';
}
$this->baseTemplate = $base . '.php';
$this->templateDir = __DIR__ . '/../../../tpl/' . $theme . '/';
}
public static function getInstance(): TemplateUtil
{
if (self::$instance === null) {
self::$instance = new TemplateUtil();
}
return self::$instance;
}
public function getDir(): string
{
return $this->templateDir;
}
public function getBase(): string
{
return $this->baseTemplate;
}
public static function includeTemplate($template, $suffix = '.php')
{
$dir = self::getInstance()->getDir();
$template .= $suffix;
if (file_exists($dir . $template)) {
ob_start();
include_once $dir . $template;
return ob_get_clean();
}
return '';
}
}

View file

@ -27,7 +27,7 @@ class Router
public function addRoutes(array $routes): void
{
$this->routes = $routes;
$this->routes = array_merge($this->routes, $routes);
}
public function addRoute(string $path, array $route): void

View file

@ -29,6 +29,7 @@ class Venom
{
ExceptionHandler::setExceptionHandler();
$this->renderer = new VenomRenderer($this);
$this->routers[Router::ADMIN_ROUTER] = new Router(Router::ADMIN_ROUTER, 1.0, '/admin/api');
Asset::get()->setRenderer($this->renderer);
}
@ -116,7 +117,7 @@ class Venom
{
foreach ($modules as $key => $moduleClass) {
$module = new $moduleClass;
if ($module instanceof Module && $module->register()) {
if ($module instanceof Module && $module->register($this)) {
$this->modules[$key] = $module;
}
}
@ -131,4 +132,9 @@ class Venom
{
$this->routers[$name] = $router;
}
public function getRouter(string $router): ?Router
{
return $this->routers[$router];
}
}

View file

@ -7,6 +7,7 @@ namespace Venom\Views;
use Venom\Core\ArgumentHandler;
use Venom\Core\Config;
use Venom\Helper\MetaGenerator;
use Venom\Helper\TemplateUtil;
use Venom\Venom;
class VenomRenderer
@ -52,8 +53,7 @@ class VenomRenderer
public function renderTemplate($template): void
{
// random variable name... to remove it instantly
echo $this->includeTemplate($template, '1408138186');
unset($this->vars['1408138186']);
echo TemplateUtil::includeTemplate($template);
}
/**
@ -64,16 +64,9 @@ class VenomRenderer
*/
public function includeTemplate($template, $varName = '')
{
$template .= '.php';
if (file_exists($this->templateDir . $template)) {
ob_start();
include_once $this->templateDir . $template;
$data = ob_get_clean();
$this->vars[$varName] = $data;
return $data;
}
$this->vars[$varName] = '';
return '';
$data = TemplateUtil::includeTemplate($template);
$this->vars[$varName] = $data;
return $data;
}
public function addVar($name, $value): void
@ -94,17 +87,12 @@ class VenomRenderer
public function init(?RenderController $controller): void
{
$this->controller = $controller;
$data = Config::getInstance()->getRenderer();
$theme = $data->theme;
$base = $data->baseFile ?? 'base';
$this->metaGenerator = new MetaGenerator();
if (Config::getInstance()->isAdmin()) {
$base = 'base';
$theme = 'admin';
} else {
if (!Config::getInstance()->isAdmin()) {
$this->metaGenerator = new MetaGenerator();
$this->metaGenerator->loadById();
}
$this->baseTemplate = $base . '.php';
$this->templateDir = __DIR__ . '/../../../tpl/' . $theme . '/';
$util = TemplateUtil::getInstance();
$this->templateDir = $util->getDir();
$this->baseTemplate = $util->getBase();
}
}

View file

@ -0,0 +1,79 @@
<?php
namespace Modules;
use Venom\Core\Config;
use Venom\Core\Module;
use Venom\Helper\AdminHelper;
use Venom\Routing\Route;
use Venom\Routing\Router;
use Venom\Venom;
class RoleModule implements Module, Route
{
public function register(Venom $venom): bool
{
if (Config::getInstance()->isAdmin()) {
$this->registerAdminRoutes($venom);
}
return true;
}
public function init(): void
{
}
private function registerAdminRoutes(Venom $venom)
{
$venom->getRouter(Router::ADMIN_ROUTER)->addRoutes([
'/roles' => [
'cl' => RoleModule::class,
'roles' => ['ROLE_ADMIN'],
'routes' => [
'*' => [
"GET" => 'get',
],
'1' => [
"GET" => 'getById',
"POST" => 'update',
"PUT" => 'insert',
]
]
]
]);
}
public function get()
{
AdminHelper::getResponse([
'roles' => [
['id' => 1, 'name' => 'Admin', 'icon' => 'vt-visibility'],
['id' => 2, 'name' => 'Moderator', 'icon' => 'vt-edit'],
['id' => 3, 'name' => 'Gast', 'icon' => 'vt-edit'],
]
]);
}
public function update(): bool
{
return false;
}
public function insert(): bool
{
return false;
}
public function getById($id)
{
AdminHelper::getResponse([
'caseName' => 'ROLE_ADMIN',
'id' => $id,
'name' => 'Admin',
'icon' => 'vt-visibility'
]);
}
}