Корень MVC архитектуры - минимальный скелет.
Вся иерархическая структура MVC приложения строится на папках (категориях, директориях). Каждая папка - отдельный модуль, или часть модуля. В каждой папке есть логический файл index.php
и может содержаться файл шаблона index.phtml
. Чтобы унифицировать модули - был добавлен файл config.php
для управления настройками отдельно от логичекской части, для возможности копирования модулей отдельно от настроек внутри или между приложениями.
Папка может содержать статические файлы index.css
и index.js.
Файлы автоматически подключаются при обращении к этой части страницы. Таким образом можно избежать путаницы связаной с конфликтами в стилях или скриптах и вложить только нужный исполняемый файл в нужное место, а также экономится трафик и память браузера клиента, увеличивается скорость рендера на стороне клиента по сравнению с подгрузкой структуры сразу всего сайта
Главный каталог (корень проекта) содержит index.php
файл и .htaccess
файл, направляющий все подключения на index.php
Скелетон не накладывает ограничений на построение папок рядом с ним. Корневая папка с проектом может находится в любом месте относительно домена. Корневая папка может содержать внутри себя папки с любыми названиями, которые будут работать отдельно от фреймворка, доступных для обращения напрямую через браузер. Исключение составляет папка app
.
Папка app
- является корнем приложения. Файлы в этой папки *.php
и *.phtml
закрыты для обращения через браузер. Все приложение расположено в папке app
.
Архитектура HMVC загрушает сперва главный файл, далее логику всех загружаемых модулей по иерерхии, после происходит загрузка шаблонов всех затрагиваемых модулей
Каждый модуль может быть конечной заглушкой, или иметь форточку в загружать внутри себя подмодуль. Определение состояния странцы идет через
Программа прыгает от модуля к подмодулю в зависимости от указаний модуля родителя.
Первым делом программа ищет основу главного модуля - исполняемый файл - app/index.php
В логической части главного модуля - могут располагаться части, отвечающие за правила роутинга следующей папки относительно текущей. Допускаются ситуации поиска подстраницы по совпадению каталога с адресом запроса, либо указать страницу насильно, Можно программно эмулировать путь к другой директории, также программно принудительно указывать страницу, которая будет отображена
Форточный модуль говорит о наличии в нем модулей потомков и обязательное наличие форточки в шаблоне, там где будет включаться шаблон потомков. В Файле шаблона в месте где будет происходить визуализация подмодуля - нужно разместить
<?php include c\mvc::viewPage()?>
Роутинг к подпапкам (подмодулям) осуществляется автоматически, по совпадению с следующим сегментом/фрагментом адреса URL, если в главном логическом (php) файле модуля прописана возможность дальнейшего поиска потомков
c\mvc::controllerPage(__DIR__,$defaultPage='default',$exceptionPage=null,$routes=null);
c\mvc::nextPage($default=null,$exception=null,$__DIR__=null);
Наличие controller_page
блока в родительском логическом файле модуля говорит о том, что этот модуль содержит подмодули и обращение к ним идет по наличию папки, совпадающей с маршрутизацией
Например, при обращении site.com/module1
Сперва выполнит файл
app/index.php
Далее, найдя в нем фразу controllerPage
- будет искать файл
app/module1/index.php
Если файл существует - будет обращаться к главному логическому файлу потомка.
Если файла или папки нету - будет искать файл в папке $exceptionPage
$defaultPage
- будет показано в модуле, если при обращении к странице не указан дальнейший путь. Например при обращении к корню сайта
$routes
- Содержит массив возможных ветслений в зависимости от c\input::validate валидации. Каждый элемент может содержать массив из page - страница, куда будет направлен роут и validate - правила валидации
array(
array('page'=>'_detail','validate'=>array(array('type'=>'int'))),
array('page'=>'_new','validate'=>array(array('type'=>'in','values'=>array('new'))))
)
По завершению всех логических частей - программа будет собирать итоговый шаблон по шаблонам всех модулей в том же иерархическом порядке
Чтобы закрыть страницу из доступа по URL - достаточно использовать приватную папку. Приватные папки начинаются с символа нижнего подчеркивания _
. Например _default
; _404
. Отображение закрытого модуля возможно только при прямом указании на него в коде контроллера
Примечание: Использовать параметры роута можно только на публичной странице
Чтобы заставить маршрутизатор отобразить в форточном модуле принудительно указанную страницу в независимости от URL - используется команда
c\mvc::controllerPageForce(__DIR__,$page='default');
c\mvc::nextPageForce($page,$__DIR__=null);
Такую конструкцию можно использовать, чтобы, например, подать страницу авторизации, либо пробросить пользователя в закрытую зону, попасть в которую можно по особым условиям
Другой способ принудительно задать страницу - эмулировать подачу адреса
c\mvc::controllerRoute($route_path);
Этот вариант наиболее предпочтителен, т.к. позволяет по заданому адресу получить отображение и работу совершенно других модулей, которые могли быть загружены, если бы пользователь отправил запрос $route_path
Таким образом можно легко заменить окружение ранних модулей на любом уровне вложенности. Это полезно, например, чтобы отобразить страницу с ошибкой
Получив команду controllerRoute - программа начинает обход по всем логическим файлам заново по новому урлу, но найденные переменные все сохраняются, за исключением подключенных статических скриптов
Используя скрипты выше - вы можете установить направление подключаемых подмодулей в пути. Либо мягко, по наличию папки, либо строго по указаному адресу. Обязательно нужно следить, чтобы роутинг в каждом файле встречался лишь один раз. После выполнения роутинга скрипт не завершает свою работу и продолжает идти по файлу.
Примечание: Текущий скрипт не будет прерван, до окончания скрипта вы можете еще раз изменить эмуляцию подачи адреса. Для прерывания скрипта - используйте выражение return c\mvc::controllerRoute($route_path);
или отдельнй командой
return false;
Для возможности совершения комбинированного перехода - если папка существует - чтобы переходил на нее, если папки нет - чтобы можно было указать дополнительную логику обработчика - используется конструкция вида
c\mvc::controllerPageInstant(__DIR__);
c\mvc::nextPage();
В ответ вернется true
- если путь найден и false
, если путь не найден. В случае false
- вы можете вешать дополнительную логику и направлять пользователя при помощи controllerPageForce()
Аналогично, если требуется заложить логику относительно был ли ранее установлен маршрут в данной категории или нет - можно использовать функцию
c\mvc::isRounte();
В версии Core 3.4 появилась возможность создания каталогов как регулярных выражений. В случае, если точное совпадение не обнаружено - при включении параметра
c\mvc::$folderRegexp=true;
При вызове c\mvc::controllerPage - будет проводиться поиски папок с регулярными выражениями.
Раз речь идет о папках в файловой системе - регулярные выражения выглядят слегка модифицировано. В частности - в качестве разделителей блоков регулярного выражения - используется знак апострофа (ё на английском языке) `
Вместо * - следует использовать {1,}
Знак тире не экранируется. Вместо "-" - следует использовать "..", например `^user-[0..9]$`
Не рекомендуется использовать кирилицу в файловой системе. Вместо кирилицы (\w) - следует использовать выражение [[:alpha:]]
Среди модификаторов - Доступны только igU модификаторы.
В случае совпадения - функция вернет результат, как при использовании функции preg_match, то есть массив со всеми совпадениями
Если вам нужно использовать различные сторонние компоненты внутри одного шаблоны, другими словами - использовать несколько форточек - для сторонней форточки вы можете использовать кострукцию внутри шаблона
<?php include c\mvc::viewLayout($layout,__DIR__);?>
После этого - программа будет искать последний возможный файл с форточкой вида $layout.phtml
Каждый последующий найденный файл будет перекрывать предыдущий.
Такую конструкцию можно использовать, например, чтобы отобразить корзину в интернет магазине за пределами содержания главного шаблона, например в шапке. Другие разделы сайта не будут содержать файла с шаблоном и на его месте сам шаблон не будет отображен.
Для интернет магазина - можно дополнительно уточнять файл в зависимости от раздела. Например, на главной странице магазина можно поставить ссылку на корзину. На самой странице корзины - переопределить этот файл, чтобы он не ссылался сам на себя.
Если у вас одинаковая логическая часть, скрипты и стили и нужно в определенном случае полностью заменить только конкретный слой. Например шаблон пустой карзины выглядит совершенно по другому. Чтобы не писать внутри шаблона один большой IF - придумана конструкция вида
c\mvc::setViewPageName(__DIR__,'empty_cart');
Данное выражение приведет к тому, что вместо шаблона index.phtml на конкретном уровне - будет отображен шаблон empty_cart.phtml
Пользователю предоставляется возможность также управлять слоями. Всегда можно не науладывать слои, которые уже были включены ранее и выдать текущую подпапку, как главную, или убрать промежуточный слой в зависимости от логики приложения.
Таким образом можно сделать админку без шапки главной страницы сайта, либо авторизацию с отличающийся шапкой.
Для управления слоями существуют 2 команды
c\mvc::layoutStartWith(__DIR__);
Назначает отображение слоев начиная с происвольной папки. Предположительно можно использовать на более грубоких уровнях, чем исходный каталог
c\mvc::layoutParentRemove();
c\mvc::layoutRemove();
Уничтожают родительский и текущий слой страницы. Можно использовать как на уровне самой страницы, так и на подуровне
Переключение Родитель-потомок происходит в момент использования роутинга c\mvc::controllerPage...
.
Все ссылки в проекте строятся относительно базовой директории (корня проекта)
у пользователя есть несколько способов получить относительную ссылку для страницы, или ссылку внутри файловой системы
// файловая ссылка на корень проекта
c\mvc::$base__DIR__; // /var/www/.../folder
// базовая url ссылка
c\mvc::$basefolder; // /
// относитальная url ссылка на текущую директорию
c\mvc::getUrl(__DIR__); // folder1/subfolder/
// абсолютная url ссылка на текущую директорию
c\mvc::getAbsoluteUrl(__DIR__); // http://site.ru/folder1/subfolder/
// относительная ссылка на файловую структуру
c\mvc::getRealDir(__DIR__); // folder1/_default/
c\mvc::getRealDir(__DIR__,$withApp=true); // app/folder1/_default/
Каждый раз, когда вы вызываете controllerPage конструкцию - вам возвращается часть сегмента URL, который был проанализирован для принятия решения.
В случае, если нужно получить полный путь URL - вы можете использовать переменную
c\mvc::$links_string
Если вам нужно получить весь оставшийся хвост параметров, для конечного модуля, но с логикой, например вы хотите через url передавать динамическое содержимое - вы можете использовать выражение
c\mvc::getRemaningParams(); // as string
c\mvc::getParams(); // same
c\mvc::getParamsAsString(); // same
c\mvc::getParamsAsArray(); // as array
c\mvc::getVars(); // same
Для получения следующего по счету сегмента - используется команда
c\mvc::routeNext();
Примечание: Если вы заранее разделили страницу без параметра в папку _default, а страницу с id содержимого через папку _id и хотите получить этот id - нужно использовать ранее описанное выражение
$id=c\mvc::controllerPage(__DIR__, '_default','_id');
Первым всегда запускается главный файл приложения index.php
В этом файле происходит начальная конфигурация, подключение композера, или главного файла фреймворка, инициализация самого приложения, шаблонов и вывод всего на экран
При инициализации приложения - первостепенно происходит подключение логических файлов в каждой папке, собираемая по полному URL
Логические файлы подключаются в следующем порядке при наличии условий
Также ищутся в папке статические файлы index.css и index.js, включаются в буфер включенных файлов
После прохождения всех папок и файлов до конечного следования URLу
И начинается набор шаблонных частей
Шаблоны собираются похожим образом
Создано при помощи сервиса Core CMS