MVC компонент

Core Skeleton Application

Корень 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

Логические файлы подключаются в следующем порядке при наличии условий

  1. config.php - конфигурация, используется как преднастройка компонента, который как правило выделяется, чтобы можно было легко сравнивать и копировать компонент
  2. middleware.php - посредник между компонентом. В файле используется предпроверки на наличие прав доступа к разделу, единая для всех дальнейших сценариев. В файле также может быть включена предподготовка универсальных переменных
  3. translate_[lang].php - языковой файл с языковыми конструкциями
  4. ajax.php - логический файл, выполняемый только в случае ajax запроса
  5. debug.php - файл отладки, запускаемый только в режиме отладки. Используется, чтобы выпилить отладочную часть на продуктиве и не напрягать интерпретатор
  6. index.php - основной логический файл
  7. post.php - действия по передаче данных методом POST. Полезен, чтобы разгрузить основной логический файл и облегчить восприятие выискивания операций действия отправки данных от действия просмотра

Также ищутся в папке статические файлы index.css и index.js, включаются в буфер включенных файлов

После прохождения всех папок и файлов до конечного следования URLу

И начинается набор шаблонных частей

Шаблоны собираются похожим образом

  1. index.phtml - основной отображаемый файл в режиме обращения через браузер
  2. cli.phtml - основной отображаемый файл в режиме работы через командную строку

Создано при помощи сервиса Core CMS