Привет мир на RS-MINI

 

Всем доброго времени суток. Сегодня у нас некое заключения первой части цикла статей по созданию интернет-магазина на самописном движке RS-MINI. CMS еще не полностью укомплектована, нам еще многое необходимо сделать, но самый главный функционал (это я про реализацию трех составляющих MVC) уже имеется, и это позволит писать системные модули, дабы упростить в дальнейшем создание сайтов.

В скором будущем у нас появятся много всяких инструментов которые будут нам помогать принимать, обрабатывать некоторые присланные данные, облегчать работу движка и многое другое. Но это будет потом, а сейчас я предлагаю посмотреть работу CMS RS-MINI реализовав небольшой тестовый модуль который выведет нам сообщение «Привет мир!!!»

Чистим движок

Для начала нам необходимо произвести небольшую чистку. В частности это касается нашей базы данных. Я подготовил несколько скуль запросов, которые помогут нам в этом. Я решил пока оставить только один узел, а именно корень, а так же переподключить наш тестовый контроллера pub.test.intro. Вот скуль запросы:

чистим полностью таблицу rs_connect

TRUNCATE TABLE `rs_connect`;

Подключаем контроллер pub.test.intro с параметрами:

  • active: enable
  • tpl: 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 (он у нас уже имеется)

Реализация модуля pub.test

Хоть работа модуля заключается лишь в формирования приветствия, мы будет реализовывать все по самой сложной схеме, а именно с применением 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() в объекте шаблона контроллера.

Заключение

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

привет мир

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

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

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

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

 

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

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

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