Фискализация
Модульная CMS с e-commerce на PHP 8. Ядро — модули с префиксом Sys* (логин, кабинеты, страницы, меню, настройки, установщик). Прикладные модули (каталог, блог, заказы…) подключаются поверх через SysSetupModule (ZIP) или вручную в modules/.
Схема БД совместима со старой системой (v2); изменения — через SQL-миграции в docs/migrations/.
Как обрабатывается запрос
index.php— точка входа: автозагрузка, сессия, конфиг (settings.php+settings.local.php), созданиеApplication.Routerразбирает URL:- язык:
/ru/...или без префикса (UK); - зона:
frontendилиadmin(если первый сегмент —admin); - slug страницы:
index,cabinet,materialsи т.д.
- язык:
Application::dispatchSite():- загружает материал из
crm_materialsпо slug; - проверяет права (
accessvsrole); - FormGuard — первый рубеж для POST (CSRF, AJAX, права);
- вызывает главный модуль →
generate(); - подключает виджеты в слоты шаблона;
- собирает HTML через Websun + HeadMaker.
- загружает материал из
Две зоны — два шаблона
| Зона | URL | Шаблон | Кто |
|---|---|---|---|
| frontend | /, /cabinet, /blog/... |
site.template → shop |
гости, покупатели |
| admin | /admin/dashboard, /admin/materials |
site.template_admin → ecommerce |
персонал (role ≥ 3) |
- покупатель →
/cabinet(шаблон сайта, без rail-меню); - персонал →
/admin/dashboard(админ-шаблон, боковое rail-меню).
Модули
generate()— HTML в слотmain_content(или другой);metadata()— title, description;getAssets()— CSS/JS только для страниц модуля;indicators()(опционально) — счётчики для бейджей в меню.
Формы и оповещения (исправленная логика v2)
| Класс | Роль |
|---|---|
| FormGuard | middleware ядра: POST без CSRF/AJAX/прав — сразу JSON-ошибка |
| FormRequest | чтение $_POST, action, CSRF; requireAjaxPost() — второй рубеж в модуле |
| FormResponse | единый JSON: { success, message?, action? } |
- успех/ошибка формы — поле
messageв JSON → показываетuniversalform.js(alert); - после успеха —
action: URL (редирект),"reload","clearForm"; - flash в сессии в Sys-модулях не используется;
- статические блоки на странице — HTML
.alert alert-success/warning/danger.
Вспомогательные классы (includes/Libraries/)
| Класс | Назначение |
|---|---|
| HeadMaker | <head>, мета, CSS/JS модулей, CSRF, зона admin |
| PageShell | каркас админ-страниц: заголовок, тулбар списка, пагинация |
| IndicatorCollector | бейджи в меню из indicators() модулей |
| Config | merge settings.php + settings.local.php |
| Migrator | учёт и применение SQL-миграций (crm_migrations) |
| Cache, Session | кэш материалов (только access=0), сессия |
Шаблоны и UI
Продакшн-бандлы: php scripts/build-templates.php → shop.css / ecommerce.css.
Конфиг и деплой
- Публичные настройки —
config/settings.php(в git). - Секреты (БД, API) —
config/settings.local.php(не в git). - Обновление БД —
php scripts/migrate.php(только CLI). - Прикладные модули —
/admin/setup, ZIP сsetup.json.
Принципы (уроки v2)
- Две зоны, два кабинета — не смешивать покупателя и персонал.
- POST всегда через AJAX + CSRF; защита на уровне ядра и модуля.
- Язык из URL, ссылки и редиректы — с префиксом
/ru/где нужно. - Sys* — инфраструктура; бизнес — отдельные модули.
- Совместимость со старой БД + пошаговые миграции, а не «большой взрыв».
Slug в БД без admin: materials, dashboard, cabinet — зона определяется только URL.
После логина:
Каждый модуль — папка modules/ИмяМодуля/ИмяМодуля.php:
Типы: route (админ-страница), page (контент по slug), widget (слот шаблона), service (фон, без HTML — например учёт визитов).
Привязка к странице — crm_materials + crm_page_modules (виджеты в слотах , , ).
Все формы — только AJAX (class="ajax-form", скрипт universalform.js).
Цепочка на сервере:
Оповещения пользователю:
GET изменяет данные только по whitelist (/logout).
Источники стилей: templates/one (витрина), templates/eno (админка).
Слоты в default.tpl:
, , , , (только админка).
CSS: сетки .grid--4, формы .input/.textarea, админ rail .site-stick (режимы hidden / rail / pinned).