Страница 8 из 12

Re: Строим графики Highstock

Добавлено: Чт фев 02, 2017 8:54 am
Ko/|xo3HUk
У меня сервак под линуксом, там другие пути. На картинке вверху написан путь до файла.

Re: Строим графики Highstock

Добавлено: Вс фев 19, 2017 4:50 pm
Ko/|xo3HUk
Решил подкорректировать немного сценарий jconhs для того, чтобы данные в график загружались не с самого начала работы сервера, а только за последний месяц, т.к. если данных очень много - довольно таки долго строится такой график.
СпойлерПоказать

Код: Выделить всё

// Получить имя и проверить
 if ( isset($params['name'])  ) { $name = $params['name']; } else { returm; }
 // Разбить на объект и свойство
 $name = explode('.', $name);

// Получаем текущее время:
 $end_time=time();
 $start_time = $end_time-31*24*60*60; // 1 месяц

// Получить объект по имени
 $obj=getObject($name[0]); 
 // Получить id свойства
 $prop_id=$obj->getPropertyByName($name[1], $obj->class_id, $obj->id);
 // Получаем VALUE_ID для следующей таблицы
 $pvalue=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$obj->id."'");
//DebMes("Запрос = : ".$pvalue); // После этого в XRay во вкладке debug можно смотреть результат. 
// Получаем таблицу
 $arr_s = SQLSelect("SELECT UNIX_TIMESTAMP(ADDED) as ADDED, VALUE FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' AND ADDED>=('".date('Y-m-d H:i:s', $start_time)."') AND ADDED<=('".date('Y-m-d H:i:s', $end_time)."') ORDER BY ADDED");

 // Собрать структуру JSON
 $st = $params['callback'].'([';
 foreach($arr_s as $s) {
   if ($f) { $st .=','; }
   $st .= '['.$s['ADDED'].'000,'.$s['VALUE'].']' ;
   $f=1;
 }
 $st .= '])';

 // Ответ
 echo ($st); 
//DebMes("Собрать структуру JSON: ".$st); // После этого в XRay во вкладке debug можно смотреть результат.
 

Re: Строим графики Highstock

Добавлено: Вс фев 19, 2017 5:37 pm
Ko/|xo3HUk
Всё-таки мне захотелось сделать настраиваемый период данных для графиков.
Создал объект Highstock:
СпойлерПоказать
1.png
1.png (37.24 КБ) 7929 просмотров
Создал свойство jsonhs_period:
СпойлерПоказать
2.png
2.png (27.05 КБ) 7929 просмотров
Создал новый пункт меню (тип: select):
СпойлерПоказать
3.png
3.png (56.06 КБ) 7929 просмотров
Добавил новое свойство Highstock.jsonhs_period в сценарий jsonhs:
СпойлерПоказать

Код: Выделить всё

// Получить имя и проверить
 if ( isset($params['name'])  ) { $name = $params['name']; } else { returm; }
 // Разбить на объект и свойство
 $name = explode('.', $name);

// Получаем текущее время:
 $end_time=time();
 $start_time = $end_time-gg("HighStock.jsonhs_period")*24*60*60; //Период задаётся в меню "Управление->Настройка периода для графиков Highstock"

// Получить объект по имени
 $obj=getObject($name[0]); 
 // Получить id свойства
 $prop_id=$obj->getPropertyByName($name[1], $obj->class_id, $obj->id);
 // Получаем VALUE_ID для следующей таблицы
 $pvalue=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$obj->id."'");
//DebMes("Запрос = : ".$pvalue); // После этого в XRay во вкладке debug можно смотреть результат. 
// Получаем таблицу
 $arr_s = SQLSelect("SELECT UNIX_TIMESTAMP(ADDED) as ADDED, VALUE FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' AND ADDED>=('".date('Y-m-d H:i:s', $start_time)."') AND ADDED<=('".date('Y-m-d H:i:s', $end_time)."') ORDER BY ADDED");

 // Собрать структуру JSON
 $st = $params['callback'].'([';
 foreach($arr_s as $s) {
   if ($f) { $st .=','; }
   $st .= '['.$s['ADDED'].'000,'.$s['VALUE'].']' ;
   $f=1;
 }
 $st .= '])';

 // Ответ
 echo ($st); 
//DebMes("Собрать структуру JSON: ".$st); // После этого в XRay во вкладке debug можно смотреть результат.
И сейчас можно выбирать период через меню:
СпойлерПоказать
4.png
4.png (119.46 КБ) 7929 просмотров

Re: Строим графики Highstock

