+7 495 008 8452 пн.-пт. 10:00 – 17:00
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Написание модуля на D7+ORM

Всем привет, давно хотел написать данную простенькую статейку, но все не находил времени.
Итак, всем известно (или почти всем), что уже в продукте есть и новое ядро, ORM и все это постепенно улучшается. Так вот, сегодня я вам расскажу какая примерно последовательность создания модулей на новом ядре с использованием ORM. Отчасти затрону использование amCharts, который идет в поставке как КП, так и БУС, и вы можете использовать его в полном объеме.

Структура файлов
Так как модуль для локального использования, то будем использовать папку local в корне сайта, которая стала доступна с 14 версии ядра.
Мой модуль называется my.ticketstat, так и называется папка модуля, размещенная в /local/modules/. В ней у нас примерно стандартный набор, это папки: admin, install, lang, lib. Отдельно заострим внимание на lib - теперь никаких папок classes и прочего. Тут у нас будет хранится основная логика модуля, и это нам позволит использовать namespace с автоподгрузкой при вызове.

Логика работы модуля
Логика будет достаточно простая:
1. Принять данные.
- данные будут приходить из внешнего источника, поэтому будет использоваться публичный скрипт.
2. Отдать обработанные данные.
- данные отдаются в виде json, с последующей обработкой и построением графика в amCharts.

База данных
База у нас будет очень простая, всего с двумя полями (integer и datetime).
Для её описания в ORM воспользуется пока скрытыми возможностями модуля производительности, а именно, работы с таблицами.
Добавляем GET параметр orm=y и у каждой таблицы в контекстном меню добавляется пункт ORM.
На выходе получаем почти готовые данные для описания таблицы. После некоторых изменений, у нас остается:

    namespace My\Ticketstat;

    use Bitrix\Main\Entity;
    use Bitrix\Main\Localization\Loc;
    Loc::loadMessages(__FILE__);

    /**
     * Class StatTable
     * 
     * Fields:
     * <ul>
     * <li> COUNT int mandatory
     * <li> TIME datetime optional
     * </ul>
     *
     * @package Bitrix\Data
     **/

    class StatTable extends Entity\DataManager
    {
        public static function getFilePath()
        {
            return __FILE__;
        }

        public static function getTableName()
        {
            return 'bx_custom_stat';
        }

        public static function getMap()
        {
            return array(
                'COUNT' => array(
                    'data_type' => 'integer',
                    'primary' => true,
                    'required' => true,
                    'title' => Loc::getMessage('STAT_ENTITY_COUNT_FIELD'),
                ),
                'TIME' => array(
                    'data_type' => 'datetime',
                    'title' => Loc::getMessage('STAT_ENTITY_TIME_FIELD'),
                ),
            );
        }
    }

можно считать, что пол дела сделано
Работа с данными
Для начала нам надо получить данные, и записать их в нашу базу данных.
За это у нас будет отвечать файл tools/stat_add.php.
Необходимые значения будут передаваться через GET, поэтому будем использовать объект запроса:

    $context = \Bitrix\Main\Application::getInstance()->getContext();
    $request = $context->getRequest();
    $request->get('text');

Для записи в базу, нам не надо придумывать велосипеды, методы ORM у нас уже есть на вооружении, достаточно ими воспользоваться:

    \My\Ticketstat\StatTable::add(array(
        'COUNT' => $count,
        'TIME' => new \Bitrix\Main\Type\DateTime(null,0)
    ));
 

Как видно, все гениальное - просто!
Теперь на очереди получение данных, за это у нас отвечает файл tools/get_stat.php.
Данные могут отдаваться за определенный день:

    $filter = array('><TIME' => array(
                    new \Bitrix\Main\Type\DateTime(
                               date($request->get('date').' 00:00:00'),
                            'Y-m-d H:i:s'
                        ),
                    new \Bitrix\Main\Type\DateTime(
                            date($request->get('date').' 23:59:59'),
                            'Y-m-d H:i:s'
                        )
                ),);

так и от определенного времени:

    $filter = array('>=TIME' => new \Bitrix\Main\Type\DateTime(
                    date('Y-m-d '.$request->get('time')),
                    'Y-m-d H:i:s'
                ),);

И фильтр идет в наш GetList, который мы также сами не писали:

    $arStat = \My\Ticketstat\StatTable::getList(array(
            'select' => array("COUNT","TIME"),
            'order' => array("TIME"=>'asc'),
            'filter' => $filter,
        ));
    while ($stat = $arStat->fetch(new \My\Ticketstat\TestConverter))
    {
        $result[] = $stat;
    }

Тут мы используем наш конвертер данных, чтобы они у нас получались сразу в нужном формате.
Сам конвертер у нас определен в файле lib/testconverter.php:

    namespace My\Ticketstat;

    class TestConverter extends \Bitrix\Main\Text\Converter
    {
        public function encode($text, $textType = "")
        {
            if ($text instanceof \Bitrix\Main\Type\DateTime)
                return $text->format('Y-m-d H:i:s');

            return \Bitrix\Main\Text\String::htmlEncode($text);
        }

        public function decode($text, $textType = "")
        {
            if (is_object($text))
                return $text;

            return \Bitrix\Main\Text\String::htmlDecode($text);
        }
    }

как видно, ничего сложного.
В начале я упоминал про amCharts. Вот его то мы и будем использовать для вывода наших данных.
Честно говоря, мне сильно наскучили графики, которые выводятся как единая картинка. А тут у нас готовая библиотека для построения красивых и динамичных графиков и прочего.
Всего-то нам надо подключить:
/bitrix/js/main/amcharts/3.3/amcharts.js
/bitrix/js/main/amcharts/3.3/serial.js


P.S. версия может отличаться
Поигравшись с желаемым видом графика, настройками и темой, мы можем получить приятный результат подобного вида:
shot_896.png

Назад в раздел

Подписаться на новые материалы раздела:














CAPTCHA