====== Введение ====== InstantCMS является модульной системой, построенной с использованием [[https://ru.wikipedia.org/wiki/Model-View-Controller|MVC-архитектуры]]. Модульные блоки, из которых собирается функционал сайта, в InstantCMS называются **Компонентами**. В свою очередь, каждый компонент состоит из трех основных частей: [[dev:controllers|контроллера]], [[dev:models|модели]] и [[dev:models|шаблонов]]. Компонент может содержать как все эти части одновременно, так и любое их сочетание по-отдельности. ===== Автоматическая загрузка классов ===== InstantCMS автоматически загружает классы из директорий: * **system/core/** - имя класса должно начинаться на **cms**. Например, класс cms**Action**, его файл system/core/**action**.php. Это [[dev:core|системные]] классы. * **system/fields/** - имя класса должно начинаться на **field**. Например, класс field**Date**, его файл system/fields/**date**.php. Это классы полей [[dev:forms:field-file|форм]]. * system/controllers/NAME/model.php - имя класса должно начинаться на **model**. Например, класс model**Users**, его файл system/controllers/**users**/model.php. Это классы моделей контроллеров. Также поддерживаются загрузки классов по пространствам имён. namespace должен начинаться на **icms\** а дальше полный путь к файлу относительно директории **system**. Например: use icms\traits\controllers\actions\listgrid; Подключит файл system/**traits/controllers/actions/listgrid**.php В InstantCMS есть класс, управляющий автозагрузкой классов - ''cmsAutoloader'' (>= 2.17.0). Он имеет публичный метод: cmsAutoloader::register(string $namespace, string $directory) : void // Пример подключения // Первым параметром передаём базовое пространство имён библиотеки // Вторым параметром относительный путь от корня установки InstantCMS cmsAutoloader::register('PHPMailer\PHPMailer', 'system/libs/phpmailer/'); С его помощью вы можете добавлять библиотеки в очередь автозагрузки. Как правило, это будут сторонние библиотеки со своими пространствами имён. Есть предустановленная конфигурация для некоторых сторонних классов, использующихся в InstantCMS. Она находится по пути ''/system/config/autoload.php''. Не забывайте, что директория /system/config/ [[manual:security#директорияsystemconfig|может быть переопределена]]. InstantCMS [[dev:composer|поддерживает Composer]]. Предполагается, что пакеты Composer устанавливаются из корневой директории установки InstantCMS, движок ищет файл автозагрузчика Composer в **/vendor/autoload.php**. ===== Контроллеры ===== Контроллер - основная часть компонента, в которой находится вся бизнес-логика. Задача контроллера - получить запрос от пользователя, обработать его и вернуть результат (например, HTML-страницу или JSON). Каждый компонент может иметь 2 контроллера - frontend и backend, которые работают в пользовательской и административной части сайта соответственно. ===== Модели ===== Модель - часть компонента, содержащая логику по извлечению, изменению и сохранению данных. Модель получает запросы из контроллера и возвращает ему результаты из базы данных, либо наоборот, сохраняет изменения в базе. ===== Шаблоны ===== Шаблоны служат для форматирования данных перед выводом их пользователю. Шаблон содержит в себе HTML-разметку и минимум программного кода - только в том объеме, который необходим для форматирования вывода. Данные в шаблон передаются контроллером. ===== Схема работы ===== Каждый запрос пользователя (открытие страницы в браузере) запускает следующий рабочий процесс: - Запускается файл **index.php**; - **Роутер** определяет какой **компонент** был запрошен и запускает его контроллер; - **Контроллер** получает параметры запроса из URL, либо из формы заполненной пользователем; - **Контроллер** получает (или сохраняет) данные через **модель**; - **Контроллер** обрабатывает данные необходимым образом; - **Контроллер** вызывает **шаблон** и передает в него полученные (или обработанные) данные; - **Шаблон** формирует конечную HTML-страницу, которая возвращается пользователю. Таким образом, основная логика (большая часть кода) находится в контроллере. В следующих разделах документации мы разберем более детально устройство контроллеров, моделей и шаблонов. ---- [[dev:start|К оглавлению]]