diff --git a/mirzaev/site/account/system/controllers/core.php b/mirzaev/site/account/system/controllers/core.php index 7aec396..334e8d7 100644 --- a/mirzaev/site/account/system/controllers/core.php +++ b/mirzaev/site/account/system/controllers/core.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace mirzaev\site\account\controllers; // Файлы проекта -use mirzaev\site\account\views\manager; +use mirzaev\site\account\views\templater; use mirzaev\site\account\models\core as models; use mirzaev\site\account\models\account_model as account; use mirzaev\site\account\models\session_model as session; @@ -26,75 +26,71 @@ use mirzaev\vk\robots\user as robot; * @package mirzaev\site\account\controllers * @author Arsen Mirzaev Tatyano-Muradovich */ -class core extends controller +class core extends controller { - /** - * Переменные окружения - */ - protected robot $vk; + /** + * Переменные окружения + */ + protected robot $vk; - /** - * Переменные окружения - */ - protected array $variables = []; + /** + * Конструктор + * + * @return void + */ + public function __construct() + { + parent::__construct(); - /** - * Конструктор - * - * @return void - */ - public function __construct() - { - parent::__construct(); + // Инициализация ядра моделей (соединение с базой данных...) + new models(); - // Инициализация ядра моделей (соединение с базой данных...) - new models(); + // Инициализация шаблонизатора представлений + $this->view = new templater; - // Инициализация журнала ошибок - $this->variables['errors'] = [ - 'session' => [], - 'account' => [], - 'vk' => [] - ]; + // Инициализация журнала ошибок + $this->view->errors = [ + 'session' => [], + 'account' => [], + 'vk' => [] + ]; - // Инициализация даты до которой будет активна сессия - $expires = time() + 604800; + // Инициализация даты до которой будет активна сессия + $expires = time() + 604800; - // Инициализация сессии (без журналирования) - $this->variables['session'] = new session($_COOKIE["session"] ?? null, $expires) ?? header('Location: https://mirzaev.sexy/error?code=500&text=Не+удалось+инициализировать+сессию'); + // Инициализация сессии (без журналирования) + $this->view->session = new session($_COOKIE["session"] ?? null, $expires) ?? + header('Location: https://mirzaev.sexy/error?code=500&text=Не+удалось+инициализировать+сессию'); - if ($_COOKIE["session"] ?? null !== $this->variables['session']->hash) { - // Изменился хеш сессии (подразумевается, что сессия устарела) + if ($_COOKIE["session"] ?? null !== $this->view->session->hash) { + // Изменился хеш сессии (подразумевается, что сессия устарела) - // Запись хеша новой сессии - setcookie('session', $this->variables['session']->hash, [ - 'expires' => $expires, - 'domain' => 'mirzaev.sexy', - 'path' => '/', - 'secure' => true, - 'httponly' => true, - 'samesite' => 'strict' - ]); - } - - // Инициализация аккаунта (без журналирования) - $this->variables['account'] = $this->variables['session']->account(); - - if ($this->variables['account'] instanceof _document) { - // Инициализирован аккаунт - - // Инициализация аккаунта ВКонтакте (без журналирования) - $this->variables['vk'] = account::vk($this->variables['account']); - - if ($this->variables['vk'] instanceof _document) { - // Инициализирован аккаунт ВКонтакте - - // Инициализация робота для аккаунта ВКонтакте - $this->vk = vk::init()->user(key: $this->variables['vk']->access['key']); - } else unset($this->variables['account'], $this->variables['vk']); - } - - // Инициализация препроцессора представления - $this->view = new manager; + // Запись хеша новой сессии + setcookie('session', $this->view->session->hash, [ + 'expires' => $expires, + 'domain' => 'mirzaev.sexy', + 'path' => '/', + 'secure' => true, + 'httponly' => true, + 'samesite' => 'strict' + ]); } + + // Инициализация аккаунта (без журналирования) + $this->view->account = $this->view->session->account(); + + if ($this->view->account instanceof _document) { + // Инициализирован аккаунт + + // Инициализация аккаунта ВКонтакте (без журналирования) + $this->variables['vk'] = account::vk($this->variables['account']); + + if ($this->variables['vk'] instanceof _document) { + // Инициализирован аккаунт ВКонтакте + + // Инициализация робота для аккаунта ВКонтакте + $this->vk = vk::init()->user(key: $this->variables['vk']->access['key']); + } else unset($this->variables['account'], $this->variables['vk']); + } + } } diff --git a/mirzaev/site/account/system/controllers/index_controller.php b/mirzaev/site/account/system/controllers/index_controller.php index 07d989a..4365119 100644 --- a/mirzaev/site/account/system/controllers/index_controller.php +++ b/mirzaev/site/account/system/controllers/index_controller.php @@ -22,59 +22,12 @@ final class index_controller extends core */ public function index(array $parameters = []): ?string { - // Инициализация загружаемых категорий - $this->variables['include'] = [ - 'head' => ['self'], - 'body' => ['self'] + // Инициализация узлов + $this->view->nodes = [ + 'account' => $this->view->render(DIRECTORY_SEPARATOR . 'nodes' . DIRECTORY_SEPARATOR . (isset($this->account) ? 'profile.html' : 'authentication.html')) ]; - // Инициализация бегущей строки - $this->variables['hotline'] = [ - 'id' => $this->variables['request']['id'] ?? 'hotline' - ]; - - // Инициализация параметров бегущей строки - $this->variables['hotline']['parameters'] = [ - // 'step' => 2 - ]; - - // Инициализация аттрибутов бегущей строки - $this->variables['hotline']['attributes'] = []; - - // Инициализация элементов бегущей строки - $this->variables['hotline']['elements'] = [ - ['content' => '1'], - [ - 'tag' => 'article', - 'content' => '2' - ], - ['content' => '3'], - ['content' => '4'], - ['content' => '5'], - ['content' => '6'], - ['content' => '7'], - ['content' => '8'], - ['content' => '9'], - ['content' => '10'], - ['content' => '11'], - ['content' => '12'], - ['content' => '13'], - ['content' => '14'], - ['content' => '15'] - ]; - - // Инициализация бегущей строки - $this->variables['graph'] = [ - 'id' => $this->variables['request']['id'] ?? 'graph' - ]; - - // Инициализация аттрибутов бегущей строки - $this->variables['graph']['attributes'] = []; - - // Инициализация элементов бегущей строки - $this->variables['graph']['elements'] = []; - // Генерация представления - return $this->view->render(DIRECTORY_SEPARATOR . 'index.html', $this->variables); + return $this->view->render(DIRECTORY_SEPARATOR . 'index.html'); } } diff --git a/mirzaev/site/account/system/models/session_model.php b/mirzaev/site/account/system/models/session_model.php index e320370..303eba4 100644 --- a/mirzaev/site/account/system/models/session_model.php +++ b/mirzaev/site/account/system/models/session_model.php @@ -222,76 +222,72 @@ final class session_model extends core /** * Записать * - * Ищет свойство в инстанции сессии, если не находит, то ищет его в инстанции документа сессии из базы данных, - * затем записывает в него переданные данные. Динамическая инициализация свойств происходит в инстанции - * документа сессии из базы данных + * Записывает свойство в инстанцию документа сессии из базы данных * - * @param string $name Название свойства - * @param mixed $value Содержимое для записи + * @param string $name Название + * @param mixed $value Содержимое * * @return void */ public function __set(string $name, mixed $value = null): void { - if (isset($this->{$name})) $this->{$name} = $value; - else $this->document->{$name} = $value; + $this->document->{$name} = $value; } /** * Прочитать * - * Ищет свойство в инстанции сессии, если не находит, то ищет его в инстанции документа сессии из базы данных + * Читает свойство из инстанции документа сессии из базы данных * - * @param string $name Название свойства + * @param string $name Название * * @return mixed Данные свойства инстанции сессии или инстанции документа сессии из базы данных */ public function __get(string $name): mixed { - return $this->{$name} ?? $this->document->{$name}; + return $this->document->{$name}; } /** * Проверить инициализированность * - * Ищет свойство в инстанции сессии, если не находит, то ищет его в инстанции документа сессии из базы данных, - * затем проверяет его инициализированность через встроенную функцию isset() + * Проверяет инициализированность свойства в инстанции документа сессии из базы данных * - * @param string $name Название свойства + * @param string $name Название * * @return bool Свойство инициализировано? */ public function __isset(string $name): bool { - return isset($this->{$name}) || isset($this->document->{$name}); + return isset($this->document->{$name}); } /** * Удалить * - * Деинициализирует свойство в инстанции сессии и в инстанции документа сессии из базы данных + * Деинициализировать свойство в инстанции документа сессии из базы данных * - * @param string $name Название свойства + * @param string $name Название * * @return void */ public function __unset(string $name): void { - unset($this->{$name}, $this->document->{$name}); + unset($this->document->{$name}); } /** * Выполнить метод * - * Ищет метод в инстанции сессии, если не находит, то ищет его в инстанции документа сессии из базы данных + * Выполнить метод в инстанции документа сессии из базы данных * - * @param string $name Название метода + * @param string $name Название * @param array $arguments Аргументы * * @return void */ public function __call(string $name, array $arguments = []): mixed { - return method_exists($this, $name) ? $this->{$name}($arguments) : $this->document->{$name}($arguments); + return $this->document->{$name}($arguments); } } diff --git a/mirzaev/site/account/system/public/css/icons/arrow_right.css b/mirzaev/site/account/system/public/css/icons/arrow_right.css new file mode 100644 index 0000000..57ef12d --- /dev/null +++ b/mirzaev/site/account/system/public/css/icons/arrow_right.css @@ -0,0 +1,33 @@ + i.arrow.right { + box-sizing: border-box; + position: relative; + display: block; + transform: scale(var(--ggs,1)); + width: 22px; + height: 22px +} + +i.arrow.right::after, +i.arrow.right::before { + content: ""; + display: block; + box-sizing: border-box; + position: absolute; + right: 3px +} + +i.arrow.right::after { + width: 8px; + height: 8px; + border-top: 2px solid; + border-right: 2px solid; + transform: rotate(45deg); + bottom: 7px +} + +i.arrow.right::before { + width: 16px; + height: 2px; + bottom: 10px; + background: currentColor +} diff --git a/mirzaev/site/account/system/views/index.html b/mirzaev/site/account/system/views/index.html index 3b3bc32..44fd7fc 100644 --- a/mirzaev/site/account/system/views/index.html +++ b/mirzaev/site/account/system/views/index.html @@ -1,47 +1,32 @@ {% extends "core.html" %} -{% use 'nodes/account.html' with css as account_css, body as account_body, js as account_js %} {% use "core.html" with css as core_css, body as core_body, js as core_js, js_init as core_js_init %} {% use "header.html" with css as header_css, body as header_body, js as header_js, js_init as header_js_init %} {% use "aside.html" with css as aside_css, body as aside_body, js as aside_js, js_init as aside_js_init %} -{% use 'graph/index.html' with css as graph_css, body as graph_body, js as graph_js, js_init as graph_js_init %} {% block css %} {{ block('core_css') }} {{ block('header_css') }} {{ block('aside_css') }} -{{ block('graph_css') }} -{{ block('account_css') }} {% endblock %} {% block body %} -{{ block('core_body') }} -{{ block('aside_body') }} -{{ block('header_body') }} -
{% block main %} - {{ block('account_body') }} + {{ nodes.account|raw }} {% endblock %} - {{ block('graph_body') }}
- -{# {% include 'footer.html' %} #} -{#
#} {% endblock %} {% block js %} {{ block('core_js') }} {{ block('header_js') }} {{ block('aside_js') }} -{{ block('graph_js') }} -{{ block('account_js') }} {% endblock %} {% block js_init %} {{ block('core_js_init') }} {{ block('header_js_init') }} {{ block('aside_js_init') }} -{{ block('graph_js_init') }} {% endblock %} diff --git a/mirzaev/site/account/system/views/manager.php b/mirzaev/site/account/system/views/manager.php deleted file mode 100644 index 761bba7..0000000 --- a/mirzaev/site/account/system/views/manager.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ -final class manager extends controller -{ - public function render(string $file, array $vars = []): ?string - { - // Генерация представления - return (new view(new FilesystemLoader(VIEWS)))->render($file, $vars); - } -} diff --git a/mirzaev/site/account/system/views/nodes/authentication.html b/mirzaev/site/account/system/views/nodes/authentication.html new file mode 100644 index 0000000..9b4047b --- /dev/null +++ b/mirzaev/site/account/system/views/nodes/authentication.html @@ -0,0 +1,30 @@ +{% block css %} + + +{% endblock %} + +{% block body %} +
+ {% if account %} + {{ account.getKey() }} + {% if vk %} + {{ vk.mail }} + {% endif %} + {% else %} +
+

Аутентификация

+
+
+ + +
+ {% endif %} +
+{% endblock %} + +{% block js %} + +{% endblock %} diff --git a/mirzaev/site/account/system/views/nodes/account.html b/mirzaev/site/account/system/views/nodes/profile.html similarity index 100% rename from mirzaev/site/account/system/views/nodes/account.html rename to mirzaev/site/account/system/views/nodes/profile.html diff --git a/mirzaev/site/account/system/views/templater.php b/mirzaev/site/account/system/views/templater.php new file mode 100644 index 0000000..db0fad6 --- /dev/null +++ b/mirzaev/site/account/system/views/templater.php @@ -0,0 +1,176 @@ + + */ +final class templater extends controller implements ArrayAccess +{ + /** + * Реестр глобальных переменных + */ + public array $variables = []; + + /** + * Инстанция окружения twig + */ + public twig $twig; + + /** + * Конструктор + * + * @return void + */ + public function __construct() + { + // Инициализация шаблонизатора + $this->twig = new twig(new FilesystemLoader(VIEWS)); + + // Инициализация глобальных переменных + $this->twig->addGlobal('cookie', $_COOKIE); + } + + /** + * Отрисовка HTML-документа + * + * @param string $file Относительный директории представлений путь до файла представления + * @param ?array $variables Реестр переменных + * + * @return ?string HTML-документ + */ + public function render(string $file, ?array $variables = null): ?string + { + // Генерация представления + return $this->twig->render($file, $variables ?? $this->variables); + } + + /** + * Записать + * + * Записывает переменную в реестр глобальных переменных + * + * @param string $name Название + * @param mixed $value Содержимое + * + * @return void + */ + public function __set(string $name, mixed $value = null): void + { + $this->variables[$name] = $value; + } + + /** + * Прочитать + * + * Читает переменную из реестра глобальных переменных + * + * @param string $name Название + * + * @return mixed Данные переменной из реестра глобальных переменных + */ + public function __get(string $name): mixed + { + return $this->variables[$name]; + } + + /** + * Проверить инициализированность + * + * Проверяет инициализированность переменной в буфере переменных представления + * + * @param string $name Название + * + * @return bool Переменная инициализирована? + */ + public function __isset(string $name): bool + { + return isset($this->variables[$name]); + } + + /** + * Удалить + * + * Деинициализирует переменную в реестре глобальных переменных + * + * @param string $name Название + * + * @return void + */ + public function __unset(string $name): void + { + unset($this->variables[$name]); + } + + /** + * Записать + * + * Записывает переменную в реестр глобальных переменных + * + * @param mixed $offset Сдвиг, либо идентификатор + * @param mixed $value Содержимое + * + * @return void + */ + public function offsetSet(mixed $offset, mixed $value): void + { + $this->variables[$offset] = $value; + } + + /** + * Прочитать + * + * Читает переменную из реестра глобальных переменных + * + * @param mixed $offset Сдвиг, либо идентификатор + * + * @return mixed Данные переменной из реестра глобальных переменных + */ + public function &offsetGet(mixed $offset): mixed + { + return $this->variables[$offset]; + } + + /** + * Проверить инициализированность + * + * Проверяет инициализированность переменной в реестре глобальных переменных + * + * @param mixed $offset Сдвиг, либо идентификатор + * + * @return bool Переменная инициализирована? + */ + public function offsetExists(mixed $offset): bool + { + return isset($this->variables[$offset]); + } + + /** + * Удалить + * + * Деинициализирует переменную в реестре глобальных переменных + * + * @param mixed $offset Сдвиг, либо идентификатор + * + * @return void + */ + public function offsetUnset(mixed $offset): void + { + unset($this->variables[$offset]); + } +}