Флешовые блинчики. Code Igniter + Open Flash Chart
Сижу и смотрю как моргает курсор на пустом экране и не придумаю как начать пост… «Понадобилось мне…», или: «в нашем супер-пупер проекте потребовалось…», и прочая дребедень — скучно. А смотрение на курсор склоняет к философским размышлениям. Поэтому первый абзац пропускаем и идем сразу к делу.
…
Основными требованиями к библиотеке для построения графиков были: (1) умение рисовать круговые диаграммы, (2) умение рисовать красивые диаграммы, и (3) опенсорсность, прости Господи. Нашлось куча всяческих библиотек. Все они умеют рисовать круговые диаграммы, но остановился на одной. О ней и речь.
Open Flash Chart 2. Как видно из названия графики у нас рисуются во флэше. А данные для их построения передаются в формате JSON. И хотя этого из названия не видно, мне библиотечка понравилась, тем более, что для тут же нашелся способ быстро встроить ее в CI.
Налюбовавшись демками на сайте разработчика я взялся за дело и в общем-то довольно быстро соорудил то, что нужно было, но…
То ли из-за расхождения в версиях, то ли из-за чего-то еще возникли проблемы с подписями к секторам моей круговой диаграммы. Пришлось лезть в исходники. Безрезультатно… Решение в исходниках не нашлось.
Пришлось думать… Система работает следующим образом: есть флэшка, которая умеет рисовать всяческие графики и диаграммы, ей только данные подавай. Данные подаются в формате JSON. Данные готовит скриптик на php. Но вот незадача. В демках все работает, а у меня — нет.
Таким образом, имеется какая-то нестыковка между флешем и php-скриптом. Поэтому, тупо берем пример из демки (точнее данные, которые передаются флэшу) и подставляем его в наш скрипт. Получается что-то вроде:
echo '{ "elements": [ { "type": "pie", "alpha": 0.6, "start-angle": 35, "animate": [ { "type": "fade" } ], "tip": "#val# of #total# #percent# of 100%", "colours": [ "#1C9E05", "#FF368D" ], "values": [ 2, 3, 4, { "value": 6.5, "label": "hello (6.5)" } ] } ], "title": { "text": "Pork Pie, Mmmmm" }, "x_axis": null }';
Тупо смотрим на правильно отрисованную диаграмму после чего распечатываем свой JSON и начинаем сверять.
И вот она нестыковка:
у авторов: «value»: 6.5, «label»: «hello (6.5)»;
у меня: «value»: 6.5, «text»: «hello (6.5)».
Та-а-ак. Что такое JSON? Некий JavaScript Object Notation. В копаных ранее исходниках присутствовал файлик JSON.php в котом имеется класс, умеющий превращать объект в эту самую нотацию. Ну а дальше все просто. Рисовал я круговую диаграмму, поэтому открыл сразу же OFC_Charts_Pie.php и тут же нашлось несоответствие.
class OFC_Charts_Pie_Value { function OFC_Charts_Pie_Value( $value, $text ) { $this->value = $value; $this->text = $text; // <<<<<<<<< Смотреть сюда } }
Собственно решение простое: меняем $this->text на $this->label и все работает.
Резюме (это метод контроллера, возвращающего данные для диаграммы):
public function getPieData() { $this->load->library('Ofc2factory', NULL, 'ofc2'); // start creating objects $title = $this->ofc2->create('OFC_Elements_Title', array("Общая статистика")); $pie = $this->ofc2->create('OFC_Charts_Pie'); $stat = $this->documentList->getUsageStatistic(); $pie->values = array(); $pie->colours = array(); foreach ($stat as $key => $item) { $pie->values[] = new OFC_Charts_Pie_Value($item, $key); } $pie->tip = '#label#<br>#val# из #total#<br>#percent#'; $pie->radius = 100; $chart = $this->ofc2->create('OFC_Chart'); $chart->set_title($title); $chart->add_element($pie); $chart->set_bg_colour('#FFFFFF'); echo $chart->toString(); }

Добавить комментарий