241 lines
5.7 KiB
PHP
Executable File
241 lines
5.7 KiB
PHP
Executable File
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace mirzaev\arming_bot\views;
|
|
|
|
// Files of the project
|
|
use mirzaev\arming_bot\models\session,
|
|
mirzaev\arming_bot\models\account,
|
|
mirzaev\arming_bot\models\settings;
|
|
|
|
// Framework for PHP
|
|
use mirzaev\minimal\controller;
|
|
|
|
// Templater of views
|
|
use Twig\Loader\FilesystemLoader,
|
|
Twig\Environment as twig,
|
|
Twig\Extra\Intl\IntlExtension as intl,
|
|
Twig\TwigFilter,
|
|
Twig\TwigFunction;
|
|
|
|
|
|
// Built-in libraries
|
|
use ArrayAccess;
|
|
|
|
/**
|
|
* Templater core
|
|
*
|
|
* @package mirzaev\arming_bot\views
|
|
* @author ${REPO_OWNER} < mail >
|
|
*/
|
|
final class templater extends controller implements ArrayAccess
|
|
{
|
|
/**
|
|
* Registry of global variables of view
|
|
*/
|
|
public array $variables = [];
|
|
|
|
/**
|
|
* Instance of twig templater
|
|
*/
|
|
readonly public twig $twig;
|
|
|
|
/**
|
|
* Constructor of an instance
|
|
*
|
|
* @param session|null $session The object implementing a session instance from ArangoDB
|
|
* @param account|null $account The object implementing an account instance from ArangoDB
|
|
* @param settings|null $settings The object implementing an account instance from ArangoDB
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __construct(
|
|
?session $session = null,
|
|
?account $account = null,
|
|
?settings $settings = null
|
|
) {
|
|
// Initializing of an instance of twig
|
|
$this->twig = new twig(new FilesystemLoader(VIEWS));
|
|
|
|
// Initializing of global variables
|
|
$this->twig->addGlobal('theme', 'default');
|
|
$this->twig->addGlobal('server', $_SERVER);
|
|
$this->twig->addGlobal('cookies', $_COOKIE);
|
|
$this->twig->addGlobal('settings', $settings);
|
|
if (!empty($session?->status())) $this->twig->addGlobal('session', $session);
|
|
if (!empty($account?->status())) $this->twig->addGlobal('account', $account);
|
|
$this->twig->addGlobal('language', $account?->language->name ?? $settings?->language->name ?? 'en');
|
|
|
|
|
|
// Initialize function of dimensions formattinx
|
|
$this->twig->addFunction(
|
|
new TwigFunction(
|
|
'format_dimensions',
|
|
function (
|
|
string|int|float|null $x = null,
|
|
string|int|float|null $y = null,
|
|
string|int|float|null $z = null,
|
|
string|null $before = null,
|
|
string|null $after = null
|
|
) {
|
|
// Initialzing the buffer of result
|
|
$result = '';
|
|
|
|
// Generating
|
|
if (!empty($x)) $result .= $x;
|
|
if (!empty($y))
|
|
if (empty($result)) $result = "$y";
|
|
else $result .= "x$y";
|
|
if (!empty($z))
|
|
if (empty($result)) $result = "$z";
|
|
else $result .= "x$z";
|
|
if (!empty($result)) $result = "$before$result$after";
|
|
|
|
// Exit (success)
|
|
return $result;
|
|
}
|
|
)
|
|
);
|
|
|
|
// Initializing of twig extensions
|
|
$this->twig->addExtension(new intl());
|
|
}
|
|
|
|
/**
|
|
* Render a HTML-document
|
|
*
|
|
* @param string $file Related path to a HTML-document
|
|
* @param array $variables Registry of variables to push into registry of global variables
|
|
*
|
|
* @return ?string HTML-документ
|
|
*/
|
|
public function render(string $file, array $variables = []): ?string
|
|
{
|
|
// Generation and exit (success)
|
|
return $this->twig->render('themes' . DIRECTORY_SEPARATOR . $this->twig->getGlobals()['theme'] . DIRECTORY_SEPARATOR . $file, $variables + $this->variables);
|
|
}
|
|
|
|
/**
|
|
* Write
|
|
*
|
|
* Write a variable into registry of global variables
|
|
*
|
|
* @param string $name Name of the variable
|
|
* @param mixed $value Value of the variable
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __set(string $name, mixed $value = null): void
|
|
{
|
|
// Write the variable and exit (success)
|
|
$this->variables[$name] = $value;
|
|
}
|
|
|
|
/**
|
|
* Read
|
|
*
|
|
* Read a variable from registry of global variables
|
|
*
|
|
* @param string $name Name of the variable
|
|
*
|
|
* @return mixed Content of the variable, if they are found
|
|
*/
|
|
public function __get(string $name): mixed
|
|
{
|
|
// Read the variable and exit (success)
|
|
return $this->variables[$name];
|
|
}
|
|
|
|
/**
|
|
* Delete
|
|
*
|
|
* Delete a variable from the registry of global variables
|
|
*
|
|
* @param string $name Name of the variable
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __unset(string $name): void
|
|
{
|
|
// Delete the variable and exit (success)
|
|
unset($this->variables[$name]);
|
|
}
|
|
|
|
/**
|
|
* Check of initialization
|
|
*
|
|
* Check of initialization in registry of global variables
|
|
*
|
|
* @param string $name Name of the variable
|
|
*
|
|
* @return bool The variable is initialized?
|
|
*/
|
|
public function __isset(string $name): bool
|
|
{
|
|
// Check of initialization of the variable and exit (success)
|
|
return isset($this->variables[$name]);
|
|
}
|
|
|
|
/**
|
|
* Write
|
|
*
|
|
* Write a variable into registry of global variables
|
|
*
|
|
* @param mixed $name Name of an offset of the variable
|
|
* @param mixed $value Value of the variable
|
|
*
|
|
* @return void
|
|
*/
|
|
public function offsetSet(mixed $name, mixed $value): void
|
|
{
|
|
// Write the variable and exit (success)
|
|
$this->variables[$name] = $value;
|
|
}
|
|
|
|
/**
|
|
* Read
|
|
*
|
|
* Read a variable from registry of global variables
|
|
*
|
|
* @param mixed $name Name of the variable
|
|
*
|
|
* @return mixed Content of the variable, if they are found
|
|
*/
|
|
public function offsetGet(mixed $name): mixed
|
|
{
|
|
// Read the variable and exit (success)
|
|
return $this->variables[$name];
|
|
}
|
|
|
|
/**
|
|
* Delete
|
|
*
|
|
* Delete a variable from the registry of global variables
|
|
*
|
|
* @param mixed $name Name of the variable
|
|
*
|
|
* @return void
|
|
*/
|
|
public function offsetUnset(mixed $name): void
|
|
{
|
|
// Delete the variable and exit (success)
|
|
unset($this->variables[$name]);
|
|
}
|
|
|
|
/**
|
|
* Check of initialization
|
|
*
|
|
* Check of initialization in registry of global variables
|
|
*
|
|
* @param mixed $name Name of the variable
|
|
*
|
|
* @return bool The variable is initialized?
|
|
*/
|
|
public function offsetExists(mixed $name): bool
|
|
{
|
|
// Check of initialization of the variable and exit (success)
|
|
return isset($this->variables[$name]);
|
|
}
|
|
}
|