Доброго всем времени суток. Сегодня мы с Вами продолжаем писать наш небольшой движок RS-MINI на котором мы в последствие соберем небольшой интернет-магазин. Сегодня в нашу задачу входит реализовать связь страниц и контроллеров. У нас для этого почти все есть. Таблицы
мы уже создали. Класс представляющий контроллер у нас тоже имеется (конечно он не дописан, но для реализации поставленной на сегодня задачи его будет достаточно) Осталось заполнить таблички rs_controller и rs_connect тестовыми данными и написать 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.
Теперь давайте свяжем контроллер с главной страницей
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
)
;
На данный момент нам важны лишь некоторые поля таблицы:
поле connect_value нам пока не нужно, но это пока
Ну вот мы и связали контроллер с страницей. Теперь нам нужно написать небольшой метод который получит эти связи, и создаст на основе них объект класса контроллер.
Как уже понятно из заголовка этого под раздела, нам нужно переписать класс 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 прикреплен один контроллер (правда пока нет информации об этом контроллере)
Ну что же. Если есть вопросы, то задавайте их в комментариях. Результат работы можете скачать в конце статьи
Всего Вам наилучшего, на сегодня все!