====== Введение ======
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|К оглавлению]]