Реализуем связь страниц и контроллеров

 

Доброго всем времени суток. Сегодня мы с Вами продолжаем писать наш небольшой движок RS-MINI на котором мы в последствие соберем небольшой интернет-магазин. Сегодня в нашу задачу входит реализовать связь страниц и контроллеров. У нас для этого почти все есть. Таблицы

  • rs_map
  • rs_controller
  • и rs_connect

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

Заполняем тестовые данные

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

Sql запрос на регистрацию контроллера

Давайте я опубликую Вам sql запрос регистрации контроллера в системе

INSERT INTO
    `rs_controller`
    (
        `controller_id`,
        `controller_name`
    )
    VALUES
    (
        NULL,
        'pub.test.intro'
    )
;

Обратите внимание на имя контроллера (про них мы уже говорили, но все же повторю еще раз). Имена строятся по заведомо известным правилам. Первые два слова (соединенные точкой) а именно pub.test являются именем модуля. Все что следует после этих двух слов, а в нашем примере это intro — путь до класса контроллера. Система будет понимать данную запись, и ориентируясь на это имя создаст путь до контроллера. В нашем случае контроллер должен лежать вот по такому пути:

/project/modules/pub/test/controller/intro.class.php

Почему именно папка project? Наш автозагрузчик не найдет папку pub нигде кроме папки project. Обратите внимание что после .../pub/test/ идет папка controller. Система тоже будет знать, что первые два слова это имя модуля. Поэтому после них он добавит слово controller.

Sql запрос на создании связи контроллера и страницы

Теперь давайте свяжем контроллер с главной страницей

INSERT INTO
    `rs_connect`
    (
        `connect_id`,
        `map_id`,
        `connect_value`,
        `controller_id`,
        `connect_block`,
        `connect_inherit`,
        `connect_position`
    )
    VALUES
    (
        NULL,
        1,
        NULL,
        1,
        'top',
        'true',
        1
    )
;

На данный момент нам важны лишь некоторые поля таблицы:

  • map_id — собственно это указание на какую страницу крепить контроллер
  • controller_id — указание на контроллер который скрепляется с страницей
  • connect_block — блок в котором разместится контроллер. Я уже говорил что блоков у нас будет три: верхний, центральный и нижний. Данный контроллер мы прикрепим к верхнему блоку (просто так захотелось Улыбаюсь)
  • connect_inherit — как я уже говорил, этот контроллер будет наследоваться для дочерних страниц. Именно поэтому в это поля я послал true
  • connect_position — от этого поля будет зависеть очередность запуска контроллера. Так как на странице это первый контроллер, то помещаем в это поле единицу

поле connect_value нам пока не нужно, но это пока Улыбаюсь

Редактируем класс page.class.php

Ну вот мы и связали контроллер с страницей. Теперь нам нужно написать небольшой метод который получит эти связи, и создаст на основе них объект класса контроллер.

Как уже понятно из заголовка этого под раздела, нам нужно переписать класс page.class.php. Если помните, он у нас содержит лишь свойства и конструктор. В предыдущем посте мы получили данные которые нужно перенести в эти свойства. Давайте перепишем конструктор для класса page.class.php (если Вы забыли, то файл лежит в папке /rs-mini/core/)

    /*
     * контсруктор. получаем свойства страницы
     *
     * @access - public
     *
     * @param array page - массив с инфой о странице
     */
    
    public function __construct(&$page)
    {
        // id страницы (из таблицы rs_map)
        $this->pageID              = $page['map_id'];
        // псевдоним страницы (из таблицы rs_map или из урла
        // зависит от того статиная (из таблицы rs_map)
        // или динамичная (из урла) страница)
        $this->pageAlias           = $page['map_alias'];
        // имя страницы (из таблицы rs_map)
        $this->pageName            = $page['map_name'];
        // шаблон страницы (из таблицы rs_map)
        $this->pageView            = $page['map_view'];
        // родитель страницы (из таблицы rs_map)
        $this->pageParent          = $page['map_parent'];
        // статичная или динамичная страница (из таблицы rs_map)
        $this->pageType            = $page['map_type'];
        // реальный псевдоним страницы (сохраненный в
        // поле map_alias таблицы rs_map). Если страница статичная
        // то в ключе dynamic_alias массива $page находится NULL
        $this->pageDynamicAlias    = $page['dynamic_alias'];
    }

Как видите мы лишь раскидали присланные в конструктор данные. Но свойство controllerList у нас по прежнему пустое. Его мы будем заполнять с помощью метода getController() который сейчас напишем. Смысл метода прост, получить все контроллеры привязанные к станице, и раскидать эти контроллеры по блока (верхний, центральный и нижний). Вот код этого метода:

    /*
     * метод получаем контроллеры страницы
     * задача сформировать вот такой массив:
     *      [top]
     *          [0] => object core\controller
     *          [1] => object core\controller
     *          [2] => object core\controller
     *      [center]
     *          [0] => object core\controller
     *          [1] => object core\controller
     *          [2] => object core\controller
     *      [bottom]
     *          [0] => object core\controller
     *          [1] => object core\controller
     *          [2] => object core\controller
     *
     *
     * @access - private
     * @return - массив с контроллерами или false
     *
     */
    
    private function getController()
    {
        // получаем список подключенных контроллеров к станице
        $sql = ''
            . 'SELECT'
                . ' connect.connect_id           AS connect_id,'
                . ' connect.connect_value        AS connect_value,'
                . ' connect.connect_block        AS connect_block,'
                . ' connect.connect_inherit      AS connect_inherit,'
                . ' connect.connect_position     AS connect_position,'
                
                . ' connect.map_id               AS map_id,'
                
                . ' connect.controller_id        AS controller_id,'
                . ' controller.controller_name   AS controller_name'
            . ' FROM'
                . ' rs_connect                   AS connect,'
                . ' rs_controller                AS controller'
            . ' WHERE'
                . '     connect.map_id           = \'' . $this->pageID . '\''
                . ' AND connect.controller_id    = controller.controller_id'
            . ' ORDER BY connect_position'
        ;

        // если список подключений пуст
        if (!$connectList = sql::query($sql)->fetch())
            // выходим из метода
            return FALSE;
            
        // формируем массив из объектов контроллеров
        // список конроллеров
        $controllerList = array();
        // блоки к которым цепляются контроллеры
        $blocks         = array('top', 'center', 'bottom');
        
        // листаем блоки
        foreach ($blocks as $block)
            // листаем список подключений
            foreach ($connectList as $connect)
                // если блок подключения равен блоку итерации
                if ($connect['connect_block'] == $block)
                    // поднимаем объект контроллера на основе данных подключения
                    $controllerList[$block][] = new controller($connect);
        
        return $controllerList;
    }

Метод хорошо задокументирован и думаю проблем в понимании быть не должно.

Ну что же, нам осталось лишь вызвать этот метод из конструктора (я показываю лишь отрывок. Полный код можно посмотреть в архиве в конце статьи)

        // реальный псевдоним страницы (сохраненный в
        // поле map_alias таблицы rs_map). Если страница статичная
        // то в ключе dynamic_alias массива $page находится NULL
        $this->pageDynamicAlias    = $page['dynamic_alias'];

        // получаем контроллеры страницы
        $this->controllerList = $this->getController();
    }

Заключение

Теперь, если перейти на главную страницу, мы увидим вот такую картину

дамп главной странице

Данный дамп говорит на о том, что на главной странице в блок top прикреплен один контроллер (правда пока нет информации об этом контроллере)

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

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

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

 

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

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

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
К данной статье пока нет комментариев.