Всем доброго времени суток. Мы продолжаем работать над наследованием контроллеров в CMS RS-MINI. Сегодня нам предстоит написать один довольно крупный метод, который позволит перенести контроллер из одного объекта класса page.class.php в другой подобный объект. Этот метод будет обслуживать три варианта событий, давайте с начало поговорим о них, а уже потом я продемонстрирую код метода (он хорошо задокументирован)
В боевых условиях такое бывает очень редко, но все же бывает. В таком случае поведение метода будет очень простым, он просто сохранит объект контроллера со всеми параметрами, без каких либо свистоплясок. Пожалуй единственное что он сделает — это переключит свойство inheritFlag у контроллера с false на true.
Кстати, по поводу этого свойства. Нафига он нужен? По задумке, на конечной странице должно быть три блока контроллеров (Я про них уже говорил, но думаю повторить не вредно)
В каждом из блоков есть два вида контроллеров
Сделано это для того, что бы запустить с начало контроллеры которые были унаследованы, а уже потом те которые подключены на прямую.
Так вот свойство inheritFlag как раз и позволяет определить, какой перед нами контроллер (унаследованный или нет)
Этот вариант уже не редкое явление. У большинства конечных страниц заполнен лишь центральный блок, так как именно в него будет положено подключать контроллеры с ключевой ролью для страницы (вывод контента страницы)
В этом случае без свистоплясок будет перенесены только контроллеры несуществующего блока.
В данном случае метод должен найти среди контроллеров те которые подключены на прямую, поправить у них параметры и переключить свойство inheritFlag. Если наследуемого контроллера нет в списке напрямую подключенных, то метод сохранит (в свойстве controllerList) унаследованный контроллер со всеми своими параметрами.
В этой части логики нам понадобится набросок метода, который мы будем писать в следующей статье, иначе php нам попросту выдаст фатал эррор. Данный метод должен будет сливать параметры контроллеров, и именно с него мы начнем реализацию поставленной на сегодня задачи.
Этот метод должен лежать в файле controller.class.php который находится в папке /rs-mini/core/. Вот набросок этого метода:
/*
* метод перезаписывает существующие параметры
*
* @access - public
*
* @param array params - массив с унаследованными параметрами
*/
public function unionParams($params)
{
}
Ну и наконец код метода о котором сегодня идет речь (метод находится в файле page.class.php который лежит в папке /rs-mini/core/)
/*
* метод перезаписывает существующий контроллер вместе с параметрами
*
* @access - public
*
* @param array inhControllerList - массив с унаследованными контроллерами
*/
public function unionController($inhControllerList)
{
// блоки к которым цепляются контроллеры
$blocks = array('top', 'center', 'bottom');
// если у страницы вообще нет контроллеров, то просто сохраняем наследованные контроллеры на этой страницы
if (!$this->controllerList) {
// прежде чем сохранять, необходимо контроллерам отметить, что они наследники
// листаем блоки
foreach ($blocks as $block)
// если среди наследуемых контроллеров есть данный блок
if (isset($inhControllerList[$block]))
// листаем контроллеры этого блока
foreach ($inhControllerList[$block] as $inhKey => $inhController)
// отмечаем у копии объекта контроллера что он наследуемый
$inhControllerList[$block][$inhKey]->inheritFlag = TRUE;
// записываем список контроллеров в свойство
$this->controllerList = $inhControllerList;
return;
}
// если у страницы есть контроллеры
// листаем блоки
foreach ($blocks as $block)
// если среди наследуемых контроллеров есть данный блок
if (isset($inhControllerList[$block]))
// листаем список наследуемых контроллеров
foreach ($inhControllerList[$block] as $inhKey => $inhController)
// ищем есть ли на страницы такой же подключенный контроллеры
// если на странице есть листаемый блок контроллеров
if (isset($this->controllerList[$block])) {
// флаг позволяющий определить был ли найден контроллер
$found = FALSE;
// листаем контроллеры страницы
foreach ($this->controllerList[$block] as $controllerKey => $controller)
// если id контроллера страницы совпадает с id контроллера наследника
if ($controller->controllerID == $inhController->controllerID) {
// отмечаем флаг, что контроллер найден
$found = TRUE;
// отмечаем что данный контроллер унаследован
$this->controllerList[$block][$controllerKey]->inheritFlag = TRUE;
// запускаем метод который сольет параметры наследуемого контроллера и параметры
// контроллера подключенного на этой странице
$this->controllerList[$block][$controllerKey]->unionParams($inhController->getParams());
}
// если контроллер не был найден
if ($found === FALSE) {
// говорим что он унаследован
$inhController->inheritFlag = TRUE;
// записываем контроллер в стек контроллеров этой страницы
$this->controllerList[$block][] = $inhController;
}
}
// если на странице нет листаемого блока контроллеров
else {
// отмечаем унаследованный контроллер как унаследованный
$inhController->inheritFlag = TRUE;
// записываем контроллер в стек контроллеров этой страницы
$this->controllerList[$block][] = $inhController;
}
}
Теперь если перейти по ссылке http://mini.test.ru/about/ то мы должны увидеть вот такую картину:
Если Вы помните, контроллер мы подключали только на главную страницу, а дамп нам говорит, что контроллер так же существует и на страницу /about/. В данном случае отработал первый вариант события, так как у дочернего узла не было подключено ни одного контроллера метод просто перенес контроллер с родительской страницы в дочернюю.
Если у Вас есть какие либо вопросы, то задавайте их в комментариях. Результат проделанной работы Вы можете скачать в конце этой статьи
Всего Вам наилучшего, на сегодня все!