Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.
Написание модуля на 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, поэтому будем использовать объект запроса:
Для записи в базу, нам не надо придумывать велосипеды, методы 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'
)
),);
Тут мы используем наш конвертер данных, чтобы они у нас получались сразу в нужном формате. Сам конвертер у нас определен в файле 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. версия может отличаться
Поигравшись с желаемым видом графика, настройками и темой, мы можем получить приятный результат подобного вида: