Всем доброго времени суток. Сегодня у нас некое заключения первой части цикла статей по созданию интернет-магазина на самописном движке RS-MINI. CMS еще не полностью укомплектована, нам еще многое необходимо сделать, но самый главный функционал (это я про реализацию трех составляющих MVC) уже имеется, и это позволит писать системные модули, дабы упростить в дальнейшем создание сайтов.
В скором будущем у нас появятся много всяких инструментов которые будут нам помогать принимать, обрабатывать некоторые присланные данные, облегчать работу движка и многое другое. Но это будет потом, а сейчас я предлагаю посмотреть работу CMS RS-MINI реализовав небольшой тестовый модуль который выведет нам сообщение «Привет мир!!!»
Для начала нам необходимо произвести небольшую чистку. В частности это касается нашей базы данных. Я подготовил несколько скуль запросов, которые помогут нам в этом. Я решил пока оставить только один узел, а именно корень, а так же переподключить наш тестовый контроллера pub.test.intro. Вот скуль запросы:
чистим полностью таблицу rs_connect
TRUNCATE TABLE `rs_connect`;
Подключаем контроллер pub.test.intro с параметрами:
INSERT INTO
`rs_connect`
(
`connect_id`,
`map_id`,
`connect_value`,
`controller_id`,
`connect_block`,
`connect_inherit`,
`connect_position`
)
VALUES
(
NULL,
'1',
'active: enable\ntpl: pub.test.intro',
'1',
'center',
'false',
'1'
)
;
Далее чистим таблицу rs_map
TRUNCATE TABLE `rs_map`;
И вставляем главную страницу
INSERT INTO
`rs_map`
(
`map_id`,
`map_parent`,
`map_alias`,
`map_name`,
`map_view`,
`map_system`,
`map_type`
)
VALUES
(
NULL,
NULL,
NULL,
'Главная',
'pub.home',
'true',
'static'
)
;
в качестве шаблона узла я указал шаблон pub.home (он у нас уже имеется)
Хоть работа модуля заключается лишь в формирования приветствия, мы будет реализовывать все по самой сложной схеме, а именно с применением MVC. «Привет мир!!!» мы будем получать с помощью модели по запросу контроллера. После чего контроллер все передаст в представление которое выведет нам сообщение на экран.
«Привет мир!!!» мы будем хранить в табличке базы данных, поэтому данную таблицу нам нужно создать. Вот скуль запрос которое это сделает:
CREATE TABLE IF NOT EXISTS `rs_text` (
`document_id` int(11) NOT NULL AUTO_INCREMENT,
`text` text NOT NULL,
PRIMARY KEY (`document_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
Теперь давайте напичкаем эту таблицу данными, вот скуль запрос:
INSERT INTO
`rs_text`
(
`document_id`,
`text`
)
VALUES
(
NULL,
'Привет'
),
(
NULL,
' мир'
),
(
NULL,
'!!!'
)
;
Наша модель, по запросу контроллера, должна произвести поиск интересующих контроллера данных. Так как в нашем примере контроллер может интересоваться только одними данными, то в модели будет лишь один метод getTextList() который сделает скуль запрос в базу данных и вернет результат контроллеру.
Вот код нашей модели (файл называется document.class.php и лежит в папке /project/modules/pub/test/model/)
<?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 pub\test\model;
if(!defined('RS-MINI')) die();
/*
* document v1.0
*
* модель отвечает за работу с таблицей rs_text
*
*/
class document extends \core\abstractmodel
{
/*
* метод получает все документы
*
* @access - public
* @return - массив или false
*
*/
public function getTextList()
{
// запрашиваем данные и возвращаем результат контроллеру
return $this->query('SELECT * FROM rs_text')->fetch();
}
}
Сам контроллер pub.test.intro у нас уже имеется, но вот функционала у него нет. Нужно это исправить. Цель контроллера собрать в доме узел testTextList с данными которые ему предоставит модель, давайте взглянем на код (файл называется intro.class.php и лежит в папке /project/modules/pub/test/controller/)
<?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 pub\test\controller;
// подключаем модель модуля
use \pub\test\model\document as document;
if(!defined('RS-MINI')) die();
/*
* intro v 1.0
*
* контроллер модуля pub.test
*
*/
class intro extends \core\abstractcontroller
{
/*
* запуск контроллера
*
* @access - public
* @return - true или false (404 ошибка)
*
*/
public function run()
{
// создаем основной узел для хранение данных
$testNode = $this->dom->addNode('testTextList');
// запрашиваем у модели необходимые данные
if (!$textList = document::create()->getTextList())
// если данных нет, то выводим 404 ошибку
return FALSE;
// если же данные были получены, то передаем их
// представлению
foreach ($textList as $text)
// внутри узла testTextList создаем еще один узел
// text
$testNode->addNode('text')
// помещаем в узел text атрибут document_id
// с значение из БД
->addAttr('document_id', $text['document_id'])
// помещаем в узел text атрибут value
// с значение из БД
->addAttr('value', $text['text'])
;
return TRUE;
}
}
Обратите внимание на строчку
// подключаем модель модуля
use \pub\test\model\document as document;
именно так мы будет подключать модели к контроллеру.
Теперь если зайти вот по такому адресу http://mini.test.ru/?dom мы должны увидеть вот такое дерево
подобная картина говорит нам о том, что контроллер получил данные у модели и передал их в представление. Нам осталось лишь написать шаблон который выведет нам эти данные.
Заходим в папку /project/modules/pub/test/view/ и правим файл intro.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 pub\test\view;
if(!defined('RS-MINI')) die();
/*
* intro v 1.0
*
* шаблон модуля pub.test
*
*/
class intro extends \core\abstractview
{
/*
* получить ответ шаблона
*
* @access - public
*
*/
public function getResponse()
{
// если в узле testTextList есть узлы text
if ($this->dom->getNode('testTextList')->count('text'))
// то листаем узлы text
foreach ($this->dom->getNode('testTextList')->getChildren('text') as $value) {
// и выводим на экран значение атрибут value
?><?= $value->getAttr('value') ?><?
}
}
}
Шаблон, в случае если в узле testTextList существуют узлы text, пролистает узлы и выведет на экран значение атрибута value узлов text.
Ну что же, почти готово, остался лишь один штрих.
На главной странице нашего сайта подключен узловой шаблон pub.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()
{
// подключаем шаблон модуля pub.test
$this->getTpl('pub.test.intro')->run();
}
}
Теперь если шаблон контроллера pub.test.intro будет известен системе RS-MINI (а он известен, так как при подключение контроллера в таблице rs_connect указан параметр tpl что позволило системе узнать про существование этого шаблона), то произойдет вызов метода run() в объекте шаблона контроллера.
Если зайти на главную страницу сайта, то мы увидим результат проделанной работы
Если у Вас есть какие либо вопросы, то задавайте их в комментариях. То, что получилось можно скачать в конце этой статьи.
На этом первую часть цикла можно считать завершенной. Далее мы будем писать саму админку системы и расширять ядро (скорее всего сначала немного расширим ядро)
Всего Вам наилучшего, на сегодня у меня все!