- added SEO-URL-Mode

- added Language support
This commit is contained in:
Maurice Grönwoldt 2020-07-24 11:08:07 +02:00
commit ccf2f506f0
13 changed files with 201 additions and 7 deletions

View file

@ -34,4 +34,9 @@ class ArgumentHandler
}
return $default;
}
public function setItem(string $key, $item)
{
$this->arguments[$key] = $item;
}
}

View file

@ -16,6 +16,7 @@ class Config
private bool $devMode = false;
private bool $isAdmin = false;
private string $baseUrl = '';
private bool $seoMode = false;
private function __construct()
{
@ -118,6 +119,14 @@ class Config
$this->set('baseUrl', $url);
}
public function setSeoMode(bool $mode) {
$this->set('seoMode', $mode);
}
public function getSeoEnabled() {
return $this->seoMode;
}
/**
* @return bool
*/

View file

@ -48,7 +48,7 @@ class DatabaseHandler
}
}
public function getOne(string $query, array $args): ?array
public function getOne(string $query, array $args): ?DatabaseObject
{
$data = $this->getAll($query, $args);
if (count($data) > 0) {

61
src/Venom/Language.php Normal file
View file

@ -0,0 +1,61 @@
<?php
namespace Venom;
use Venom\Database\DatabaseHandler;
use Venom\Database\DatabaseObject;
class Language
{
private string $language = "";
private array $languages = [];
private ?DatabaseObject $defaultLang;
public function __construct()
{
$this->defaultLang = DatabaseHandler::get()->getOne("select language, shortTag from language WHERE isActive = 1 and isDefault = 1", []);
}
public function initLang()
{
$lang = ArgumentHandler::get()->getItem("lang", $this->defaultLang->shortTag);
//check if language exists
$data = DatabaseHandler::get()->getOne("select id from language where shortTag = :shortTag", [
':shortTag' => $lang
]);
if (isset($data->id)) {
$this->language = $lang;
} else {
throw new \RuntimeException("Language \"$lang\" not found");
}
}
public function registerLang(string $key, array $values)
{
$this->languages[$key] = $values;
}
public function getCurrentLang()
{
return $this->language;
}
public function getTranslations()
{
return $this->languages[$this->language] ?: [];
}
public function getTranslation($key)
{
if (!isset($this->languages[$this->language])) {
return $key;
}
if (isset($this->languages[$this->language][$key])) {
return $this->languages[$this->language][$key];
}
return $key;
}
}

View file

@ -4,13 +4,39 @@
namespace Venom;
use Venom\SEO\SeoController;
/**
* Singleton Class... hold current URL => can
* @package Venom
*/
class Registry
{
public function __construct()
private static ?Registry $instance = null;
private SeoController $seo;
private Language $lang;
private function __construct()
{
$this->seo = new SeoController();
$this->lang = new Language();
}
public static function getInstance(): Registry
{
if (self::$instance === null) {
self::$instance = new Registry();
}
return self::$instance;
}
public function getSeo(): SeoController
{
return $this->seo;
}
public function getLang(): Language
{
return $this->lang;
}
}

View file

@ -0,0 +1,54 @@
<?php
namespace Venom\SEO;
use Venom\ArgumentHandler;
use Venom\Config;
use Venom\Database\DatabaseHandler;
class SeoController
{
private bool $shouldUse;
private $data = null;
public function __construct()
{
$this->shouldUse = Config::getInstance()->getSeoEnabled();
}
public function loadSite()
{
if (!$this->shouldUse) {
return;
}
$url = htmlspecialchars(parse_url($_SERVER['REQUEST_URI'])['path']);
$data = DatabaseHandler::get()->getOne("SELECT * FROM seoData WHERE seo = :url", [
':url' => $url,
]);
$this->data = $data;
if($this->data != null) {
parse_str(parse_url($this->data->raw)['query'], $queryItems);
foreach($queryItems as $key => $item) {
ArgumentHandler::get()->setItem($key, $item);
}
}
}
public function addSite()
{
}
public function deleteSite()
{
}
public function getData()
{
return $this->data;
}
}

View file

@ -24,14 +24,18 @@ class Venom
{
// we need to load the current controller and the current start template.
// after this we can start the renderer
$registry = Registry::getInstance();
$registry->getSeo()->loadSite();
$registry->getLang()->initLang();
$this->renderer->init($this->findController());
$this->renderer->render();
}
private function findController(): ?RenderController
{
if (isset($_GET['cl'], $this->controllers[$_GET['cl']])) {
return $this->controllers[$_GET['cl']];
$cl = ArgumentHandler::get()->getItem('cl');
if ($cl != null && isset($this->controllers[$cl])) {
return $this->controllers[$cl];
}
return null;
}