MVC структура SKY приложений
MVC1

По сути MVC является холдером действий (action) и моделей, а класс View обеспечивает очень удобный и универсальный алгоритм подготовки данных для TOP-VIEW. В SKY Framework базовые классы MVC находятся в файле `main/w2/view.php`. Все построено так, чтобы код приложений, выглядел максимально просто.
Файл с базовыми классами содержит четыре класса, при этом первый - Mvc является базовым для трех остальных. Это значит, что функционал, который наследуется от него будет доступен и в контроллерах, и моделях. Отовсюду, в коде приложения, имеется доступ к любым моделям: $this->t_имя_модели или $this->m_имя_модели. Инициализация моделей происходит автоматически, посредством распознавания префиксов t_ или m_ и магических методов __get() и __set(). Также имеется прямой доступ к конфигурационным данным приложения $this->s_... Если для "табличной модели" достаточно базовых классов, ее можно не определять. Автозагрузчик сделает это за вас:
... 't' == $name[0] && eval("class $name extends Model_t {}");
Все обращения к несуществующим свойствам классов, будут переадресовываться в реестр переменных объекта SKY.
В SKY нельзя (не рекомендуется) создавать переменные и свойства классов с одно-буквенным префиксом, если она не имеет специальной логики, связанной с префиксом.
Все контроллеры должны наследовать класс `Controller`, табличные модели класс `Model_t`, другие модели класс `Model_m`. Если существует класс хуков, он должен наследовать класс `Hook_base`.
На рисунке 1 ниже, показана последовательность исполнения методов в контроллерах. Если метод head_a() определен, он выполняется первым, далее главный метод контроллера и в завершении tail_a(..). Если в методах head_a() и tail_a(..) нет вызовов родительских методов, то код общего контроллера не вызывается вовсе. На рисунке 2 показана типичная последовательность выполнения методов в контроллерах с генерацией переменных для MASTER-layout, здесь указанные методы просто не определены в главном контроллере. Схема на рисунке 1 удобна для создания, например массива SVG картинок или RSS потоков или создания визуализации для печати на принтере. Вторая схема - типична для создания страниц сайта. CSN_AJAX запросы располагаются в контроллерах вместе с обычными запросами, но для них, как правило, не нужно готовить переменные для MASTER-layout, поэтому в начале метода common_c::tail_a(), обычно резонно написать:

Действия "action SUB-VIEW" могут быть вызваны из файлов представлений, с помощью инструкции Jet @view(..). Вызовы методов контроллеров из представлений, могут также происходить при использовании итераторов Jet (на основе переменных с префиксом $e_). Действия "action SUB-VIEW", могут быть составной частью обработки запросов в TOP-VIEW. Все эти механизмы предоставляют простые и богатые возможности для организации сложных отображений.
Переменные View::$v_ и View::$y_ можно заполнять и явно, присваивая или дополняя (используя оператор +=) массивы. Layout можно также явно установить написав View::layout('new_layout');. На самом деле, чаще всего будет удобно возвратить массивы из методов common_c::head_a() и common_c::tail_a(), а сменить предустаовленную layout, возвращением строки из c_somecontr::tail_c(..).
Переменные для view-представлений, определяются в контроллерах и обычно имеют один из префиксов: $v_, $y_, $h_, $k_, $e_, смотрите подробнее в узле VIEW.
При CSN-AJAX, по умолчанию, layout и body не используются, а вовремя обычных запросов layout настроена на файл `view/y_desktop.php` или `view/y_mobile.php`, а body соответствует имени контроллера, например, в контроллере c_list.php, body по умолчанию равно `list`, т.е. будет использован файл view/_list.php.
Если в контроллере сделан вывод в STDOUT с помощью echo, и выдана не пустая строка, то в $sky->body автоматически впишется пустая строка и механизм view, не будет использовать шаблон для body.
Файл с базовыми классами содержит четыре класса, при этом первый - Mvc является базовым для трех остальных. Это значит, что функционал, который наследуется от него будет доступен и в контроллерах, и моделях. Отовсюду, в коде приложения, имеется доступ к любым моделям: $this->t_имя_модели или $this->m_имя_модели. Инициализация моделей происходит автоматически, посредством распознавания префиксов t_ или m_ и магических методов __get() и __set(). Также имеется прямой доступ к конфигурационным данным приложения $this->s_... Если для "табличной модели" достаточно базовых классов, ее можно не определять. Автозагрузчик сделает это за вас:
... 't' == $name[0] && eval("class $name extends Model_t {}");
Все обращения к несуществующим свойствам классов, будут переадресовываться в реестр переменных объекта SKY.
В SKY нельзя (не рекомендуется) создавать переменные и свойства классов с одно-буквенным префиксом, если она не имеет специальной логики, связанной с префиксом.
Все контроллеры должны наследовать класс `Controller`, табличные модели класс `Model_t`, другие модели класс `Model_m`. Если существует класс хуков, он должен наследовать класс `Hook_base`.
Файлы в папке `app`
Файл или метод | Описание |
c_<contr-name>.php | типичный контроллер. <contr-name> соответствует PAGE |
c_main.php | частный случай контроллера, контроллер главной страницы, когда PAGE равно пустой строке. Кроме обработки запроса главной страницы сайта, в него рекомендуется помещать обработку CSN-AJAX, которые не "привязаны" к родительской странице (родительскому контроллеру), т.е. ajax запросы которые могут быть вызваны с произвольных страниц. |
common_c.php | общий контроллер, обычно содержит код генерации переменных для MASTER-layout в common_c::tail_a(), а также actions (методы) для SUB-VIEW, которые могут быть вызваны из разных мест (страниц) |
default_c.php | контроллер по умолчанию, содержит actions, для которых выделять отдельный файл контроллера слишком расточительно. Если определить default_c::__call(..), то абсолютно все "другие" вызовы активируют этот метод. Но этот метод можно и не определять, тогда для всех таких вызовов будет автоматически сгенерирована страница 404 |
t_<table-model>.php | табличная модель, наследует функционал базового класса для работы с таблицами в БД |
m_<just-model>.php | не табличная модель |
hook.php | класс хуков, позволяет изменять поведение ядра SKY Framework |
Методы контроллеров
a_<action-name>() | <action-name> - имя action соответствует $sky->val (или PAGE для контроллера default_c.php), не имеет смысла для common_c.php |
j_<action-name>() | аналогично но для CSN-AJAX вызовов |
empty_a() | метод, выполняющийся, когда $sky->val равно пустой строке, т.е. вместо a_() |
empty_j() | аналогично но для CSN-AJAX |
head_a() | общий метод контроллеров, выполняющийся перед всеми основными action в пределах контроллера. Если head_a() не определен, или имеется вызов parent::head_a(), то common_c::head_a() будет выполняться перед любыми вызовами в любые такие контроллеры. Для детального понимания смотрите код View::top() в файле `main/w2/view.php` |
tail_a() | аналогично, но выполняющийся после основных action |
__call() | магический метод PHP. Может активно использоваться. "Улавливает" все "остальные" вызовы в контроллер |
x_<action-name>() | <action-name> - имя action для SUB-VIEW (вспомогательного). Например в шаблонах можно написать @view(<action-name>) |
r_<action-name>() | <action-name> - имя action для SUB-VIEW, включающего функционал RED-LABEL |
Ход обработки запросов HTTP
На рисунке 1 ниже, показана последовательность исполнения методов в контроллерах. Если метод head_a() определен, он выполняется первым, далее главный метод контроллера и в завершении tail_a(..). Если в методах head_a() и tail_a(..) нет вызовов родительских методов, то код общего контроллера не вызывается вовсе. На рисунке 2 показана типичная последовательность выполнения методов в контроллерах с генерацией переменных для MASTER-layout, здесь указанные методы просто не определены в главном контроллере. Схема на рисунке 1 удобна для создания, например массива SVG картинок или RSS потоков или создания визуализации для печати на принтере. Вторая схема - типична для создания страниц сайта. CSN_AJAX запросы располагаются в контроллерах вместе с обычными запросами, но для них, как правило, не нужно готовить переменные для MASTER-layout, поэтому в начале метода common_c::tail_a(), обычно резонно написать:
001
002
003
004
<?php
if (!View::layout())
return;