Добавлено: Чт мар 09, 2017 2:29 pm
Bagir
Вернулся к теме графиков. Стало интересно, что там новенького придумали в библиотеке. Да и на момент написания статьи остались не реализованы разные интересные идеи. Перечитал всё, чтобы вспомнить. Завтра обновлю код. У меня за это время были небольшие изменения. Не столь критичные, но чтобы говорить об одном и том же, приведу всё в порядок.
И да, конечно же JSON, а не JСON. Забавная ошибка затесалась на момент написания скрипта. На тот момент я про формат JSON вообще и не знал.
Самое первое, с чего хотел бы начать, это преобразование ответа, полученного из базы данных с помощью SQLSelect в формат JSON. Сейчас это делается с помощью цикла foreach. Этот способ, наверное, не претендует на самый оптимальный по времени. Проводил ли кто тесты на скорость?
Еще нужно обсудить вариант записи в базу данных. Писать туда одинаковые значения, я считаю не целесообразно. Сейчас в базу пишется только первое и последнее одинаковое значение. Но, последнее значение будет обновлять метку времени. При этом мы можем видеть, какой период времени продолжало присутствовать это значение. Этого должно быть достаточно, чтобы правильно отображать изменения значения на линии времени графика. К тому же это сильно уменьшит объем обрабатываемых данных, что хорошо скажется на скорости.

Re: Строим графики Highstock

Добавлено: Чт мар 09, 2017 3:06 pm
Jager
Bagir писал(а):Вернулся к теме графиков. Стало интересно, что там новенького придумали в библиотеке. Да и на момент написания статьи остались не реализованы разные интересные идеи. Перечитал всё, чтобы вспомнить. Завтра обновлю код.
Лучше сразу в виде модуля, по аналогии со встроенным Charts, с интеграцией в домашние страницы и сцены.

Re: Строим графики Highstock

Добавлено: Чт мар 09, 2017 7:38 pm
Bagir
Даже и не знаю. Есть ли смысл в модуле. Там всего то нужен сценарий json, а код html может быть встроен уже в существующую страницу. А примере конечно на отдельной, чтобы по проще было разобраться.
Файлы можно тянуть из Интернета

Код: Выделить всё

<script src="https://code.highcharts.com/highcharts.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
либо скачать и закинуть в js папку.
Нет ни циклов, ни настроек, ни базы данных в sql. Так что модуль тут не нужен. HTML код для графика у всех будет разный. Тут как говорится на вкус и цвет... А почитать можно тут.
Я когда доберусь до системы, первым делом хочу проверить скорость создания json циклом и, например, с помощью json_encode. Да и вообще, подойдет ли json_encode для этого.

Re: Строим графики Highstock

Добавлено: Чт мар 09, 2017 8:18 pm
Jager
Bagir писал(а):Даже и не знаю. Есть ли смысл в модуле. Там всего то нужен сценарий json, а код html может быть встроен уже в существующую страницу.
Файлы можно тянуть из Интернета, либо скачать и закинуть в js папку.
Так в том и смысл что бы при установке модуля автоматом скачались нужные файлы и юзеру осталось только указать нужные свойства-опции и на выходе получить html код для вставки.

Re: Строим графики Highstock

Добавлено: Чт мар 09, 2017 9:11 pm
Ko/|xo3HUk
Мне кажется с модулем потеряется большая часть функционала/настроек графиков. Там настроек - тыщщи. Если только модуль будет подготавливать код, который можно уже будет тюнить для своих нужд - тогда ещё пойдёт.

Re: Строим графики Highstock

Добавлено: Чт мар 09, 2017 10:00 pm
Jager
Ko/|xo3HUk писал(а):Если только модуль будет подготавливать код, который можно уже будет тюнить для своих нужд - тогда ещё пойдёт.
В том и смысл что не подготовленный человек сразу получает картинку и рядом инструкцию с тюнингом.

Re: Строим графики Highstock

Добавлено: Чт мар 09, 2017 10:28 pm
Bagir
Ну да, если так, то идея хорошая. Это как online конструктор модулей от Сергея.
Эх, для начала бы ускорить работу сценария подготовки JSON. json_encode работает быстрее, но делает не совсем такую строку, чтобы скормить её графику. А многочисленные замены символов не добавят быстродействия по сравнению с перебором в цикле. У json_encode есть параметры. Например JSON_NUMERIC_CHECK убирает кавычки если это число. Но остается еще много вопросов.

В итоге после запроса данных из sql, мы имеем следующее:
простой массив, элементы которого это ассоциативные массивы. И если это бодро скормить json_encode, то результат будет не съедобен для графиков. Вероятно придется остаться с вариантом перебора foreach