Всем доброго времени суток. Сегодня мы с Вами продолжаем работу над минимальным набором ядра для CMS RS-MINI. У нас по плану реализовать запуск главного шаблона кабинета и шаблона узла.
Мы совсем недавно реализовывали класс view.class.php (представление в RS-MINI). Если помните, в данном класса был метод getPage() который на текущий момент пустой. Этот метод призван подключить главный шаблон кабинета, и шаблон узла. Так как его написание без алгоритма поиска кабинетов был не возможен, то сейчас (после статьи «Кабинеты в системе RS-MINI») самое время его реализовать.
На текущий момент у нас нечего подключать, поэтому первым делом нам нужно создать несколько шаблонов. Так получилось, что для примера было использовано два кабинета сразу, поэтому нам нужно создать два главных шаблона кабинета (для публичного кабинета и кабинета администратора) и два шаблона узла (у нас два узла: корень и /admin/)
Давайте создадим два шаблона для главных страниц кабинетов. Я привык их называть домашними (home). Заходим в папку /project/view/pub/ и создаем там файл home.class.php вот с таким кодом:
<?php
/*
* @package RS-MINI
* @copyright (c) 2015 Alexey Glumov aka Rio-Shaman (support@rio-shaman.ru)
* @license GNU General Public License version 2; see LICENSE.txt
*
*/
namespace view\pub;
if(!defined('RS-MINI')) die();
/*
* home v 1.0
*
* шаблон project/view/pub/home
*
*/
class home extends \core\abstractview
{
/*
* получить ответ шаблона
*
* @access - public
*
*/
public function getResponse()
{
?>
Привет из публичного кабинета
<?
}
}
Думаю комментарии тут излишни, ведь кода почти нет . как Вы могли заметить, шаблон находится в папке project стало быть это шаблон главной страницы публичного кабинета (то есть главная страница сайта)
Теперь заходим в папку /rs-mini/view/admin/ и создаем там файл home.class.php вот с таким кодом:
<?php
/*
* @package RS-MINI
* @copyright (c) 2015 Alexey Glumov aka Rio-Shaman (support@rio-shaman.ru)
* @license GNU General Public License version 2; see LICENSE.txt
*
*/
namespace view\admin;
if(!defined('RS-MINI')) die();
/*
* home v 1.0
*
* шаблон rs-mini/view/admin/home
*
*/
class home extends \core\abstractview
{
/*
* получить ответ шаблона
*
* @access - public
*
*/
public function getResponse()
{
?>
Привет из кабинета администратора
<?
}
}
По папке rs-mini можно понять что это главный шаблон системного кабинета. Папка admin говорит нам о том, что это кабинет администратора.
Теперь у нас есть необходимые шаблоны узлов, нам осталось прописать их в поле map_view таблицы rs_map. Вот скуль запрос делающий это
UPDATE
`rs_map`
SET
`map_view` = 'pub.home'
WHERE
`map_id` = 1
;
UPDATE
`rs_map`
SET
`map_view` = 'admin.home'
WHERE
`map_id` = 2
;
Заметьте что шаблоны называются pub.home и admin.home. Надеюсь у Вас не возникает вопроса, как именно формируются подобные имена (если вопрос все же имеется то задавайте его, попробую пояснить подробнее)
Настал черед главных шаблонов кабинетов. Заходим в папку /project/view/pub/ и создаем файл main.class.php вот с таким кодом:
<?php
/*
* @package RS-MINI
* @copyright (c) 2015 Alexey Glumov aka Rio-Shaman (support@rio-shaman.ru)
* @license GNU General Public License version 2; see LICENSE.txt
*
*/
namespace view\pub;
if(!defined('RS-MINI')) die();
/*
* main v 1.0
*
* стартовый шаблон системы
*
*/
class main extends \core\abstractview
{
/*
* получить хтмл шаблона
*
* @access - public
*
*/
public function getResponse()
{
?><!DOCTYPE html>
<html>
<!-- ГОЛОВА -->
<head>
<title></title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="description" content="" />
<meta name="keywords" content=""/>
<meta name="generator" content="<?=CMS?> v<?=VERSION?>" />
<!-- СТИЛИ -->
<!-- СТИЛИ -->
<!-- СКРИПТЫ JS -->
<!-- СКРИПТЫ JS -->
</head>
<!-- ГОЛОВА -->
<!-- ТЕЛО -->
<body>
<?
$this->getTpl('pub.home')->run();
?>
</body>
<!-- ТЕЛО -->
</html><?
}
}
Тут имеется два момента. Первый — это имя шаблона. В отличие от шаблонов узла данное имя является системным (то есть менять имя шаблона нельзя, иначе система RS-MINI его просто не найдет). Второй момент — это вызов шаблона узла в главном шаблоне:
$this->getTpl('pub.home')->run();
Именно так можно в одном шаблоне взывать какой-то другой шаблон, правда только в том случае если система знает про существование вызываемого шаблона. Все известные шаблоны хранятся в статичном свойстве self::$tplList абстрактного класса abstractview.class.php, которое мы формировали при исполнении метода controllerRun() класса application.class.php.
Так, это был главный шаблон публичного кабинета. Теперь проделаем тоже самое для кабинета администратора. Заходим в папку /rs-mini/view/admin/ и создаем там файл main.class.php вот с таким кодом:
<?php
/*
* @package RS-MINI
* @copyright (c) 2015 Alexey Glumov aka Rio-Shaman (support@rio-shaman.ru)
* @license GNU General Public License version 2; see LICENSE.txt
*
*/
namespace view\admin;
if(!defined('RS-MINI')) die();
/*
* main v 1.0
*
* стартовый шаблон системы
*
*/
class main extends \core\abstractview
{
/*
* получить хтмл шаблона
*
* @access - public
*
*/
public function getResponse()
{
?><!DOCTYPE html>
<html>
<!-- ГОЛОВА -->
<head>
<title></title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="description" content="" />
<meta name="keywords" content=""/>
<meta name="generator" content="<?=CMS?> v<?=VERSION?>" />
<!-- СТИЛИ -->
<!-- СТИЛИ -->
<!-- СКРИПТЫ JS -->
<!-- СКРИПТЫ JS -->
</head>
<!-- ГОЛОВА -->
<!-- ТЕЛО -->
<body>
<?
$this->getTpl('admin.home')->run();
?>
</body>
<!-- ТЕЛО -->
</html><?
}
}
Теперь настало время подключить необходимые шаблоны. Используя имена шаблонов и найденный кабинет, сделать это будет не трудно. Заходим в файл view.class.php который лежит в папке /rs-mini/core/ и переписываем метод getPage() следующим образом:
/*
* получаем страницу (подключаем все нужные шаблоны)
*
* @access - private
*
*/
private function getPage()
{
// подготавливаем путь к шаблону кабинета
$mainTplClass = '\view\\' . room::getFolder() .'\\'.'main';
// формируем имя шаблона кабинета
$mainName = room::getFolder() . '.' . 'main';
// подготавливаем путь к шаблону ветки
$rootTplClass = '\view\\'.(str_replace('.', '\\', $this->tplPage));
// регистрируем в стеке шаблонов шаблон кабинета
$this->tplList[$mainName] = new $mainTplClass($this->dom);
// регистрируем в стеке шаблонов шаблон ветки
$this->tplList[$this->tplPage] = new $rootTplClass($this->dom);
// переносим все объекты шаблонов в статичное свойство
$this->tplList[$mainName]->setTplList($this->tplList);
// закрываем подключение к БД
sql::close();
// стартуем главный шаблон
$this->tplList[$mainName]->getTpl($mainName)->run();
}
Каждая строка кода расписана, так что с пониманием проблем быть не должно.
Нам осталось сделать две вещи, это подпилить метод run() класса application.class.php и поглядеть результат. Начнем с первого Вот как должен выглядеть метод run()
/*
* главный метод. запуск системы
*
* @access - public
*
*/
public static function run()
{
// поднимаем некоторые классы ядра
// объект по работе с структурой сайта
self::$map = new map();
// объект прослойка между контроллерами и вьюшкой
self::$dom = new dom();
// определяем кабинет
if (!room::setRoom())
self::notFound();
// получаем открываемую страницу
if (!self::$map->getPage())
self::notFound();
// мероприятия по объеденению унаследованных контроллеров с конечной страницей
self::unionRun();
// запускаем контроллеры
self::controllerRun();
}
я всего лишь удалил наш проверочный код из предыдущий статьи.
Теперь давайте зайдем на главную страницу сайта http://mini.test.ru/. Мы должны увидеть вот это:
Замечательно. А теперь давайте зайдем вот по такому адресу: http://mini.test.ru/admin/. Вот что мы должны увидеть:
Как ведите все работает именно так, как нужно. Если у Вас есть какие либо вопросы, то задавайте их в комментариях. Результат проделанной работы можно скачать в конце статьи.
Всего Вам наилучшего, на сегодня у меня все!