Действия "action SUB-VIEW" могут быть вызваны из файлов представлений, с помощью инструкции Jet @view(..). Вызовы методов контроллеров из представлений, могут также происходить при использовании итераторов Jet (на основе переменных с префиксом $e_). Действия "action SUB-VIEW", могут быть составной частью обработки запросов в TOP-VIEW. Все эти механизмы предоставляют простые и богатые возможности для организации сложных отображений.
Возвращаемые методами контроллеров значения
значение | метод | описание |
404 | все специальные методы | генерация станицы 404 - не найдено |
<string> | head_a() | смена контроллера. Например запрос http://example.com/user запустил контроллер c_user.php, в нем функция head_a() возвратила строку "people" - это прекратит выполнение в текущем контроллере и активирует контроллер c_people.php, своеобразный роутинг |
<string> | a_some_act(), j_some_act() | устанавливает шаблон <string>, например, для `list` подключится шаблон Jet view/_list.php |
<string> | tail_a() | устанавливает layout <string>, например, для `svg` подключится layout Jet view/y_svg.php |
<array> | tail_a(), head_a() | установка переменных для View::$y_ - layout, массив дополняется |
<array> | a_some_act(), j_some_act() | установка переменных для View::$v_ - body, массив дополняется |
TRUE | все специальные методы | отключит предустановленные `body` и `layout` для методов с префиксом a_ |
NULL или отсутствие return | все специальные методы | ничего не меняет |
Переменные View::$v_ и View::$y_ можно заполнять и явно, присваивая или дополняя (используя оператор +=) массивы. Layout можно также явно установить написав View::layout('new_layout');. На самом деле, чаще всего будет удобно возвратить массивы из методов common_c::head_a() и common_c::tail_a(), а сменить предустаовленную layout, возвращением строки из c_somecontr::tail_c(..).
Переменные для view-представлений, определяются в контроллерах и обычно имеют один из префиксов: $v_, $y_, $h_, $k_, $e_, смотрите подробнее в узле VIEW.
При CSN-AJAX, по умолчанию, layout и body не используются, а вовремя обычных запросов layout настроена на файл `view/y_desktop.php` или `view/y_mobile.php`, а body соответствует имени контроллера, например, в контроллере c_list.php, body по умолчанию равно `list`, т.е. будет использован файл view/_list.php.
Если в контроллере сделан вывод в STDOUT с помощью echo, и выдана не пустая строка, то в $sky->body автоматически впишется пустая строка и механизм view, не будет использовать шаблон для body.
Смотрите также:
Новости
7 Jan 2013 GMT Проект SKY. стартовал в интернете.
18 Oct 2018 GMT Обновление null-site MVC.
11 Oct 2018 GMT Опубликовано приложение MED.CRM.SKY..
Статьи
Статус SKY.
Current version: 1.001
Coresky records: 22
Local (DEV) records: 89
Web (all) records: 105
Download: dev.php
Coresky records: 22
Local (DEV) records: 89
Web (all) records: 105
Download: dev.php