Наследования контроллеров

 

Всем доброго времени суток. Сегодня мы начнем разбирать наследования контроллеров в CMS RS-MINI. Для чего необходимо это самое наследования?

Как Вы уже могли догадаться, система базируется на принципе подключения разных кусочков php кода (контроллеров). Эти кусочки отвечают как за отображении какой-либо формы или текста на странице, так и за решение внутренних нужд системы, таких как разграничение доступа например.

В текущих условиях для того что бы контроллер, разграничивающий доступ к сайту, работал на всех узлах (страницах), нам придется подключить (связать страницу с контроллером через таблицу rs_connect) его на каждый узел (страницу), что согласитесь очень не удобно.

Сейчас у нас имеется алгоритм который поднимает объект класса page.class.php для каждого узла из пути в адресной строке. Каждый объект класса page.class.php, поднимает объекты контроллеров которые подключены к этой странице. Нам по сути нужно написать такой функционал который позволил бы переносить объекты контроллеров из одного объекта page.class.php в другой объект page.class.php.

Но нам не достаточно просто перенести контроллер, нужно еще перенести параметры этого контроллера. В боевых условиях можно будет наблюдать два варианта развития ситуации.

У дочернего узла нет наследуемого контроллера

Это первый вариант, именно сейчас мы его и наблюдаем. У нас в базе есть два узла

  • корень (главная)
  • и узел test_alias

К корню у нас прицеплен контроллер pub.test.intro (который должен передаться по наследству), а вот к узлу test_alias у нас нет подключений вообще. Стало быть контроллер с главной страницы должен перекочевать со всеми своими параметрами в страницу test_alias

наследование контроллера целиком

На изображении узел test_alias (если Вы не забыли он у нас динамичный) представлен в виде страницы с псевдонимом about, и в него был перенесен контроллер со всеми своими параметрами

У дочернего узла есть наследуемый контроллер

Это второй вариант, его можно наблюдать в тот момент когда наследуемый контроллер на дочернем узле необходим но с измененным значением параметра (или параметров).

В пример можно подать тот же контроллер разграничения доступа. К публичной части сайта доступ имеют все, стало быть у контроллера будет параметр говорящий об этом. Например access: 0. Параметр access с значение ноль будет говорить системе о том что к странице имеют доступ все. А вот на узел admin мы повесим тот же контроллер но у же с параметром access: 3, что будет говорить системе о том, что страницу могут глядеть только те пользователи у которых доступ равен трем (акки админов)

Все это можно представить как-то так

наследование nтолько параметров контроллера

при условии что на узел test_alias (он же about) будет прикручен контроллер pub.test.intro с параметрами

  • active: enable
  • param2: value3

Мы видим, что у узла 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.

Метод unionController() в классе page.class.php

Данный файл находится в папке /rs-mini/core/, вот набросок этого метода

    /*
     * метод перезаписывает существующий контроллер вместе с параметрами
     *
     * @access - public
     *
     * @param array inhControllerList - массив с унаследованными контроллерами
     */

    public function unionController($inhControllerList)
    {
        
    }

Метод unionRun() в классе application.class.php

Вот код этого метода (файл 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 будет, в списках контроллеров, красоваться контроллер который подключен только на главной странице и передан по наследству.

Если у Вас есть какие-либо вопросы то пишите их в комментариях. Результат работы, Вы как всегда может найти в конце статьи

Всего Вам наилучшего, на сегодня все!

Прикрепленные файлы

 

Возможно Вам будут интересны следующие заметки

Комментарии (2)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
Вы не подтвердили условия политики конфиденциальности.
jimi33, 19 Ноября 2017 г. 22:13 пишет:
Читатель
Приветствую. Выдает ошибку Notice: Trying to get property of non-object в строке if ($controller->controllerInherit == 'true') когда я ставлю адрес http://mini.test.ru/123/ . При http://mini.test.ru/ всё нормально. Скорее всего $controllerList содержит только контроллер главной страницы?
Алексей, 11 Декабря 2017 г. 10:51 пишет:
Автор
Доброго времени суток. Проблема с нотисом так и не решилась?
Ответ для пользователя: jimi33