C3ChartsRender.php 3.78 KiB
<?php
namespace Drupal\charts_c3\Charts;
use Drupal\charts\Charts\ChartsRenderInterface;
use Drupal\charts\Util\Util;
use Drupal\charts_c3\Settings\CThree\ChartType;
use Drupal\charts_c3\Settings\CThree\CThree;
use Drupal\charts_c3\Settings\CThree\ChartTitle;
use Drupal\charts_c3\Settings\CThree\ChartData;
use Drupal\charts_c3\Settings\CThree\ChartColor;
use Drupal\charts_c3\Settings\CThree\ChartAxis;
class C3ChartsRender implements ChartsRenderInterface {
public function __construct() {
Util::checkMissingLibrary('charts_c3', '/vendor/cthree/c3.min.js');
}
/**
* @param $options
* @param array $categories
* @param array $seriesData
* @param $chartId
* @param array $attachmentDisplayOptions
*
* @return CThree
*/
public function charts_render_charts($options, $categories = [], $seriesData = [], $attachmentDisplayOptions = [], &$variables, $chartId) {
$noAttachmentDisplays = count($attachmentDisplayOptions) === 0;
$yAxis = [];
$types = [];
//sets secondary axis from the first attachment only
if (!$noAttachmentDisplays && $attachmentDisplayOptions[0]['inherit_yaxis'] == 0) {
$yAxis[$seriesData[1]['name']] = 'y2';
}
// @todo - make this work for more that one attachment.
for ($i = 1; $i <= count($attachmentDisplayOptions); $i++) {
if ($attachmentDisplayOptions[$i - 1]['style']['options']['type'] == 'column')
$types[$seriesData[$i + 1]['name']] = 'bar';
else
$types[$seriesData[$i + 1]['name']] = $attachmentDisplayOptions[$i - 1]['style']['options']['type'];
}
$c3Data = [];
for ($i = 0; $i < count($seriesData); $i++) {
$c3DataTemp = $seriesData[$i]['data'];
array_unshift($c3DataTemp, $seriesData[$i]['name']);
array_push($c3Data, $c3DataTemp);
}
$c3Chart = new ChartType();
$c3Chart->setType($options['type']);
$c3ChartTitle = new ChartTitle();
$c3ChartTitle->setText($options['title']);
$chartAxis = new ChartAxis();
$c3 = new CThree();
$bindTo = '#' . $chartId;
$c3->setBindTo($bindTo);
$c3->setTitle($c3ChartTitle);
$chartData = new ChartData();
if ($noAttachmentDisplays > 0) {
$chartData->setLabels(FALSE);
}
if (!$noAttachmentDisplays && $attachmentDisplayOptions[0]['inherit_yaxis'] == 0) {
$chartData->axes = $yAxis;
$showSecAxis['show'] = true;
$showSecAxis['label'] = $attachmentDisplayOptions[0]['style']['options']['yaxis_title'];
$chartAxis->y2 = $showSecAxis;
}
$chartData->setType($options['type']);
$c3->setData($chartData);
if ($options['type'] == 'bar') {
$chartAxis->setRotated(TRUE);
array_unshift($categories, 'x');
array_push($c3Data, $categories);
$chartData->setColumns($c3Data);
}
else if ($options['type'] == 'column') {
$chartData->setType('bar');
$chartAxis->setRotated(FALSE);
array_unshift($categories, 'x');
array_push($c3Data, $categories);
$chartData->setColumns($c3Data);
}
else if ($options['type'] == 'pie') {
$chartData->setColumns($c3Data);
}
else {
array_unshift($categories, 'x');
array_push($c3Data, $categories);
$chartData->setColumns($c3Data);
}
$chartData->types = $types;
if ($options['type'] != 'pie') {
$c3->setAxis($chartAxis);
}
$chartColor = new ChartColor();
$seriesColors = [];
for ($i = 0; $i < count($seriesData); $i++) {
$seriesColor = $seriesData[$i]['color'];
array_push($seriesColors, $seriesColor);
}
$chartColor->setPattern($seriesColors);
$c3->setColor($chartColor);
$variables['chart_type'] = 'c3';
$variables['content_attributes']['data-chart'][] = json_encode($c3);
$variables['attributes']['id'][0] = $chartId;
$variables['attributes']['class'][] = 'charts-c3';
}
}