VENOM-10: Moved to new Module Structure
Fixed File-Endings Added Entity-System
This commit is contained in:
parent
32a78ed1b9
commit
eb6770204a
101 changed files with 1272 additions and 892 deletions
|
@ -1,18 +1,18 @@
|
|||
<?php
|
||||
|
||||
use Venom\Core\Config;
|
||||
use Venom\Core\DatabaseHandler;
|
||||
use Venom\Core\Database\Database;
|
||||
|
||||
$config = Config::getInstance();
|
||||
$config->setVersion(1.0);
|
||||
$config->setDatabase([
|
||||
DatabaseHandler::DB_TYPE => 'mysql', //please change only if you know what you're doing! this can break a lot.
|
||||
DatabaseHandler::DB_HOST => '127.0.0.1',
|
||||
DatabaseHandler::DB_PORT => '3306', //default port is 3306
|
||||
DatabaseHandler::DB_USER => 'venom',
|
||||
DatabaseHandler::DB_PASSWORD => 'venomPassword',
|
||||
DatabaseHandler::DB_DB => 'venomCMS',
|
||||
DatabaseHandler::DB_EXTRA => '' // need to start with ';'
|
||||
Database::DB_TYPE => 'mysql', //please change only if you know what you're doing! this can break a lot.
|
||||
Database::DB_HOST => '127.0.0.1',
|
||||
Database::DB_PORT => '3306', //default port is 3306
|
||||
Database::DB_USER => 'venom',
|
||||
Database::DB_PASSWORD => 'venomPassword',
|
||||
Database::DB_DB => 'venomCMS',
|
||||
Database::DB_EXTRA => '' // need to start with ';'
|
||||
]);
|
||||
|
||||
/**
|
||||
|
|
0
base/lang.base.php
Normal file → Executable file
0
base/lang.base.php
Normal file → Executable file
|
@ -1,9 +1,4 @@
|
|||
<?php
|
||||
|
||||
//register modules -> need to have the Module Class at parent with the init function ;)
|
||||
//register modules -> only apply Module Path! like Meta now the ModuleLoader search for /modules/Meta/module.php!
|
||||
$modules = [];
|
||||
|
||||
// register controllers that can handle templates ;) need to have a render function for this
|
||||
$controllers = [
|
||||
'test' => \Controllers\TestController::class,
|
||||
];
|
18
base/router.base.php
Normal file → Executable file
18
base/router.base.php
Normal file → Executable file
|
@ -11,19 +11,5 @@ if (!isset($venom)) {
|
|||
exit(1);
|
||||
}
|
||||
|
||||
$router = new Router('defaultRouter', 1.0, 'api/');
|
||||
$router->addRoutes([
|
||||
'/test' => [
|
||||
'cl' => Route::class,
|
||||
'roles' => ['ROLE_GUEST'],
|
||||
'routes' => [
|
||||
'*' => [
|
||||
"GET" => 'getAll'
|
||||
],
|
||||
'1' => [
|
||||
"GET" => 'getAll'
|
||||
]
|
||||
]
|
||||
],
|
||||
]);
|
||||
$venom->addRouter('defaultRouter', $router);
|
||||
$router = new Router(Router::DEFAULT_ROUTER, 1.0, 'api/');
|
||||
$venom->addRouter($router);
|
0
conf/.gitkeep
Normal file → Executable file
0
conf/.gitkeep
Normal file → Executable file
|
@ -46,7 +46,7 @@ create table if not exists users
|
|||
password varchar(255) not null,
|
||||
token varchar(255) not null,
|
||||
salt varchar(255) not null,
|
||||
roles text default 'ROLE_GUEST' not null,
|
||||
roleId text default '0' not null,
|
||||
isActive tinyint(1) default 1 null
|
||||
)
|
||||
comment 'User File';
|
||||
|
|
0
lang/example.php
Normal file → Executable file
0
lang/example.php
Normal file → Executable file
0
public/.htaccess
Normal file → Executable file
0
public/.htaccess
Normal file → Executable file
0
public/content/.gitkeep
Normal file → Executable file
0
public/content/.gitkeep
Normal file → Executable file
0
public/theme/admin/css/admin-panel.css
Normal file → Executable file
0
public/theme/admin/css/admin-panel.css
Normal file → Executable file
0
public/theme/admin/css/login.css
Normal file → Executable file
0
public/theme/admin/css/login.css
Normal file → Executable file
0
public/theme/admin/css/style.css
Normal file → Executable file
0
public/theme/admin/css/style.css
Normal file → Executable file
0
public/theme/admin/icon-sprite.svg
Normal file → Executable file
0
public/theme/admin/icon-sprite.svg
Normal file → Executable file
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
0
public/theme/admin/images/logo.svg
Normal file → Executable file
0
public/theme/admin/images/logo.svg
Normal file → Executable file
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
0
public/theme/admin/js/components.js
Normal file → Executable file
0
public/theme/admin/js/components.js
Normal file → Executable file
0
public/theme/admin/js/components.min.js
vendored
Normal file → Executable file
0
public/theme/admin/js/components.min.js
vendored
Normal file → Executable file
0
public/theme/admin/js/scripts.js
Normal file → Executable file
0
public/theme/admin/js/scripts.js
Normal file → Executable file
0
public/theme/admin/js/scripts.min.js
vendored
Normal file → Executable file
0
public/theme/admin/js/scripts.min.js
vendored
Normal file → Executable file
0
public/theme/default/css/test.css
Normal file → Executable file
0
public/theme/default/css/test.css
Normal file → Executable file
0
public/theme/default/js/test.js
Normal file → Executable file
0
public/theme/default/js/test.js
Normal file → Executable file
6
src/Venom/Admin/AdminController.php
Normal file → Executable file
6
src/Venom/Admin/AdminController.php
Normal file → Executable file
|
@ -4,12 +4,12 @@
|
|||
namespace Venom\Admin;
|
||||
|
||||
|
||||
use Venom\Entities\RoleEntity;
|
||||
use Venom\Helper\URLHelper;
|
||||
use Venom\Security\Security;
|
||||
use Venom\Views\Asset;
|
||||
use Venom\Views\RenderController;
|
||||
use Venom\Views\VenomRenderer;
|
||||
use Venom\Models\User;
|
||||
use \Venom\Security\Security;
|
||||
|
||||
class AdminController implements RenderController
|
||||
|
||||
|
@ -29,7 +29,7 @@ class AdminController implements RenderController
|
|||
$this->tpl = 'async';
|
||||
}
|
||||
|
||||
$isLogin = Security::get()->hasRole(User::ADMIN_ROLE);
|
||||
$isLogin = Security::get()->hasPermission("admin", RoleEntity::TYPE_READ);
|
||||
$renderer->addVar('isLoggedIn', $isLogin);
|
||||
if (!$isLogin) {
|
||||
Asset::get()->addCSS('login', 'login.css');
|
||||
|
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Venom\Admin;
|
||||
|
||||
use Modules\Meta\MetaDataModule;
|
||||
use Modules\PageModule;
|
||||
use Modules\RoleModule;
|
||||
use Modules\SeoUrlModule;
|
||||
use Modules\User\UserModule;
|
||||
use Modules\VenomStatusModule;
|
||||
|
||||
class AdminModulesLoader
|
||||
{
|
||||
public static function getModules(): array
|
||||
{
|
||||
return [
|
||||
'metaData' => MetaDataModule::class,
|
||||
'pages' => PageModule::class,
|
||||
'role' => RoleModule::class,
|
||||
'seoUrl' => SeoUrlModule::class,
|
||||
'users' => UserModule::class,
|
||||
'venomStatus' => VenomStatusModule::class,
|
||||
];
|
||||
}
|
||||
}
|
19
src/Venom/Admin/AdminRouterInit.php
Normal file → Executable file
19
src/Venom/Admin/AdminRouterInit.php
Normal file → Executable file
|
@ -6,6 +6,7 @@ namespace Venom\Admin;
|
|||
|
||||
use Venom\Admin\Routes\LoginRoute;
|
||||
use Venom\Admin\Routes\TemplateLoader;
|
||||
use Venom\Routing\Route;
|
||||
use Venom\Routing\Router;
|
||||
use Venom\Venom;
|
||||
|
||||
|
@ -19,27 +20,19 @@ class AdminRouterInit
|
|||
public static function getRoutes(): array
|
||||
{
|
||||
return [
|
||||
'/login' => [
|
||||
'cl' => LoginRoute::class,
|
||||
'roles' => ['ROLE_GUEST'],
|
||||
'routes' => [
|
||||
'/login' => new Route(LoginRoute::class, [
|
||||
'*' => [
|
||||
"POST" => 'login'
|
||||
],
|
||||
'1' => [
|
||||
"GET" => 'handle'
|
||||
]
|
||||
]
|
||||
],
|
||||
'/templateLoader' => [
|
||||
'cl' => TemplateLoader::class,
|
||||
'roles' => ['ROLE_GUEST'],
|
||||
'routes' => [
|
||||
]),
|
||||
'/templateLoader' => new Route(TemplateLoader::class, [
|
||||
'*' => [
|
||||
"GET" => 'handle'
|
||||
]
|
||||
]
|
||||
]
|
||||
],
|
||||
]),
|
||||
];
|
||||
}
|
||||
}
|
4
src/Venom/Admin/Routes/LoginRoute.php
Normal file → Executable file
4
src/Venom/Admin/Routes/LoginRoute.php
Normal file → Executable file
|
@ -4,11 +4,9 @@
|
|||
namespace Venom\Admin\Routes;
|
||||
|
||||
|
||||
use Venom\Core\ArgumentHandler;
|
||||
use Venom\Routing\Route;
|
||||
use Venom\Security\Security;
|
||||
|
||||
class LoginRoute implements Route
|
||||
class LoginRoute
|
||||
{
|
||||
|
||||
public function login(): bool
|
||||
|
|
3
src/Venom/Admin/Routes/TemplateLoader.php
Normal file → Executable file
3
src/Venom/Admin/Routes/TemplateLoader.php
Normal file → Executable file
|
@ -6,9 +6,8 @@ namespace Venom\Admin\Routes;
|
|||
use Venom\Core\ArgumentHandler;
|
||||
use Venom\Core\Config;
|
||||
use Venom\Helper\TemplateUtil;
|
||||
use Venom\Routing\Route;
|
||||
|
||||
class TemplateLoader implements Route
|
||||
class TemplateLoader
|
||||
{
|
||||
public function handle(): bool
|
||||
{
|
||||
|
|
2
src/Venom/Controller/SeoController.php
Normal file → Executable file
2
src/Venom/Controller/SeoController.php
Normal file → Executable file
|
@ -6,7 +6,7 @@ namespace Venom\Controller;
|
|||
|
||||
use Venom\Core\ArgumentHandler;
|
||||
use Venom\Core\Config;
|
||||
use Venom\Core\DatabaseHandler;
|
||||
use Venom\Core\Database\DatabaseHandler;
|
||||
use Venom\Helper\ErrorHandler;
|
||||
use Venom\Helper\URLHelper;
|
||||
|
||||
|
|
3
src/Venom/Core/Config.php
Normal file → Executable file
3
src/Venom/Core/Config.php
Normal file → Executable file
|
@ -2,7 +2,8 @@
|
|||
|
||||
namespace Venom\Core;
|
||||
|
||||
use Venom\Models\ConfigObject;
|
||||
use Venom\Core\Database\DatabaseHandler;
|
||||
use Venom\Entities\ConfigObject;
|
||||
|
||||
class Config
|
||||
{
|
||||
|
|
102
src/Venom/Core/Database/Database.php
Executable file
102
src/Venom/Core/Database/Database.php
Executable file
|
@ -0,0 +1,102 @@
|
|||
<?php
|
||||
|
||||
namespace Venom\Core\Database;
|
||||
// class that hold the Database Connection! and Executes like the DatabaseHandler
|
||||
use PDO;
|
||||
use PDOException;
|
||||
use PDOStatement;
|
||||
use Venom\Entities\DatabaseObject;
|
||||
|
||||
class Database
|
||||
{
|
||||
// constants
|
||||
public const DB_TYPE = 'type';
|
||||
public const DB_HOST = 'host';
|
||||
public const DB_PORT = 'port';
|
||||
public const DB_USER = 'user';
|
||||
public const DB_PASSWORD = 'pw';
|
||||
public const DB_DB = 'db';
|
||||
public const DB_EXTRA = 'extra';
|
||||
private ?\PDO $db = null;
|
||||
|
||||
public function init(array $data): void
|
||||
{
|
||||
//init instance with the current data... only working if the db is not init!
|
||||
if ($this->db != null) {
|
||||
return;
|
||||
}
|
||||
$dsn = '%s:host=%s;dbname=%s;port=%s';
|
||||
$connectString = sprintf($dsn, $data[self::DB_TYPE], $data[self::DB_HOST], $data[self::DB_DB], $data[self::DB_PORT] . $data[self::DB_EXTRA]);
|
||||
try {
|
||||
$this->db = new PDO($connectString, $data[self::DB_USER], $data[self::DB_PASSWORD]);
|
||||
} catch (PDOException $e) {
|
||||
trigger_error($e->getMessage());
|
||||
die($e->getCode());
|
||||
}
|
||||
}
|
||||
|
||||
public function getOne(string|EasyQuery $query, array $args = []): ?DatabaseObject
|
||||
{
|
||||
$sql = $query;
|
||||
if ($query instanceof EasyQuery) {
|
||||
$sql = $query->getQuery();
|
||||
$args = $query->getArgs();
|
||||
}
|
||||
$data = $this->getAll($sql, $args);
|
||||
if (count($data) > 0) {
|
||||
return $data[0];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getAll(string|EasyQuery $query, array $args = []): array
|
||||
{
|
||||
$sql = $query;
|
||||
if ($query instanceof EasyQuery) {
|
||||
$sql = $query->getQuery();
|
||||
$args = $query->getArgs();
|
||||
}
|
||||
$stmt = $this->db->prepare($sql);
|
||||
$stmt->setFetchMode(PDO::FETCH_CLASS, DatabaseObject::class);
|
||||
$stmt->execute($args);
|
||||
return $stmt->fetchAll();
|
||||
}
|
||||
|
||||
public function execute(string|EasyQuery $query, array $args = []): bool
|
||||
{
|
||||
$sql = $query;
|
||||
if ($query instanceof EasyQuery) {
|
||||
$sql = $query->getQuery();
|
||||
$args = $query->getArgs();
|
||||
}
|
||||
$stmt = $this->db->prepare($sql);
|
||||
return $stmt->execute($args);
|
||||
}
|
||||
|
||||
public function createStatement($query): bool|PDOStatement
|
||||
{
|
||||
$stmt = $this->db->prepare($query);
|
||||
$stmt->setFetchMode(PDO::FETCH_CLASS, DatabaseObject::class); // set to default fetch-mode :D
|
||||
return $stmt;
|
||||
}
|
||||
|
||||
public function setClass($stmt, $class)
|
||||
{
|
||||
$stmt->setFetchMode(PDO::FETCH_CLASS, $class);
|
||||
}
|
||||
|
||||
public function start()
|
||||
{
|
||||
$this->db->beginTransaction();
|
||||
}
|
||||
|
||||
public function commit()
|
||||
{
|
||||
$this->db->commit();
|
||||
}
|
||||
|
||||
public function rollBack()
|
||||
{
|
||||
$this->db->rollBack();
|
||||
}
|
||||
}
|
38
src/Venom/Core/Database/DatabaseHandler.php
Executable file
38
src/Venom/Core/Database/DatabaseHandler.php
Executable file
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
namespace Venom\Core\Database;
|
||||
|
||||
class DatabaseHandler
|
||||
{
|
||||
private static ?DatabaseHandler $instance = null;
|
||||
private Database $db;
|
||||
private array $cache; //EntityManager Cache!
|
||||
|
||||
protected function __construct()
|
||||
{
|
||||
$this->db = new Database();
|
||||
}
|
||||
|
||||
public static function get(): Database
|
||||
{
|
||||
return self::getInstance()->db;
|
||||
}
|
||||
|
||||
public static function getInstance(): DatabaseHandler
|
||||
{
|
||||
if (self::$instance === null) {
|
||||
self::$instance = new DatabaseHandler();
|
||||
}
|
||||
return self::$instance;
|
||||
}
|
||||
|
||||
public static function getEntityManager($entityClass): EntityManager
|
||||
{
|
||||
$instance = self::getInstance();
|
||||
// i dont make sure this class exist because the user should do this ;)
|
||||
if (!isset($instance->cache[$entityClass])) {
|
||||
$instance->cache[$entityClass] = new EntityManager($entityClass, self::get());
|
||||
}
|
||||
return $instance->cache[$entityClass];
|
||||
}
|
||||
}
|
220
src/Venom/Core/Database/EasyQuery.php
Executable file
220
src/Venom/Core/Database/EasyQuery.php
Executable file
|
@ -0,0 +1,220 @@
|
|||
<?php
|
||||
|
||||
namespace Venom\Core\Database;
|
||||
|
||||
// the QueryBuilder is stupid! dont use it for Very Complex Queries because it's should do Entity Loading Easier :)
|
||||
class EasyQuery
|
||||
{
|
||||
const ORDER_ASC = 0;
|
||||
const ORDER_DESC = 1;
|
||||
const WHERE_AND = "AND";
|
||||
const WHERE_AND_NOT = "AND NOT";
|
||||
const WHERE_OR = "OR";
|
||||
const WHERE_OR_NOT = "OR NOT";
|
||||
const WHERE_NOT = "NOT";
|
||||
|
||||
private array $where = [];
|
||||
private array $args = [];
|
||||
private string $query = "";
|
||||
private int $limit = -1;
|
||||
private int $offset = 0;
|
||||
private string $whereStmt = "";
|
||||
private string $havingStmt = "";
|
||||
private array $order = [];
|
||||
private array $groupBy = [];
|
||||
private array $having = [];
|
||||
|
||||
public function __construct(private string $tableName, private array $fields = [])
|
||||
{
|
||||
}
|
||||
|
||||
public static function createSelect(array $fields, string $table): string
|
||||
{
|
||||
return "SELECT " . implode(", ", $fields) . " FROM " . $table;
|
||||
}
|
||||
|
||||
public function setWhere(string $statement): static
|
||||
{
|
||||
$this->whereStmt = $statement;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setHaving(string $statement): static
|
||||
{
|
||||
$this->havingStmt = $statement;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setLimit(int $limit): static
|
||||
{
|
||||
$this->limit = $limit;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setOffset(int $offset): static
|
||||
{
|
||||
$this->offset = $offset;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function addField($field, $as = ""): static
|
||||
{
|
||||
if ($as !== "") {
|
||||
$field .= " AS " . $as;
|
||||
}
|
||||
$this->fields[] = $field;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function addFields(array $fields): static
|
||||
{
|
||||
foreach ($fields as $field) {
|
||||
$this->fields[] = $field;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function where($key, $value, $type = "AND"): static
|
||||
{
|
||||
$this->where[] = [$key, $type];
|
||||
$this->args[":" . $key] = $value;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function having($key, $value, $type = "AND"): static
|
||||
{
|
||||
$this->having[] = [$key, $type];
|
||||
$this->args[":" . $key] = $value;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function orderBy(string $key, int $mode = self::ORDER_ASC): static
|
||||
{
|
||||
$this->order[] = $mode === self::ORDER_DESC ? $key . " DESC" : $key;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function groupBy(string $key): static
|
||||
{
|
||||
$this->groupBy[] = $key;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setArg($key, $value): static
|
||||
{
|
||||
$this->args[":" . $key] = $value;
|
||||
return $this;
|
||||
}
|
||||
|
||||
// returns a Query
|
||||
|
||||
public function addArgAndField($key, $value): static
|
||||
{
|
||||
$this->args[":" . $key] = $value;
|
||||
$this->fields[] = $key;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function buildSelect(): static
|
||||
{
|
||||
// we build an easyQuery Builder that can very easy stuff
|
||||
$query = self::createSelect($this->fields, $this->tableName);
|
||||
if (count($this->where) > 0) {
|
||||
$this->whereStmt = $this->parseStmt($this->where, $this->whereStmt);
|
||||
}
|
||||
if (count($this->having) > 0) {
|
||||
$this->havingStmt = $this->parseStmt($this->having, $this->havingStmt);
|
||||
}
|
||||
if ($this->whereStmt !== "") {
|
||||
$query .= " WHERE " . $this->whereStmt;
|
||||
}
|
||||
if (count($this->groupBy)) {
|
||||
$query .= " GROUP BY " . implode(", ", $this->groupBy);
|
||||
}
|
||||
if ($this->havingStmt !== "") {
|
||||
$query .= " HAVING " . $this->havingStmt;
|
||||
}
|
||||
if (count($this->order)) {
|
||||
$query .= " ORDER BY " . implode(", ", $this->order);
|
||||
}
|
||||
if ($this->offset > 0) {
|
||||
$query .= " OFFSET " . $this->offset;
|
||||
}
|
||||
if ($this->limit > 0) {
|
||||
$query .= " LIMIT " . $this->limit;
|
||||
}
|
||||
$this->query = $query;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function buildInsertQuery(): static
|
||||
{
|
||||
$query = "INSERT INTO " . $this->tableName;
|
||||
$joinedFields = implode(", ", $this->fields);
|
||||
$values = implode(", ", array_keys($this->args));
|
||||
$query .= "(" . $joinedFields . ") VALUES (" . $values . ")";
|
||||
$this->query = $query;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function buildUpdateQuery(): static
|
||||
{
|
||||
$query = "UPDATE " . $this->tableName . " SET ";
|
||||
$setFields = [];
|
||||
foreach ($this->fields as $field) {
|
||||
$setFields[] = $field . " = :" . $field;
|
||||
}
|
||||
$query .= implode(", ", $setFields);
|
||||
if (count($this->where) > 0) {
|
||||
$this->whereStmt = $this->parseStmt($this->where, $this->whereStmt);
|
||||
}
|
||||
if ($this->whereStmt !== "") {
|
||||
$query .= " WHERE " . $this->whereStmt;
|
||||
}
|
||||
$this->query = $query;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function buildDeleteQuery(): static
|
||||
{
|
||||
$query = "DELETE FROM " . $this->tableName;
|
||||
if (count($this->where) > 0) {
|
||||
$this->whereStmt = $this->parseStmt($this->where, $this->whereStmt);
|
||||
}
|
||||
if ($this->whereStmt !== "") {
|
||||
$query .= " WHERE " . $this->whereStmt;
|
||||
}
|
||||
$this->query = $query;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getQuery(): string
|
||||
{
|
||||
return $this->query;
|
||||
}
|
||||
|
||||
public function getArgs(): array
|
||||
{
|
||||
return $this->args;
|
||||
}
|
||||
|
||||
public function getFields(): array
|
||||
{
|
||||
return $this->fields;
|
||||
}
|
||||
|
||||
private function parseStmt($items, $default = ""): string
|
||||
{
|
||||
$query = $default;
|
||||
foreach ($items as $item) {
|
||||
if ($query !== "") {
|
||||
$query .= " " . $item[1] . " ";
|
||||
}
|
||||
if ($item[1] === self::WHERE_NOT && $query === "") {
|
||||
$query .= "NOT ";
|
||||
}
|
||||
$query .= $item[0] . " = :" . $item[0];
|
||||
}
|
||||
return $query;
|
||||
}
|
||||
}
|
127
src/Venom/Core/Database/Entity.php
Executable file
127
src/Venom/Core/Database/Entity.php
Executable file
|
@ -0,0 +1,127 @@
|
|||
<?php
|
||||
|
||||
namespace Venom\Core\Database;
|
||||
|
||||
// Entity has a Load and Save function!
|
||||
// The Entity needs to have a primary key... most of the time this is a id!
|
||||
use JsonSerializable;
|
||||
use RuntimeException;
|
||||
|
||||
abstract class Entity implements JsonSerializable
|
||||
{
|
||||
public static string $tableName = "";
|
||||
// make sure this exists!
|
||||
public int $id = -1;
|
||||
public string $primaryKey = "id";
|
||||
public array $loadedFields = [];
|
||||
public array $blackList = ["id"];
|
||||
// Please override this Property in the Class you implement the Abstract Class! this is needed to run the right SQL calls
|
||||
public ?array $fields = null;
|
||||
|
||||
// Override this if you want special fields :)
|
||||
|
||||
public function getFieldsToWrite(): array
|
||||
{
|
||||
if ($this->fields !== null) {
|
||||
return $this->fields;
|
||||
}
|
||||
$localBlacklist = array_merge(["primaryKey", "tableName", "loadedFields", "blackList", "fields"], $this->blackList);
|
||||
$allLoaded = in_array("*", $this->loadedFields);
|
||||
$vars = get_object_vars($this);
|
||||
foreach ($vars as $key => $var) {
|
||||
if (in_array($key, $localBlacklist)) {
|
||||
unset($vars[$key]);
|
||||
}
|
||||
}
|
||||
if (!$allLoaded) {
|
||||
foreach ($vars as $key => $var) {
|
||||
if (!in_array($var, $this->loadedFields)) {
|
||||
unset($vars[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
unset($vars[$this->primaryKey]);
|
||||
$this->fields = $vars;
|
||||
return $this->fields;
|
||||
}
|
||||
|
||||
public function save(): bool
|
||||
{
|
||||
$this->preSave();
|
||||
$primaryKey = $this->primaryKey;
|
||||
$fields = $this->removeEmptyFields($this->getFieldsToWrite());
|
||||
$query = new EasyQuery(static::$tableName);
|
||||
foreach ($fields as $key => $field) {
|
||||
$query->addArgAndField($key, $field);
|
||||
}
|
||||
if ($this->$primaryKey === "") {
|
||||
$query->buildInsertQuery();
|
||||
} else {
|
||||
$query->where($primaryKey, $this->$primaryKey)->buildUpdateQuery();
|
||||
}
|
||||
return DatabaseHandler::get()->execute($query);
|
||||
}
|
||||
|
||||
public function load($fields = ['*'], ?EasyQuery $query = null): static
|
||||
{
|
||||
if ($query === null) {
|
||||
$primaryKey = $this->primaryKey;
|
||||
$query = new EasyQuery(static::$tableName, $fields);
|
||||
$query->where($primaryKey, $this->$primaryKey)->setLimit(1)->buildSelect();
|
||||
|
||||
} else {
|
||||
$query->setLimit(1)->buildSelect();
|
||||
}
|
||||
|
||||
$item = DatabaseHandler::get()->getOne($query);
|
||||
if ($item === null) {
|
||||
return $this;
|
||||
}
|
||||
$lazy = $item->getData();
|
||||
$this->id = $item->id;
|
||||
foreach ($lazy as $key => $item) {
|
||||
$this->$key = $item;
|
||||
}
|
||||
$this->fields = null;
|
||||
$this->loadedFields = array_merge($this->loadedFields, $query->getFields());
|
||||
$this->postLoad();
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function __set($name, $value)
|
||||
{
|
||||
// Implement your own if you want to override this behaviour!
|
||||
throw new RuntimeException("Write to Property: $name that is not Available in the Entity!");
|
||||
}
|
||||
|
||||
public function delete()
|
||||
{
|
||||
$key = $this->primaryKey;
|
||||
$query = new EasyQuery(self::$tableName);
|
||||
$query->setArg($this->primaryKey, $this->$key)->buildDeleteQuery();
|
||||
DatabaseHandler::get()->execute($query->getQuery(), $query->getArgs());
|
||||
}
|
||||
|
||||
public function jsonSerialize(): array
|
||||
{
|
||||
return $this->getFieldsToWrite();
|
||||
}
|
||||
|
||||
public function preSave()
|
||||
{
|
||||
}
|
||||
|
||||
public function postLoad()
|
||||
{
|
||||
}
|
||||
|
||||
private function removeEmptyFields(array $vars): array
|
||||
{
|
||||
foreach ($vars as $name => $item) {
|
||||
if (empty($item) && $name != $this->primaryKey) {
|
||||
unset($vars[$name]);
|
||||
}
|
||||
}
|
||||
return $vars;
|
||||
}
|
||||
}
|
127
src/Venom/Core/Database/EntityManager.php
Executable file
127
src/Venom/Core/Database/EntityManager.php
Executable file
|
@ -0,0 +1,127 @@
|
|||
<?php
|
||||
|
||||
namespace Venom\Core\Database;
|
||||
|
||||
use Exception;
|
||||
|
||||
class EntityManager
|
||||
{
|
||||
/** @var Entity[] */
|
||||
private array $entities = [];
|
||||
|
||||
public function __construct(private string $classType, private Database $db)
|
||||
{
|
||||
}
|
||||
|
||||
public static function create($callable): EntityManager
|
||||
{
|
||||
return DatabaseHandler::getEntityManager($callable);
|
||||
}
|
||||
|
||||
public function createEntity()
|
||||
{
|
||||
$ent = new $this->classType;
|
||||
$this->entities[] = $ent;
|
||||
return $ent;
|
||||
}
|
||||
|
||||
public function addEntity(Entity $entity)
|
||||
{
|
||||
$this->entities[] = $entity;
|
||||
}
|
||||
|
||||
public function removeEntity(Entity $entity)
|
||||
{
|
||||
foreach ($this->entities as $key => $item) {
|
||||
if ($entity === $item) {
|
||||
unset($this->entities[$key]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function findBy($key, $value): ?Entity
|
||||
{
|
||||
foreach ($this->entities as $entity) {
|
||||
if ($entity->$key === $value) {
|
||||
return $entity;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function saveAll()
|
||||
{
|
||||
if (count($this->entities) === 0) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
$this->db->start();
|
||||
foreach ($this->entities as $entity) {
|
||||
$entity->save();
|
||||
}
|
||||
$this->db->commit();
|
||||
} catch (Exception $ex) {
|
||||
trigger_error($ex->getMessage());
|
||||
$this->db->rollBack();
|
||||
}
|
||||
}
|
||||
|
||||
public function deleteEntities()
|
||||
{
|
||||
try {
|
||||
$this->db->start();
|
||||
foreach ($this->entities as $entity) {
|
||||
$entity->delete();
|
||||
}
|
||||
$this->db->commit();
|
||||
} catch (Exception $ex) {
|
||||
trigger_error($ex->getMessage());
|
||||
$this->db->rollBack();
|
||||
}
|
||||
}
|
||||
|
||||
public function clearAll()
|
||||
{
|
||||
$this->entities = [];
|
||||
}
|
||||
|
||||
public function load(string|EasyQuery $query, $args = [], array $fields = ["*"])
|
||||
{
|
||||
$sql = $query;
|
||||
if ($query instanceof EasyQuery) {
|
||||
$query->buildSelect();
|
||||
$sql = $query->getQuery();
|
||||
$args = $query->getArgs();
|
||||
$fields = $query->getFields();
|
||||
}
|
||||
$stmt = $this->db->createStatement($sql);
|
||||
$this->db->setClass($stmt, $this->classType);
|
||||
if ($stmt->execute($args)) {
|
||||
/** @var Entity[] $all */
|
||||
$all = $stmt->fetchAll();
|
||||
foreach ($all as $item) {
|
||||
$item->loadedFields = $fields;
|
||||
$item->postLoad();
|
||||
$this->addEntity($item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function execute($query): bool
|
||||
{
|
||||
return $this->db->execute($query);
|
||||
}
|
||||
|
||||
public function getAll(): array
|
||||
{
|
||||
return $this->entities;
|
||||
}
|
||||
|
||||
private function addEntities(array $entities)
|
||||
{
|
||||
foreach ($entities as $entity) {
|
||||
$this->entities[] = $entity;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Venom\Core;
|
||||
|
||||
|
||||
use PDO;
|
||||
use PDOException;
|
||||
use Venom\Models\DatabaseObject;
|
||||
|
||||
/**
|
||||
* Singleton DatabaseHandler... make sure we only have one connection to the database..
|
||||
* @package Venom\Database
|
||||
*/
|
||||
class DatabaseHandler
|
||||
{
|
||||
// constants
|
||||
public const DB_TYPE = 'type';
|
||||
public const DB_HOST = 'host';
|
||||
public const DB_PORT = 'port';
|
||||
public const DB_USER = 'user';
|
||||
public const DB_PASSWORD = 'pw';
|
||||
public const DB_DB = 'db';
|
||||
public const DB_EXTRA = 'extra';
|
||||
private static ?self $instance = null;
|
||||
private ?PDO $db = null;
|
||||
|
||||
public static function get(): DatabaseHandler
|
||||
{
|
||||
if (self::$instance === null) {
|
||||
self::$instance = new self();
|
||||
}
|
||||
return self::$instance;
|
||||
}
|
||||
|
||||
public function init(array $data): void
|
||||
{
|
||||
//init instance with the current data... only working if the db is not init!
|
||||
if ($this->db != null) {
|
||||
return;
|
||||
}
|
||||
$dsn = '%s:host=%s;dbname=%s;port=%s';
|
||||
$connectString = sprintf($dsn, $data[self::DB_TYPE], $data[self::DB_HOST], $data[self::DB_DB], $data[self::DB_PORT] . $data[self::DB_EXTRA]);
|
||||
try {
|
||||
$this->db = new PDO($connectString, $data[self::DB_USER], $data[self::DB_PASSWORD]);
|
||||
} catch (PDOException $e) {
|
||||
trigger_error($e->getMessage());
|
||||
die($e->getCode());
|
||||
}
|
||||
}
|
||||
|
||||
public function getOne(string $query, array $args = []): ?DatabaseObject
|
||||
{
|
||||
$data = $this->getAll($query, $args);
|
||||
if (count($data) > 0) {
|
||||
return $data[0];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getAll(string $query, array $args = []): array
|
||||
{
|
||||
$stmt = $this->db->prepare($query);
|
||||
$stmt->setFetchMode(PDO::FETCH_CLASS, DatabaseObject::class);
|
||||
$stmt->execute($args);
|
||||
return $stmt->fetchAll();
|
||||
}
|
||||
|
||||
public function execute(string $query, array $args = []): bool
|
||||
{
|
||||
$stmt = $this->db->prepare($query);
|
||||
return $stmt->execute($args);
|
||||
}
|
||||
|
||||
// Returns a Select like this: SELECT id, name, ... FROM table || do what you want
|
||||
public static function createEasySelect(array $fields, string $table): string
|
||||
{
|
||||
return "SELECT " . implode(",", $fields) . " FROM " . $table;
|
||||
}
|
||||
|
||||
public static function getUpdateString(array $data, string $table, string $where): array
|
||||
{
|
||||
$string = [];
|
||||
$save = [];
|
||||
foreach ($data as $key => $value) {
|
||||
$k = ":" . strtolower($key);
|
||||
$string[] = $key . "= " . $k;
|
||||
$save[$k] = $value;
|
||||
}
|
||||
return ["UPDATE " . $table . " SET " . implode(",", $string) . " " . $where, $save];
|
||||
}
|
||||
}
|
5
src/Venom/Core/Language.php
Normal file → Executable file
5
src/Venom/Core/Language.php
Normal file → Executable file
|
@ -5,7 +5,8 @@ namespace Venom\Core;
|
|||
|
||||
|
||||
use RuntimeException;
|
||||
use Venom\Models\DatabaseObject;
|
||||
use Venom\Core\Database\DatabaseHandler;
|
||||
use Venom\Entities\DatabaseObject;
|
||||
|
||||
class Language
|
||||
{
|
||||
|
@ -20,7 +21,7 @@ class Language
|
|||
|
||||
public function initLang()
|
||||
{
|
||||
$lang = ArgumentHandler::get()->getItem("lang", $this->defaultLang->shortTag);
|
||||
$lang = ArgumentHandler::get()->getItem("lang", $this->defaultLang->shortTag ?? 'de');
|
||||
//check if language exists
|
||||
$data = DatabaseHandler::get()->getOne("select id from language where shortTag = :shortTag", [
|
||||
':shortTag' => $lang
|
||||
|
|
13
src/Venom/Core/Module.php
Normal file → Executable file
13
src/Venom/Core/Module.php
Normal file → Executable file
|
@ -3,18 +3,17 @@
|
|||
|
||||
namespace Venom\Core;
|
||||
|
||||
|
||||
use Venom\Venom;
|
||||
|
||||
interface Module
|
||||
{
|
||||
const NAME = "name";
|
||||
const AUTHOR = "author";
|
||||
const SECURE = "secure";
|
||||
const ROUTE = "routes";
|
||||
const ADMIN_ROUTE = "adminRoutes";
|
||||
const DESC = "description";
|
||||
|
||||
public function register(Venom $venom): bool;
|
||||
|
||||
public function init(): void;
|
||||
const TEMPLATES = "templates";
|
||||
const ADMIN_TEMPLATES = "adminTemplates";
|
||||
const CONTROLLER = "controllers";
|
||||
const TEMPLATE_PATH = "tplPath";
|
||||
const ACTIVE = "isActive";
|
||||
}
|
72
src/Venom/Core/ModuleLoader.php
Executable file
72
src/Venom/Core/ModuleLoader.php
Executable file
|
@ -0,0 +1,72 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Venom\Core;
|
||||
|
||||
use RuntimeException;
|
||||
use Venom\Helper\TemplateUtil;
|
||||
use Venom\Routing\Route;
|
||||
use Venom\Routing\Router;
|
||||
use Venom\Venom;
|
||||
|
||||
class ModuleLoader
|
||||
{
|
||||
public static function getModules(): array
|
||||
{
|
||||
return [
|
||||
'Meta',
|
||||
'User',
|
||||
'Data',
|
||||
'Role',
|
||||
'SEO',
|
||||
'VenomStatus',
|
||||
];
|
||||
}
|
||||
|
||||
public static function loadModule(string $name, Venom $venom)
|
||||
{
|
||||
// load module search in the Module Path for a module.php file
|
||||
$dir = __DIR__ . "/../../modules/" . $name . "/module.php";
|
||||
if (!file_exists($dir)) {
|
||||
throw new RuntimeException("Module File: \"$dir\" Not found");
|
||||
}
|
||||
include_once $dir;
|
||||
}
|
||||
|
||||
public static function initModule(array $module, Venom $venom): bool
|
||||
{
|
||||
if (!$module[Module::ACTIVE]) {
|
||||
return false;
|
||||
}
|
||||
// register Router, Templates and more :)
|
||||
$isAdmin = Config::getInstance()->isAdmin();
|
||||
if ($isAdmin) {
|
||||
self::registerRoutes($module,
|
||||
$venom,
|
||||
$module[Module::ADMIN_ROUTE],
|
||||
$venom->getRouter(Router::ADMIN_ROUTER)
|
||||
);
|
||||
TemplateUtil::getInstance()->addTemplates($module[Module::ADMIN_TEMPLATES], $module[Module::TEMPLATE_PATH]);
|
||||
} else {
|
||||
self::registerRoutes($module,
|
||||
$venom,
|
||||
$module[Module::ROUTE],
|
||||
$venom->getRouter(Router::DEFAULT_ROUTER)
|
||||
);
|
||||
TemplateUtil::getInstance()->addTemplates($module[Module::TEMPLATES], $module[Module::TEMPLATE_PATH]);
|
||||
}
|
||||
$venom->addControllers($module[Module::CONTROLLER]);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function registerRoutes(array $module, Venom $venom, array $routes, Router $router)
|
||||
{
|
||||
foreach ($routes as $key => $route) {
|
||||
/** @var Route $route */
|
||||
$route->module = $module[Module::NAME];
|
||||
$route->isSecure = $module[Module::SECURE];
|
||||
$route->venom = $venom;
|
||||
$router->addRoute($key, $route);
|
||||
}
|
||||
}
|
||||
}
|
0
src/Venom/Core/Registry.php
Normal file → Executable file
0
src/Venom/Core/Registry.php
Normal file → Executable file
3
src/Venom/Core/Setup.php
Normal file → Executable file
3
src/Venom/Core/Setup.php
Normal file → Executable file
|
@ -39,9 +39,6 @@ class Setup
|
|||
if (isset($modules)) {
|
||||
$venom->initModules($modules);
|
||||
}
|
||||
if (isset($controllers)) {
|
||||
$venom->initControllers($controllers);
|
||||
}
|
||||
}
|
||||
|
||||
public static function loadRouters(Venom $venom): void
|
||||
|
|
6
src/Venom/Models/ConfigObject.php → src/Venom/Entities/ConfigObject.php
Normal file → Executable file
6
src/Venom/Models/ConfigObject.php → src/Venom/Entities/ConfigObject.php
Normal file → Executable file
|
@ -1,10 +1,12 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Venom\Models;
|
||||
namespace Venom\Entities;
|
||||
|
||||
|
||||
class ConfigObject
|
||||
use Venom\Core\Database\Entity;
|
||||
|
||||
class ConfigObject extends Entity
|
||||
{
|
||||
private array $data = [];
|
||||
|
|
@ -1,10 +1,12 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Venom\Models;
|
||||
namespace Venom\Entities;
|
||||
|
||||
|
||||
class DataModel
|
||||
use Venom\Core\Database\Entity;
|
||||
|
||||
class DataEntity extends Entity
|
||||
{
|
||||
public const TYPE_CONTENT = 'content';
|
||||
public const TYPE_FORM = 'form';
|
12
src/Venom/Models/DatabaseObject.php → src/Venom/Entities/DatabaseObject.php
Normal file → Executable file
12
src/Venom/Models/DatabaseObject.php → src/Venom/Entities/DatabaseObject.php
Normal file → Executable file
|
@ -1,17 +1,16 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Venom\Models;
|
||||
namespace Venom\Entities;
|
||||
|
||||
|
||||
use JsonSerializable;
|
||||
use Venom\Core\Database\Entity;
|
||||
|
||||
/**
|
||||
* Database Object to use queries like this $obj->id, $obj->value
|
||||
* also the option to print it in csv format ; as delimiter
|
||||
* @package Venom\Database
|
||||
*/
|
||||
class DatabaseObject implements JsonSerializable
|
||||
class DatabaseObject extends Entity
|
||||
{
|
||||
private array $data = [];
|
||||
|
||||
|
@ -48,9 +47,4 @@ class DatabaseObject implements JsonSerializable
|
|||
{
|
||||
return $this->data;
|
||||
}
|
||||
|
||||
public function jsonSerialize(): array
|
||||
{
|
||||
return $this->data;
|
||||
}
|
||||
}
|
59
src/Venom/Entities/RoleEntity.php
Executable file
59
src/Venom/Entities/RoleEntity.php
Executable file
|
@ -0,0 +1,59 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Venom\Entities;
|
||||
|
||||
use Venom\Core\Database\EasyQuery;
|
||||
use Venom\Core\Database\Entity;
|
||||
|
||||
class RoleEntity extends Entity
|
||||
{
|
||||
public static string $tableName = "roles";
|
||||
public string $name = "";
|
||||
public string $content = "";
|
||||
public bool $isActive = true;
|
||||
private array $roles = [];
|
||||
|
||||
public const TYPE_WRITE = 1;
|
||||
public const TYPE_READ = 0;
|
||||
public const TYPE_NO = -1;
|
||||
|
||||
|
||||
public function hasPermission(string $module, int $type): bool
|
||||
{
|
||||
if ($this->id === -1) {
|
||||
return true;
|
||||
}
|
||||
if ($type === self::TYPE_NO) {
|
||||
return true;
|
||||
}
|
||||
if (!isset($this->roles[$module]) && $type) {
|
||||
return false;
|
||||
}
|
||||
$mod = $this->roles[$module];
|
||||
return $mod["type"] === $type;
|
||||
}
|
||||
|
||||
|
||||
public function postLoad()
|
||||
{
|
||||
if (!empty($this->content)) {
|
||||
$this->roles = json_decode($this->content);
|
||||
}
|
||||
}
|
||||
|
||||
public function preSave()
|
||||
{
|
||||
$this->content = json_encode($this->roles);
|
||||
}
|
||||
|
||||
public function load($fields = ['*'], ?EasyQuery $query = null): static
|
||||
{
|
||||
if ($this->id === -1 || $this->id === 0) {
|
||||
return $this;
|
||||
}
|
||||
return parent::load($fields, $query);
|
||||
}
|
||||
|
||||
|
||||
}
|
57
src/Venom/Entities/User.php
Executable file
57
src/Venom/Entities/User.php
Executable file
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Venom\Entities;
|
||||
|
||||
|
||||
use Venom\Core\Database\EasyQuery;
|
||||
use Venom\Core\Database\Entity;
|
||||
|
||||
class User extends Entity
|
||||
{
|
||||
public const ADMIN_ROLE = '-1';
|
||||
public const GUEST_ROLE = '0';
|
||||
|
||||
public static string $tableName = "users";
|
||||
public string $username = "GUEST";
|
||||
public string $firstname = "";
|
||||
public string $lastname = "";
|
||||
public string $email = "";
|
||||
public string $password = "";
|
||||
public string $token = "";
|
||||
public string $salt = "";
|
||||
public int $roleId = 0;
|
||||
public bool $isActive = true;
|
||||
private ?RoleEntity $roleEntity = null;
|
||||
private bool $loaded = false;
|
||||
|
||||
public function hasPermission(string $module, $type = RoleEntity::TYPE_WRITE): bool
|
||||
{
|
||||
if ($this->roleEntity === null) {
|
||||
$this->roleEntity = new RoleEntity();
|
||||
$this->roleEntity->id = $this->roleId;
|
||||
$this->roleEntity->load();
|
||||
}
|
||||
return $this->roleEntity->hasPermission($module, $type);
|
||||
}
|
||||
|
||||
public function postLoad()
|
||||
{
|
||||
$this->loaded = true;
|
||||
}
|
||||
|
||||
|
||||
public function isLoaded(): bool
|
||||
{
|
||||
return $this->loaded;
|
||||
}
|
||||
|
||||
public function loadUser()
|
||||
{
|
||||
$eq = new EasyQuery(User::$tableName, ["*"]);
|
||||
$eq->where("username", $this->username)
|
||||
->where("id", $this->id, EasyQuery::WHERE_OR);
|
||||
$this->load([], $eq);
|
||||
return true;
|
||||
}
|
||||
}
|
0
src/Venom/Exceptions/ExceptionHandler.php
Normal file → Executable file
0
src/Venom/Exceptions/ExceptionHandler.php
Normal file → Executable file
0
src/Venom/Helper/AdminHelper.php
Normal file → Executable file
0
src/Venom/Helper/AdminHelper.php
Normal file → Executable file
|
@ -4,7 +4,6 @@
|
|||
namespace Venom\Helper;
|
||||
|
||||
|
||||
use http\Exception\RuntimeException;
|
||||
use Venom\Core\ArgumentHandler;
|
||||
|
||||
class ErrorHandler
|
||||
|
|
0
src/Venom/Helper/MetaGenerator.php
Normal file → Executable file
0
src/Venom/Helper/MetaGenerator.php
Normal file → Executable file
25
src/Venom/Helper/TemplateUtil.php
Normal file → Executable file
25
src/Venom/Helper/TemplateUtil.php
Normal file → Executable file
|
@ -11,6 +11,7 @@ class TemplateUtil
|
|||
private static ?TemplateUtil $instance = null;
|
||||
private string $baseTemplate;
|
||||
private string $templateDir;
|
||||
private array $templates = [];
|
||||
|
||||
private function __construct()
|
||||
{
|
||||
|
@ -44,15 +45,31 @@ class TemplateUtil
|
|||
return $this->baseTemplate;
|
||||
}
|
||||
|
||||
public static function includeTemplate($template, $suffix = '.php')
|
||||
public function addTemplates($templates, string $basePath)
|
||||
{
|
||||
foreach ($templates as $key => $template) {
|
||||
$this->templates[$key] = $basePath . $template;
|
||||
}
|
||||
}
|
||||
|
||||
public static function includeTemplate($template, $suffix = '.php'): bool|string
|
||||
{
|
||||
$tx = self::getInstance()->getCache($template);
|
||||
if ($tx === "") {
|
||||
$dir = self::getInstance()->getDir();
|
||||
$template .= $suffix;
|
||||
if (file_exists($dir . $template)) {
|
||||
$tx = $dir . $template;
|
||||
}
|
||||
$tx .= $suffix;
|
||||
if (file_exists($tx)) {
|
||||
ob_start();
|
||||
include_once $dir . $template;
|
||||
include_once $tx;
|
||||
return ob_get_clean();
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
private function getCache($template)
|
||||
{
|
||||
return $this->templates[$template] ?? '';
|
||||
}
|
||||
}
|
0
src/Venom/Helper/URLHelper.php
Normal file → Executable file
0
src/Venom/Helper/URLHelper.php
Normal file → Executable file
|
@ -1,129 +0,0 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Venom\Models;
|
||||
|
||||
|
||||
use Venom\Core\DatabaseHandler;
|
||||
|
||||
class User
|
||||
{
|
||||
public const ADMIN_ROLE = 'ROLE_ADMIN';
|
||||
public const GUEST_ROLE = 'ROLE_GUEST';
|
||||
private string $username = 'GUEST';
|
||||
private string $email = 'GUEST';
|
||||
private string $firstname = '';
|
||||
private string $lastname = '';
|
||||
private string $password = '';
|
||||
private string $salt = '';
|
||||
private string $token = '';
|
||||
private string $id = '-1';
|
||||
private array $roles = [];
|
||||
private bool $isLoaded = false;
|
||||
|
||||
public function hasRole(string $role): bool
|
||||
{
|
||||
return in_array($role, $this->roles, true);
|
||||
}
|
||||
|
||||
public function loadUser(): bool
|
||||
{
|
||||
if (isset($_SESSION['userID']) || $this->username !== 'GUEST') {
|
||||
// try to load user from id!
|
||||
$user = DatabaseHandler::get()->getOne("SELECT * FROM users WHERE id = :id OR username = :name AND isActive = 1", [
|
||||
':id' => $_SESSION['userID'] ?? -1,
|
||||
':name' => $this->username
|
||||
]);
|
||||
if ($user !== null) {
|
||||
$this->username = $user->username ?? '';
|
||||
$this->email = $user->email ?? '';
|
||||
$this->password = $user->password ?? '';
|
||||
$this->token = $user->token ?? '';
|
||||
$this->salt = $user->salt ?? '';
|
||||
$this->id = $user->id ?? '-1';
|
||||
$this->roles = explode(',', $user->roles ?? '');
|
||||
$this->isLoaded = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getUsername(): string
|
||||
{
|
||||
return $this->username;
|
||||
}
|
||||
|
||||
public function setUsername(string $username): void
|
||||
{
|
||||
$this->username = $username;
|
||||
}
|
||||
|
||||
public function getEmail(): string
|
||||
{
|
||||
return $this->email;
|
||||
}
|
||||
|
||||
public function setEmail(string $email): void
|
||||
{
|
||||
$this->email = $email;
|
||||
}
|
||||
|
||||
public function getPassword(): string
|
||||
{
|
||||
return $this->password;
|
||||
}
|
||||
|
||||
public function setPassword(string $password): void
|
||||
{
|
||||
$this->password = $password;
|
||||
}
|
||||
|
||||
public function getSalt(): string
|
||||
{
|
||||
return $this->salt;
|
||||
}
|
||||
|
||||
public function setSalt(string $salt): void
|
||||
{
|
||||
$this->salt = $salt;
|
||||
}
|
||||
|
||||
public function getToken(): string
|
||||
{
|
||||
return $this->token;
|
||||
}
|
||||
|
||||
public function setToken(string $token): void
|
||||
{
|
||||
$this->token = $token;
|
||||
}
|
||||
|
||||
public function getRoles(): array
|
||||
{
|
||||
return $this->roles;
|
||||
}
|
||||
|
||||
public function setRoles(array $roles): void
|
||||
{
|
||||
$this->roles = $roles;
|
||||
}
|
||||
|
||||
public function addRole($value): void
|
||||
{
|
||||
if (!in_array($value, $this->roles, true)) {
|
||||
$this->roles[] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
public function isLoaded(): bool
|
||||
{
|
||||
return $this->isLoaded;
|
||||
}
|
||||
|
||||
public function getId(): string
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
}
|
44
src/Venom/Routing/Route.php
Normal file → Executable file
44
src/Venom/Routing/Route.php
Normal file → Executable file
|
@ -4,7 +4,47 @@
|
|||
namespace Venom\Routing;
|
||||
|
||||
|
||||
interface Route
|
||||
{
|
||||
use RuntimeException;
|
||||
use Venom\Entities\RoleEntity;
|
||||
use Venom\Security\Security;
|
||||
use Venom\Venom;
|
||||
|
||||
class Route
|
||||
{
|
||||
const GET = "GET";
|
||||
const POST = "POST";
|
||||
const PUT = "PUT";
|
||||
const DELETE = "DELETE";
|
||||
|
||||
public string $url;
|
||||
public array $routes = [];
|
||||
public int $maxParameters = 0;
|
||||
public string $module = "unknown";
|
||||
public bool $isSecure = false;
|
||||
public Venom $venom;
|
||||
|
||||
public function __construct(public string $controller, array $config)
|
||||
{
|
||||
$count = count($config);
|
||||
if ($count === 0) {
|
||||
throw new RuntimeException("Route: \"$controller\" no valid Routes Found!");
|
||||
}
|
||||
$count -= isset($config["*"]) ? 1 : 0;
|
||||
$this->maxParameters = $count;
|
||||
$this->routes = $config;
|
||||
}
|
||||
|
||||
public function getDefinitions($method, mixed $subRoute): ?array
|
||||
{
|
||||
if ($this->isSecure && !Security::get()->hasPermission($this->module, $method === Route::GET ? RoleEntity::TYPE_READ : RoleEntity::TYPE_WRITE)) {
|
||||
return null;
|
||||
}
|
||||
if (isset($this->routes[$subRoute]) && isset($this->routes[$subRoute][$method])) {
|
||||
return [
|
||||
"cl" => $this->controller,
|
||||
"fnc" => $this->routes[$subRoute][$method]
|
||||
];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
39
src/Venom/Routing/Router.php
Normal file → Executable file
39
src/Venom/Routing/Router.php
Normal file → Executable file
|
@ -5,10 +5,7 @@ namespace Venom\Routing;
|
|||
|
||||
|
||||
use Exception;
|
||||
use Venom\Core\Config;
|
||||
use Venom\Exceptions\ExceptionHandler;
|
||||
use Venom\Models\User;
|
||||
use Venom\Security\Security;
|
||||
|
||||
class Router
|
||||
{
|
||||
|
@ -31,7 +28,7 @@ class Router
|
|||
$this->routes = array_merge($this->routes, $routes);
|
||||
}
|
||||
|
||||
public function addRoute(string $path, array $route): void
|
||||
public function addRoute(string $path, Route $route): void
|
||||
{
|
||||
$this->routes[$path] = $route;
|
||||
}
|
||||
|
@ -58,9 +55,9 @@ class Router
|
|||
return null;
|
||||
}
|
||||
|
||||
private function removeIfFirst($rawString, $string)
|
||||
private function removeIfFirst($rawString, $string): bool|string
|
||||
{
|
||||
if ($string !== '' && 0 === strpos($rawString, $string)) {
|
||||
if ($string !== '' && str_starts_with($rawString, $string)) {
|
||||
return substr($rawString, strlen($string));
|
||||
}
|
||||
return $rawString;
|
||||
|
@ -68,24 +65,15 @@ class Router
|
|||
|
||||
private function getRouteByName($url, $method, $subRoute = '*', $params = []): ?array
|
||||
{
|
||||
if (isset($this->routes[$url])
|
||||
&& isset($this->routes[$url]['routes'])
|
||||
&& isset($this->routes[$url]['routes'][$subRoute])
|
||||
&& isset($this->routes[$url]['routes'][$subRoute][$method])
|
||||
) {
|
||||
if ((Config::getInstance()->getSecurity()->useSecurity || $this->id === self::ADMIN_ROUTER)
|
||||
&& isset($this->routes[$url]['roles'])
|
||||
) {
|
||||
$roles = $this->routes[$url]['roles'];
|
||||
if (!in_array(User::GUEST_ROLE, $roles, true) && !Security::get()->hasRoles($roles)) {
|
||||
if (isset($this->routes[$url])) {
|
||||
/** @var Route $route */
|
||||
$route = $this->routes[$url];
|
||||
$sub = $route->getDefinitions($method, $subRoute);
|
||||
if ($sub === null) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return [
|
||||
'cl' => $this->routes[$url]['cl'],
|
||||
'fnc' => $this->routes[$url]['routes'][$subRoute][$method],
|
||||
'params' => $params
|
||||
];
|
||||
$sub["params"] = array_reverse($params);
|
||||
return $sub;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
@ -128,9 +116,14 @@ class Router
|
|||
}
|
||||
}
|
||||
|
||||
private function removeTrailingSlash(string $rawString)
|
||||
private function removeTrailingSlash(string $rawString): bool|string
|
||||
{
|
||||
$len = strlen($rawString);
|
||||
return $rawString[$len - 1] === '/' ? substr($rawString, 0, strlen($rawString) - 1) : $rawString;
|
||||
}
|
||||
|
||||
public function getId(): string
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
}
|
10
src/Venom/Security/BaseLogin.php
Normal file → Executable file
10
src/Venom/Security/BaseLogin.php
Normal file → Executable file
|
@ -6,8 +6,8 @@ namespace Venom\Security;
|
|||
|
||||
use Venom\Core\ArgumentHandler;
|
||||
use Venom\Core\Config;
|
||||
use Venom\Entities\User;
|
||||
use Venom\Helper\URLHelper;
|
||||
use Venom\Models\User;
|
||||
|
||||
/**
|
||||
* Class that Login stupid via Password, Username
|
||||
|
@ -42,14 +42,14 @@ class BaseLogin implements Login
|
|||
public function login(): bool
|
||||
{
|
||||
$sec = Config::getInstance()->getSecurity();
|
||||
$this->user->setUsername(ArgumentHandler::get()->getPostItem('USERNAME'));
|
||||
$this->user->username = (string)ArgumentHandler::get()->getPostItem('USERNAME');
|
||||
if (!$this->user->loadUser()) {
|
||||
return false;
|
||||
}
|
||||
$secret = $sec->secret ?? 'venom';
|
||||
$hashed = hash($sec->algo ?? 'SHA256', ArgumentHandler::get()->getPostItem('PASSWORD') . $secret . $this->user->getSalt());
|
||||
if ($this->user->getPassword() === $hashed) {
|
||||
$_SESSION['userID'] = $this->user->getId();
|
||||
$hashed = hash($sec->algo ?? 'SHA256', ArgumentHandler::get()->getPostItem('PASSWORD') . $secret . $this->user->salt);
|
||||
if ($this->user->password === $hashed) {
|
||||
$_SESSION['userID'] = $this->user->id;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
2
src/Venom/Security/Login.php
Normal file → Executable file
2
src/Venom/Security/Login.php
Normal file → Executable file
|
@ -4,7 +4,7 @@
|
|||
namespace Venom\Security;
|
||||
|
||||
|
||||
use Venom\Models\User;
|
||||
use Venom\Entities\User;
|
||||
|
||||
interface Login
|
||||
{
|
||||
|
|
22
src/Venom/Security/Security.php
Normal file → Executable file
22
src/Venom/Security/Security.php
Normal file → Executable file
|
@ -3,9 +3,10 @@
|
|||
|
||||
namespace Venom\Security;
|
||||
|
||||
use \RuntimeException;
|
||||
use RuntimeException;
|
||||
use Venom\Core\Config;
|
||||
use Venom\Models\User;
|
||||
use Venom\Entities\RoleEntity;
|
||||
use Venom\Entities\User;
|
||||
|
||||
class Security
|
||||
{
|
||||
|
@ -15,7 +16,8 @@ class Security
|
|||
public function __construct()
|
||||
{
|
||||
$this->user = new User();
|
||||
$this->user->loadUser();
|
||||
$this->user->id = $_SESSION['userID'] ?? "-1";
|
||||
$this->user->load();
|
||||
}
|
||||
|
||||
public static function get(): Security
|
||||
|
@ -26,19 +28,9 @@ class Security
|
|||
return self::$instance;
|
||||
}
|
||||
|
||||
public function hasRole(string $role): bool
|
||||
public function hasPermission(string $module, $type = RoleEntity::TYPE_WRITE): bool
|
||||
{
|
||||
return $this->user->hasRole($role);
|
||||
}
|
||||
|
||||
public function hasRoles(array $roles): bool
|
||||
{
|
||||
foreach ($roles as $role) {
|
||||
if (!$this->user->hasRole($role)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
return $this->user->hasPermission($module, $type);
|
||||
}
|
||||
|
||||
public function login(): void
|
||||
|
|
|
@ -5,11 +5,11 @@ namespace Venom;
|
|||
|
||||
|
||||
use Venom\Admin\AdminController;
|
||||
use Venom\Admin\AdminModulesLoader;
|
||||
use Venom\Admin\AdminRouterInit;
|
||||
use Venom\Core\ArgumentHandler;
|
||||
use Venom\Core\Config;
|
||||
use Venom\Core\Module;
|
||||
use Venom\Core\ModuleLoader;
|
||||
use Venom\Core\Registry;
|
||||
use Venom\Exceptions\ExceptionHandler;
|
||||
use Venom\Helper\ErrorHandler;
|
||||
|
@ -117,28 +117,32 @@ class Venom
|
|||
public function initModules(array $modules): void
|
||||
{
|
||||
if (Config::getInstance()->isAdmin()) {
|
||||
$modules = array_merge(AdminModulesLoader::getModules(), $modules);
|
||||
}
|
||||
foreach ($modules as $key => $moduleClass) {
|
||||
$module = new $moduleClass;
|
||||
if ($module instanceof Module && $module->register($this)) {
|
||||
$this->modules[$key] = $module;
|
||||
$modules = array_merge(ModuleLoader::getModules(), $modules);
|
||||
}
|
||||
foreach ($modules as $module) {
|
||||
ModuleLoader::loadModule($module, $this);
|
||||
}
|
||||
}
|
||||
|
||||
public function initControllers(array $controllers): void
|
||||
public function addControllers(array $controllers): void
|
||||
{
|
||||
$this->controllers = $controllers;
|
||||
$this->controllers = array_merge($this->controllers, $controllers);
|
||||
}
|
||||
|
||||
public function addRouter(string $name, Router $router): void
|
||||
public function addRouter(Router $router): void
|
||||
{
|
||||
$this->routers[$name] = $router;
|
||||
$this->routers[$router->getId()] = $router;
|
||||
}
|
||||
|
||||
public function getRouter(string $router): ?Router
|
||||
{
|
||||
return $this->routers[$router];
|
||||
}
|
||||
|
||||
public function registerModule(array $module)
|
||||
{
|
||||
if (ModuleLoader::initModule($module, $this)) {
|
||||
$this->modules[$module[Module::NAME]] = $module;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,9 +3,9 @@
|
|||
|
||||
namespace Venom\Views;
|
||||
|
||||
use \RuntimeException;
|
||||
use RuntimeException;
|
||||
use Venom\Core\DatabaseHandler;
|
||||
use Venom\Models\DataModel;
|
||||
use Venom\Entities\DataEntity;
|
||||
|
||||
class DataLoader
|
||||
{
|
||||
|
@ -23,7 +23,7 @@ class DataLoader
|
|||
return self::$instance;
|
||||
}
|
||||
|
||||
public static function loadById(string $id): ?DataModel
|
||||
public static function loadById(string $id): ?DataEntity
|
||||
{
|
||||
if ($id === '') {
|
||||
throw new RuntimeException('Try to Load empty ID from Database');
|
||||
|
@ -33,14 +33,14 @@ class DataLoader
|
|||
]);
|
||||
|
||||
if ($data !== null) {
|
||||
$model = new DataModel($data->identity, $data->datatype, $data->raw, $data->generated);
|
||||
$model = new DataEntity($data->identity, $data->datatype, $data->raw, $data->generated);
|
||||
$model->setActive(true);
|
||||
return $model;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function updateData(DataModel $model): bool
|
||||
public function updateData(DataEntity $model): bool
|
||||
{
|
||||
if ($model->getId() === '') {
|
||||
return $this->insertData($model);
|
||||
|
@ -57,7 +57,7 @@ class DataLoader
|
|||
);
|
||||
}
|
||||
|
||||
public function insertData(DataModel $model): bool
|
||||
public function insertData(DataEntity $model): bool
|
||||
{
|
||||
|
||||
$this->validateModel($model);
|
||||
|
@ -73,7 +73,7 @@ class DataLoader
|
|||
);
|
||||
}
|
||||
|
||||
private function validateModel(DataModel $model): void
|
||||
private function validateModel(DataEntity $model): void
|
||||
{
|
||||
if ($model->getId() === '') {
|
||||
$model->setId($this->generateID());
|
||||
|
|
0
src/Venom/Views/RenderController.php
Normal file → Executable file
0
src/Venom/Views/RenderController.php
Normal file → Executable file
0
src/modules/.gitkeep
Normal file → Executable file
0
src/modules/.gitkeep
Normal file → Executable file
13
src/modules/Data/Controller/DataController.php
Normal file
13
src/modules/Data/Controller/DataController.php
Normal file
|
@ -0,0 +1,13 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Modules\Data\Controller;
|
||||
|
||||
|
||||
class DataController
|
||||
{
|
||||
public function get()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
34
src/modules/Data/module.php
Executable file
34
src/modules/Data/module.php
Executable file
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
use Modules\Data\Controller\DataController;
|
||||
use Venom\Core\Module;
|
||||
use Venom\Routing\Route;
|
||||
|
||||
|
||||
$venom = $venom ?? die();
|
||||
$venom->registerModule([
|
||||
Module::ACTIVE => true,
|
||||
Module::NAME => 'DataModule',
|
||||
Module::DESC => 'Data Module for Content every',
|
||||
Module::AUTHOR => 'VstZ dev',
|
||||
// NEED TO CHECK RIGHTS? :D IF FALSE WRITE IS ALWAYS ALLOWED ALSO READ!
|
||||
Module::SECURE => true,
|
||||
Module::ROUTE => [],
|
||||
Module::ADMIN_ROUTE => [
|
||||
'/data' => new Route(DataController::class, [
|
||||
"*" => [
|
||||
Route::GET => 'get'
|
||||
]
|
||||
])
|
||||
],
|
||||
Module::TEMPLATE_PATH => __DIR__ . "/tpl/",
|
||||
Module::TEMPLATES => [
|
||||
|
||||
],
|
||||
Module::ADMIN_TEMPLATES => [
|
||||
|
||||
],
|
||||
Module::CONTROLLER => [
|
||||
|
||||
]
|
||||
]);
|
2
src/modules/Meta/Controller/MetaAPIController.php
Normal file → Executable file
2
src/modules/Meta/Controller/MetaAPIController.php
Normal file → Executable file
|
@ -16,7 +16,7 @@ class MetaAPIController
|
|||
|
||||
public function getById($id)
|
||||
{
|
||||
AdminHelper::sendResponse(MetaController::getById($id));
|
||||
AdminHelper::sendResponse(SeoUrlController::getById($id));
|
||||
}
|
||||
|
||||
public function update($id)
|
||||
|
|
0
src/modules/Meta/Controller/MetaController.php
Normal file → Executable file
0
src/modules/Meta/Controller/MetaController.php
Normal file → Executable file
|
@ -1,79 +0,0 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Modules\Meta;
|
||||
|
||||
use Modules\Meta\Controller\MetaAPIController;
|
||||
use Venom\Core\Config;
|
||||
use Venom\Core\Module;
|
||||
use Venom\Helper\AdminHelper;
|
||||
use Venom\Routing\Route;
|
||||
use Venom\Routing\Router;
|
||||
use Venom\Venom;
|
||||
|
||||
class MetaDataModule 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([
|
||||
'/metaData' => [
|
||||
'cl' => MetaAPIController::class,
|
||||
'roles' => ['ROLE_ADMIN'],
|
||||
'routes' => [
|
||||
'*' => [
|
||||
"GET" => 'get',
|
||||
],
|
||||
'1' => [
|
||||
"GET" => 'getById',
|
||||
"POST" => 'update',
|
||||
"PUT" => 'insert',
|
||||
"DELETE" => 'delete'
|
||||
]
|
||||
]
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
public function get()
|
||||
{
|
||||
AdminHelper::sendResponse([
|
||||
'metaData' => [
|
||||
['id' => 1, 'name' => 'engineertrooper', 'icon' => 'vt-edit'],
|
||||
['id' => 2, 'name' => 'versustunez', 'icon' => 'vt-edit']
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
public function update(): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function insert(): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getById($id)
|
||||
{
|
||||
AdminHelper::sendResponse([
|
||||
'caseName' => 'ROLE_ADMIN',
|
||||
'id' => $id,
|
||||
'name' => 'Admin',
|
||||
'icon' => 'vt-visibility',
|
||||
]);
|
||||
}
|
||||
}
|
43
src/modules/Meta/module.php
Normal file → Executable file
43
src/modules/Meta/module.php
Normal file → Executable file
|
@ -1,22 +1,41 @@
|
|||
<?php
|
||||
|
||||
use Modules\Meta\Controller\MetaAPIController;
|
||||
use Venom\Core\Module;
|
||||
use Venom\Routing\Route;
|
||||
|
||||
/*$module = [
|
||||
|
||||
$venom = $venom ?? die();
|
||||
$venom->registerModule([
|
||||
Module::ACTIVE => true,
|
||||
Module::NAME => 'MetaModule',
|
||||
Module::DESC => 'Meta Data Module for SEO',
|
||||
Module::AUTHOR => 'VstZ dev',
|
||||
// NEED TO CHECK RIGHTS? :D IF FALSE WRITE IS ALWAYS ALLOWED ALSO READ!
|
||||
Module::SECURE => true,
|
||||
MODULE::ROUTE => [
|
||||
'/'
|
||||
Module::ROUTE => [],
|
||||
Module::ADMIN_ROUTE => [
|
||||
'/metaData' => new Route(MetaAPIController::class, [
|
||||
"*" => [
|
||||
Route::GET => 'get'
|
||||
],
|
||||
MODULE::TEMPLATES => [
|
||||
// Include Templates with shorter names! $render->include("meta_roles")
|
||||
'meta_roles' => 'PATH_TO_TEMPLATE'
|
||||
],
|
||||
MODULE::ADMIN_TEMPLATES => [
|
||||
//
|
||||
"1" => [
|
||||
Route::GET => 'getById',
|
||||
Route::POST => 'update',
|
||||
Route::PUT => 'insert',
|
||||
Route::DELETE => 'delete'
|
||||
]
|
||||
];
|
||||
$venom = $venom ?? die();
|
||||
$venom->registerModule($module);*/
|
||||
])
|
||||
],
|
||||
Module::TEMPLATE_PATH => __DIR__ . "/tpl/",
|
||||
Module::TEMPLATES => [
|
||||
// Include Templates with shorter names! $render->include("meta_roles")
|
||||
//'meta_roles' => 'PATH_TO_TEMPLATE_FROM_TEMPLATE_PATH'
|
||||
],
|
||||
Module::ADMIN_TEMPLATES => [
|
||||
//
|
||||
],
|
||||
Module::CONTROLLER => [
|
||||
|
||||
]
|
||||
]);
|
|
@ -1,85 +0,0 @@
|
|||
<?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 PageModule 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([
|
||||
'/pages' => [
|
||||
'cl' => PageModule::class,
|
||||
'roles' => ['ROLE_ADMIN'],
|
||||
'routes' => [
|
||||
'*' => [
|
||||
"GET" => 'get',
|
||||
],
|
||||
'1' => [
|
||||
"GET" => 'getById',
|
||||
"POST" => 'update',
|
||||
"PUT" => 'insert',
|
||||
]
|
||||
]
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
public function get()
|
||||
{
|
||||
AdminHelper::sendResponse([
|
||||
'pages' => [
|
||||
['id' => 1, 'name' => 'Flamingos going wild!', 'icon' => 'vt-edit'],
|
||||
['id' => 2, 'name' => 'Turbinen sind geil.', 'icon' => 'vt-edit'],
|
||||
['id' => 3, 'name' => 'Aufbau und Umbau des neuen VENOMs Plugins', 'icon' => 'vt-edit'],
|
||||
['id' => 4, 'name' => 'Aber Mama hat gesagt!', 'icon' => 'vt-edit'],
|
||||
['id' => 5, 'name' => 'Frische Fische nur heute!', 'icon' => 'vt-edit']
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
public function update(): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function insert(): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getById($id)
|
||||
{
|
||||
AdminHelper::sendResponse([
|
||||
'caseName' => 'ROLE_ADMIN',
|
||||
'id' => $id,
|
||||
'name' => 'Admin',
|
||||
'icon' => 'vt-visibility',
|
||||
'users' => [
|
||||
['value' => 1, 'name' => 'engineertrooper', 'icon' => 'vt-edit'],
|
||||
['value' => 2, 'name' => 'versustunez', 'icon' => 'vt-edit']
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
21
src/modules/Role/Controller/RoleController.php
Normal file
21
src/modules/Role/Controller/RoleController.php
Normal file
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Modules\Role\Controller;
|
||||
|
||||
|
||||
use Venom\Helper\AdminHelper;
|
||||
|
||||
class RoleController
|
||||
{
|
||||
public function get()
|
||||
{
|
||||
AdminHelper::sendResponse([
|
||||
'roles' => [
|
||||
['id' => 1, 'name' => 'Admin', 'icon' => 'vt-visibility'],
|
||||
['id' => 2, 'name' => 'Moderator', 'icon' => 'vt-edit'],
|
||||
['id' => 3, 'name' => 'Gast', 'icon' => 'vt-edit'],
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
34
src/modules/Role/module.php
Executable file
34
src/modules/Role/module.php
Executable file
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
use Modules\Role\Controller\RoleController;
|
||||
use Venom\Core\Module;
|
||||
use Venom\Routing\Route;
|
||||
|
||||
|
||||
$venom = $venom ?? die();
|
||||
$venom->registerModule([
|
||||
Module::ACTIVE => true,
|
||||
Module::NAME => 'RoleModule',
|
||||
Module::DESC => 'Role Management',
|
||||
Module::AUTHOR => 'VstZ dev',
|
||||
// NEED TO CHECK RIGHTS? :D IF FALSE WRITE IS ALWAYS ALLOWED ALSO READ!
|
||||
Module::SECURE => true,
|
||||
Module::ROUTE => [],
|
||||
Module::ADMIN_ROUTE => [
|
||||
'/roles' => new Route(RoleController::class, [
|
||||
"*" => [
|
||||
Route::GET => 'get'
|
||||
]
|
||||
])
|
||||
],
|
||||
Module::TEMPLATE_PATH => __DIR__ . "/tpl/",
|
||||
Module::TEMPLATES => [
|
||||
|
||||
],
|
||||
Module::ADMIN_TEMPLATES => [
|
||||
|
||||
],
|
||||
Module::CONTROLLER => [
|
||||
|
||||
]
|
||||
]);
|
|
@ -1,81 +0,0 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Modules;
|
||||
|
||||
|
||||
use Venom\Core\Config;
|
||||
use Venom\Core\DatabaseHandler;
|
||||
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()
|
||||
{
|
||||
//$req = DatabaseHandler::get()->getAll("SELECT * FROM roles");
|
||||
AdminHelper::sendResponse([
|
||||
'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::sendResponse([
|
||||
'caseName' => 'ROLE_ADMIN',
|
||||
'id' => $id,
|
||||
'name' => 'Admin',
|
||||
'icon' => 'vt-visibility'
|
||||
]);
|
||||
}
|
||||
}
|
18
src/modules/SEO/Controller/SeoUrlController.php
Executable file
18
src/modules/SEO/Controller/SeoUrlController.php
Executable file
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Modules\SEO\Controller;
|
||||
|
||||
|
||||
class SeoUrlController
|
||||
{
|
||||
public static function get(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
public static function getById($id): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
40
src/modules/SEO/module.php
Executable file
40
src/modules/SEO/module.php
Executable file
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
use Modules\SEO\Controller\SeoUrlController;
|
||||
use Venom\Core\Module;
|
||||
use Venom\Routing\Route;
|
||||
|
||||
|
||||
$venom = $venom ?? die();
|
||||
$venom->registerModule([
|
||||
Module::ACTIVE => true,
|
||||
Module::NAME => 'SeoModule',
|
||||
Module::DESC => 'SEO Management for beautiful URLs',
|
||||
Module::AUTHOR => 'VstZ dev',
|
||||
// NEED TO CHECK RIGHTS? :D IF FALSE WRITE IS ALWAYS ALLOWED ALSO READ!
|
||||
Module::SECURE => true,
|
||||
Module::ROUTE => [],
|
||||
Module::ADMIN_ROUTE => [
|
||||
'/seoUrl' => new Route(SeoUrlController::class, [
|
||||
"*" => [
|
||||
Route::GET => 'get'
|
||||
],
|
||||
"1" => [
|
||||
Route::GET => 'getById',
|
||||
Route::POST => 'update',
|
||||
Route::PUT => 'insert',
|
||||
Route::DELETE => 'delete'
|
||||
]
|
||||
])
|
||||
],
|
||||
Module::TEMPLATE_PATH => __DIR__ . "/tpl/",
|
||||
Module::TEMPLATES => [
|
||||
|
||||
],
|
||||
Module::ADMIN_TEMPLATES => [
|
||||
|
||||
],
|
||||
Module::CONTROLLER => [
|
||||
|
||||
]
|
||||
]);
|
|
@ -1,81 +0,0 @@
|
|||
<?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 SeoUrlModule 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([
|
||||
'/seoUrl' => [
|
||||
'cl' => SeoUrlModule::class,
|
||||
'roles' => ['ROLE_ADMIN'],
|
||||
'routes' => [
|
||||
'*' => [
|
||||
"GET" => 'get',
|
||||
],
|
||||
'1' => [
|
||||
"GET" => 'getById',
|
||||
"POST" => 'update',
|
||||
"PUT" => 'insert',
|
||||
]
|
||||
]
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
public function get()
|
||||
{
|
||||
AdminHelper::sendResponse([
|
||||
'pages' => [
|
||||
['id' => 1, 'name' => 'Flamingos going wild!', 'icon' => 'vt-edit'],
|
||||
['id' => 2, 'name' => 'Turbinen sind geil.', 'icon' => 'vt-edit'],
|
||||
['id' => 3, 'name' => 'Aufbau und Umbau des neuen VENOMs Plugins', 'icon' => 'vt-edit'],
|
||||
['id' => 4, 'name' => 'Aber Mama hat gesagt!', 'icon' => 'vt-edit'],
|
||||
['id' => 5, 'name' => 'Frische Fische nur heute!', 'icon' => 'vt-edit']
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
public function update(): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function insert(): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getById($id)
|
||||
{
|
||||
AdminHelper::sendResponse([
|
||||
'caseName' => 'ROLE_ADMIN',
|
||||
'id' => $id,
|
||||
'name' => 'Admin',
|
||||
'icon' => 'vt-visibility',
|
||||
]);
|
||||
}
|
||||
}
|
16
src/modules/User/Controller/UserAPIController.php
Normal file → Executable file
16
src/modules/User/Controller/UserAPIController.php
Normal file → Executable file
|
@ -4,16 +4,20 @@
|
|||
namespace Modules\User\Controller;
|
||||
|
||||
use Venom\Core\ArgumentHandler;
|
||||
use Venom\Core\DatabaseHandler;
|
||||
use Venom\Core\Database\EasyQuery;
|
||||
use Venom\Core\Database\EntityManager;
|
||||
use Venom\Entities\User;
|
||||
use Venom\Helper\AdminHelper;
|
||||
|
||||
class UserAPIController
|
||||
{
|
||||
public function get()
|
||||
{
|
||||
$entityManager = EntityManager::create(User::class);
|
||||
$easyQuery = new EasyQuery(User::$tableName, ["id", "username", "firstname", "lastname", "email", "isActive"]);
|
||||
$entityManager->load($easyQuery);
|
||||
//['id' => 1, 'name' => 'engineertrooper', 'icon' => 'vt-edit'],
|
||||
$data = UserController::get(["id", "username", "firstname", "lastname", "email", "isActive"]);
|
||||
AdminHelper::sendResponse(["users" => $data]);
|
||||
AdminHelper::sendResponse(["users" => $entityManager->getAll()]);
|
||||
}
|
||||
|
||||
public function getById($id)
|
||||
|
@ -48,12 +52,6 @@ class UserAPIController
|
|||
|
||||
public function delete($id)
|
||||
{
|
||||
AdminHelper::sendStatus(DatabaseHandler::get()->execute(
|
||||
"DELETE FROM users WHERE id=:id",
|
||||
[
|
||||
':id' => $id
|
||||
]
|
||||
));
|
||||
}
|
||||
|
||||
public function create($id)
|
||||
|
|
2
src/modules/User/Controller/UserController.php
Normal file → Executable file
2
src/modules/User/Controller/UserController.php
Normal file → Executable file
|
@ -5,7 +5,7 @@ namespace Modules\User\Controller;
|
|||
|
||||
|
||||
use Venom\Core\DatabaseHandler;
|
||||
use Venom\Models\DatabaseObject;
|
||||
use Venom\Entities\DatabaseObject;
|
||||
|
||||
class UserController
|
||||
{
|
||||
|
|
|
@ -1,49 +0,0 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Modules\User;
|
||||
|
||||
|
||||
use Modules\User\Controller\UserAPIController;
|
||||
use Venom\Core\Config;
|
||||
use Venom\Core\Module;
|
||||
use Venom\Helper\AdminHelper;
|
||||
use Venom\Routing\Route;
|
||||
use Venom\Routing\Router;
|
||||
use Venom\Venom;
|
||||
|
||||
class UserModule 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([
|
||||
'/users' => [
|
||||
'cl' => UserAPIController::class,
|
||||
'roles' => ['ROLE_ADMIN'],
|
||||
'routes' => [
|
||||
'*' => [
|
||||
"GET" => 'get',
|
||||
],
|
||||
'1' => [
|
||||
"GET" => 'getById',
|
||||
"POST" => 'insert',
|
||||
"PUT" => 'update',
|
||||
]
|
||||
]
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
42
src/modules/User/module.php
Executable file
42
src/modules/User/module.php
Executable file
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
|
||||
use Modules\User\Controller\UserAPIController;
|
||||
use Venom\Core\Module;
|
||||
use Venom\Routing\Route;
|
||||
use Venom\Venom;
|
||||
|
||||
|
||||
/** @var Venom $venom */
|
||||
$venom = $venom ?? die();
|
||||
$venom->registerModule([
|
||||
Module::ACTIVE => true,
|
||||
Module::NAME => 'UserModule',
|
||||
Module::DESC => 'User Management',
|
||||
Module::AUTHOR => 'VstZ dev',
|
||||
// NEED TO CHECK RIGHTS? :D IF FALSE WRITE IS ALWAYS ALLOWED ALSO READ!
|
||||
Module::SECURE => true,
|
||||
Module::ROUTE => [],
|
||||
Module::ADMIN_ROUTE => [
|
||||
'/users' => new Route(UserAPIController::class, [
|
||||
"*" => [
|
||||
Route::GET => 'get'
|
||||
],
|
||||
"1" => [
|
||||
Route::GET => 'getById',
|
||||
Route::POST => 'insert',
|
||||
Route::PUT => 'update',
|
||||
Route::DELETE => 'delete'
|
||||
]
|
||||
]
|
||||
)
|
||||
],
|
||||
Module::TEMPLATE_PATH => __DIR__ . "/tpl/",
|
||||
Module::TEMPLATES => [
|
||||
],
|
||||
Module::ADMIN_TEMPLATES => [
|
||||
//
|
||||
],
|
||||
Module::CONTROLLER => [
|
||||
|
||||
]
|
||||
]);
|
13
src/modules/VenomStatus/Controller/VenomStatusController.php
Normal file
13
src/modules/VenomStatus/Controller/VenomStatusController.php
Normal file
|
@ -0,0 +1,13 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace Modules\VenomStatus\Controller;
|
||||
|
||||
|
||||
class VenomStatusController
|
||||
{
|
||||
public function get()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
34
src/modules/VenomStatus/module.php
Executable file
34
src/modules/VenomStatus/module.php
Executable file
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
use Modules\VenomStatus\Controller\VenomStatusController;
|
||||
use Venom\Core\Module;
|
||||
use Venom\Routing\Route;
|
||||
|
||||
|
||||
$venom = $venom ?? die();
|
||||
$venom->registerModule([
|
||||
Module::ACTIVE => true,
|
||||
Module::NAME => 'VenomStatusModule',
|
||||
Module::DESC => 'Show Routes and Modules!',
|
||||
Module::AUTHOR => 'VstZ dev',
|
||||
// NEED TO CHECK RIGHTS? :D IF FALSE WRITE IS ALWAYS ALLOWED ALSO READ!
|
||||
Module::SECURE => true,
|
||||
Module::ROUTE => [],
|
||||
Module::ADMIN_ROUTE => [
|
||||
'/venomStatus' => new Route(VenomStatusController::class, [
|
||||
"*" => [
|
||||
Route::GET => 'get'
|
||||
]
|
||||
])
|
||||
],
|
||||
Module::TEMPLATE_PATH => __DIR__ . "/tpl/",
|
||||
Module::TEMPLATES => [
|
||||
|
||||
],
|
||||
Module::ADMIN_TEMPLATES => [
|
||||
|
||||
],
|
||||
Module::CONTROLLER => [
|
||||
|
||||
]
|
||||
]);
|
|
@ -1,78 +0,0 @@
|
|||
<?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 VenomStatusModule 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([
|
||||
'/venomStatus' => [
|
||||
'cl' => VenomStatusModule::class,
|
||||
'roles' => ['ROLE_ADMIN'],
|
||||
'routes' => [
|
||||
'*' => [
|
||||
"GET" => 'get',
|
||||
],
|
||||
'1' => [
|
||||
"GET" => 'getById',
|
||||
"POST" => 'update',
|
||||
"PUT" => 'insert',
|
||||
]
|
||||
]
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
public function get()
|
||||
{
|
||||
AdminHelper::sendResponse([
|
||||
'users' => [
|
||||
['id' => 1, 'name' => 'engineertrooper', 'icon' => 'vt-edit'],
|
||||
['id' => 2, 'name' => 'versustunez', 'icon' => 'vt-edit']
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
public function update(): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function insert(): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getById($id)
|
||||
{
|
||||
AdminHelper::sendResponse([
|
||||
'caseName' => 'ROLE_ADMIN',
|
||||
'id' => $id,
|
||||
'name' => 'Admin',
|
||||
'icon' => 'vt-visibility',
|
||||
]);
|
||||
}
|
||||
}
|
0
tpl/.gitkeep
Normal file → Executable file
0
tpl/.gitkeep
Normal file → Executable file
0
tpl/admin/admin-panel.php
Normal file → Executable file
0
tpl/admin/admin-panel.php
Normal file → Executable file
0
tpl/admin/base.php
Normal file → Executable file
0
tpl/admin/base.php
Normal file → Executable file
0
tpl/admin/jsTemplates/includes/btn.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/includes/btn.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/includes/input.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/includes/input.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/includes/select.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/includes/select.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/includes/svg.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/includes/svg.tpl
Normal file → Executable file
Before Width: | Height: | Size: 155 B After Width: | Height: | Size: 155 B |
0
tpl/admin/jsTemplates/includes/switch.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/includes/switch.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/metaDataList.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/metaDataList.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/overview.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/overview.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/pageEdit.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/pageEdit.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/pagesList.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/pagesList.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/roleEdit.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/roleEdit.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/rolesList.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/rolesList.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/seoUrlEdit.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/seoUrlEdit.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/seoUrlList.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/seoUrlList.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/userEdit.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/userEdit.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/usersList.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/usersList.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/venomStatus.tpl
Normal file → Executable file
0
tpl/admin/jsTemplates/venomStatus.tpl
Normal file → Executable file
0
tpl/admin/login.php
Normal file → Executable file
0
tpl/admin/login.php
Normal file → Executable file
0
tpl/default/base.php
Normal file → Executable file
0
tpl/default/base.php
Normal file → Executable file
Loading…
Reference in a new issue