CRM CMS — краткое описание системы (напоминание)

Модульная CMS с e-commerce на PHP 8. Ядро — модули с префиксом Sys* (логин, кабинеты, страницы, меню, настройки, установщик). Прикладные модули (каталог, блог, заказы…) подключаются поверх через SysSetupModule (ZIP) или вручную в modules/.

Схема БД совместима со старой системой (v2); изменения — через SQL-миграции в docs/migrations/.

Как обрабатывается запрос

  1. index.php — точка входа: автозагрузка, сессия, конфиг (settings.php + settings.local.php), создание Application.
  2. Router разбирает URL:
    • язык: /ru/... или без префикса (UK);
    • зона: frontend или admin (если первый сегмент — admin);
    • slug страницы: index, cabinet, materials и т.д.
  3. Application::dispatchSite():
    • загружает материал из crm_materials по slug;
    • проверяет права (access vs role);
    • 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)

  1. Две зоны, два кабинета — не смешивать покупателя и персонал.
  2. POST всегда через AJAX + CSRF; защита на уровне ядра и модуля.
  3. Язык из URL, ссылки и редиректы — с префиксом /ru/ где нужно.
  4. Sys* — инфраструктура; бизнес — отдельные модули.
  5. Совместимость со старой БД + пошаговые миграции, а не «большой взрыв».

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: CRM CMS — краткое описание системы (напоминание) ,

, , , (только админка).

CSS: сетки .grid--4, формы .input/.textarea, админ rail .site-stick (режимы hidden / rail / pinned).