Всем доброго времени суток. Сегодня мы начнем разбирать наследования контроллеров в CMS RS-MINI. Для чего необходимо это самое наследования?
Как Вы уже могли догадаться, система базируется на принципе подключения разных кусочков php кода (контроллеров). Эти кусочки отвечают как за отображении какой-либо формы или текста на странице, так и за решение внутренних нужд системы, таких как разграничение доступа например.
В текущих условиях для того что бы контроллер, разграничивающий доступ к сайту, работал на всех узлах (страницах), нам придется подключить (связать страницу с контроллером через таблицу rs_connect) его на каждый узел (страницу), что согласитесь очень не удобно.
Сейчас у нас имеется алгоритм который поднимает объект класса page.class.php для каждого узла из пути в адресной строке. Каждый объект класса page.class.php, поднимает объекты контроллеров которые подключены к этой странице. Нам по сути нужно написать такой функционал который позволил бы переносить объекты контроллеров из одного объекта page.class.php в другой объект page.class.php.
Но нам не достаточно просто перенести контроллер, нужно еще перенести параметры этого контроллера. В боевых условиях можно будет наблюдать два варианта развития ситуации.
Это первый вариант, именно сейчас мы его и наблюдаем. У нас в базе есть два узла
К корню у нас прицеплен контроллер pub.test.intro (который должен передаться по наследству), а вот к узлу test_alias у нас нет подключений вообще. Стало быть контроллер с главной страницы должен перекочевать со всеми своими параметрами в страницу test_alias
На изображении узел test_alias (если Вы не забыли он у нас динамичный) представлен в виде страницы с псевдонимом about, и в него был перенесен контроллер со всеми своими параметрами
Это второй вариант, его можно наблюдать в тот момент когда наследуемый контроллер на дочернем узле необходим но с измененным значением параметра (или параметров).
В пример можно подать тот же контроллер разграничения доступа. К публичной части сайта доступ имеют все, стало быть у контроллера будет параметр говорящий об этом. Например access: 0. Параметр access с значение ноль будет говорить системе о том что к странице имеют доступ все. А вот на узел admin мы повесим тот же контроллер но у же с параметром access: 3, что будет говорить системе о том, что страницу могут глядеть только те пользователи у которых доступ равен трем (акки админов)
Все это можно представить как-то так
при условии что на узел test_alias (он же about) будет прикручен контроллер pub.test.intro с параметрами
Мы видим, что у узла about образуются не два параметра (которые я описал выше) а три, один из которых (param1 с значение value1) перекочевал из родительского узла. При этом, в отличии от параметров корневого контроллера, у узла about параметр param2 теперь равен не value2 а value3
У нас имеется объект класса map.class.php в свойстве которого (свойство pageList) лежат все объекты узлов. У каждого объекта страницы есть свойство controllerList в котором лежат объекты контроллеров. У каждого объекта контроллера есть свойство controllerInherit которое говорит нам, наследуемый ли контроллер или нет. Задача заключается в том, что бы пролистать все объекты страниц (объект класса page.class.php), отыскать в каждом объекте все контроллеры чье свойство controllerInherit имеет значение true, и передать эти контроллеры в следующий объект page.class.php.
За логику объединений контроллеров будет отвечать спец метод в классе page.class.php (у нас его пока нет, но сегодня мы создадим его, пока что пустым) А за логику объединений параметров будет отвечать спец метод в классе контроллеров. Его мы будем писать немного позднее.
Но прежде чем что-то с чем-то объединять, нам необходимо с начало получить то что будем объединять А за это будет отвечать метод unionRun() который расположится в классе application.class.php.
Данный файл находится в папке /rs-mini/core/, вот набросок этого метода
/*
* метод перезаписывает существующий контроллер вместе с параметрами
*
* @access - public
*
* @param array inhControllerList - массив с унаследованными контроллерами
*/
public function unionController($inhControllerList)
{
}
Вот код этого метода (файл application.class.php лежит в папке /rs-mini/core/)
/*
* метод добавляет унаследованные контроллеры в вложенные страницы
*
* @access - private
*
*/
private static function unionRun()
{
// массив с контроллерами которые отмечены как наследуемые.
// при первой итерации массив пуст
$inherit = array();
// листаем страницы
for ($key = 0; isset(self::$map->pageList[$key]); $key++) {
// если массив хранящий контроллеры которые передаются по наследству не пуст
// то запускаем спец метод который запишет унаследованные контроллеры
// в обрабатываемую страницу (при первой итерации этот массив пуст)
if (!empty($inherit)) {
// сливаем контроллеры родительской страницы и текцщей
self::$map->pageList[$key]->unionController($inherit);
// сбрасываем массив
$inherit = array();
}
// если на странице есть контроллеры
if (self::$map->pageList[$key]->controllerList)
// листаем блоки контроллеров
foreach (self::$map->pageList[$key]->controllerList as $block => $controllerList)
// листаем контроллеры блока
foreach ($controllerList as $controller) {
// если итерация страниц не последняя (т.е. если страница не последняя)
if ($key != (count(self::$map->pageList) - 1))
// если контроллер отмечен как наследуемый
if ($controller->controllerInherit == 'true')
// заносим объект контроллера в массив inherit
// для передачи этого объекта по наследству в
// дочернию страницу
$inherit[$block][] = $controller;
}
}
}
ну и соответственно этот метод необходимо вызвать.
/*
* главный метод. запуск системы
*
* @access - public
*
*/
public static function run()
{
// поднимаем некоторые классы ядра
// объект по работе с структурой сайта
self::$map = new map();
// объект прослойка между контроллерами и вьюшкой
self::$dom = new dom();
// стартуем подключение к БД
sql::setConnect();
// получаем открываемую страницу
if (!self::$map->getPage())
self::notFound();
// мероприятия по объеденению унаследованных контроллеров с конечной страницей
self::unionRun();
// тест работы роутинга
// просматриваем массив объектов страниц
?><xmp><?
var_dump(self::$map->pageList);
?></xmp><?
}
Пока что эти изменения нигде не видны. Позже, когда мы реализуем само объединение контроллеров на нашей странице test_alias будет, в списках контроллеров, красоваться контроллер который подключен только на главной странице и передан по наследству.
Если у Вас есть какие-либо вопросы то пишите их в комментариях. Результат работы, Вы как всегда может найти в конце статьи
Всего Вам наилучшего, на сегодня все!