SLOT-H: Структура фронтенд части



Фронтенд часть системы построена на phtml-шаблонах, CSS и JavaScript. Все файлы организованы по модульному принципу и привязаны к конкретным проектам.




Порядок загрузки



Загрузка фронтенда происходит в строго определённой последовательности:

1. Header



Первым загружается файл `Application/Layout/Project_<номер проекта>/Skin_<номер скина>/headerExt.phtml` для неавторизованных пользователей или `header.phtml` для авторизованных пользователей в полной версии.

Этот файл формирует стартовые данные фронтенда: подключает базовые CSS и JS, определяет глобальные переменные, устанавливает мета-теги.

После этого вызывается `Application/Layout/Project_<номер проекта>/Skin_<номер скина>/html.phtml`, который содержит общую структуру страницы, начинающуюся с тега `<html>`. В демо-версии это может выглядеть странно, но логика оправдана: `headerExt` загружается для неавторизованных, а для авторизованных используется `header.phtml`, добавляющий свои блоки после начала фактического HTML.

2. Основное представление



Загружается представление контроллера и экшена.

Пример: `/Modules/Free/Views/Project_<номер проекта>/Index/index.phtml`

Это основной контент страницы, который выводится внутри HTML-структуры, заданной в layout.

3. Footer



Последним загружается футер: `Application/Layout/Project_<номер проекта>/Skin_<номер скина>/footerExt.phtml`

Для авторизованных пользователей в полной версии используется `footer.phtml`.




Структура папок



В каждом модуле присутствуют папки:

- `Views` - phtml-шаблоны
- `Public/css` - стили
- `Public/js` - скрипты

Внутри каждой из этих папок создаётся подпапка `Project_<номер проекта>`, а внутри неё - папка контроллера.

Views



Папка Views содержит phtml-файлы, которые рендерят HTML-страницы.

text
Структура:
Views/
└── Project_<номер проекта>/
└── <имя контроллера>/
├── index.phtml
├── edit.phtml
└── ...



Для каждого проекта своя папка. Это позволяет настраивать внешний вид под конкретный проект без изменения логики контроллеров.

Public/css



Папка Public/css содержит стили. Структура аналогична Views:
text
Public/css/
└── Project_<номер проекта>/
└── <имя контроллера>/
├── index.css
├── edit.css
└── ...


Public/js



Папка Public/js содержит JavaScript-файлы:
text
Public/js/
└── Project_<номер проекта>/
└── <имя контроллера>/
├── index.js
├── edit.js
└── ...





Подключение статики



В phtml-файлах статика подключается через методы представления:

- `$this->addStyle()` - подключение CSS
- `$this->addScript()` - подключение JS
- `$this->addEnvironment()` - подключение и CSS, и JS

Если не передавать имя файла, подключаются файлы с именем текущего экшена.

Пример:
php
$this->addEnvironment();

Подключит index.css и index.js для текущего контроллера и проекта.

Также, можно варьировать подключение скриптов css/js. На примере подключения стилей в скрипте /Modules/Blog/Views/Project_1/Index/index.phtml:
php
$this->addStyle(['first' => true, 'second' => true, 'global' => false])


Данный вызов подключит седующие скрипты:
- /Modules/Blog/Public/css/Project_1/Index/first.css - значение true заставит искать в папке контроллера
- /Modules/Blog/Public/css/Project_1/Index/first.css - аналогично
- /Application/Public/css/Project_1/global.css - значение false переориентирует поиск на папку основных стилей данного проекта

Статика отдаётся через контроллер Scope:

html
<link rel="stylesheet" href="/Free/Scope/get?static=abc123.css">

Это гарантирует, что при изменении файла хеш изменится и браузер загрузит актуальную версию.

Передача данных из контроллера в представление


В контроллере данные передаются через метод append объекта представления:

php
$this->_view->append([
    'posts' => $posts,
    'title' => 'Список постов',
    'count' => count($posts)
]);

Внутри phtml-файла переданные данные становятся доступны как обычные переменные с именами, совпадающими с ключами ассоциативного массива:

php
<?php foreach ($posts as $post): ?>
    <h2><?php echo $post->getPostTitle(); ?></h2>
    <p><?php echo $post->getPostText(); ?></p>
<?php endforeach; ?>


Рекомендации по работе с представлениями


Объект View передаёт свой инстанс в phtml-файл представления. Все его методы доступны сразу, без объявления новых инстансов. Это значит, что в любом phtml-файле доступен $this, который ссылается на текущий объект представления.

Для удобства работы в IDE рекомендуется указывать типы переменных через PHPDoc:

php
/** @var \Modules\Blog\Models\Post[] $posts */
/** @var \Application\Assistance\View\View $this */

$this->addEnvironment();

Это позволяет IDE подсказывать методы для $this, а также типизировать переменные, переданные из контроллера.

Особенности


Файлы CSS и JS не кешируются браузером - при каждом изменении файла хеш меняется, и браузер загружает новую версию.

Имена файлов стилей и скриптов должны совпадать с именами экшенов контроллера, если используется автоматическое подключение через addEnvironment().

При создании нового проекта необходимо создать соответствующие папки в Views, Public/css и Public/js для каждого модуля, который будет использоваться в проекте.




Что дальше?



- ➡️ Раздел 23. Выбор js-оболочки
- ➡️ Раздел 24. Динамическая подпись
- ➡️ Раздел 25. Защита доступа