Chartjs.php in Charts 8.3
File
modules/charts_chartjs/src/Plugin/chart/Chartjs.php
View source
<?php
namespace Drupal\charts_chartjs\Plugin\chart;
use Drupal\charts\Plugin\chart\AbstractChart;
use Drupal\charts_chartjs\Settings\Chartjs\ChartjsChart;
use Drupal\charts_chartjs\Settings\Chartjs\ChartjsData;
use Drupal\charts_chartjs\Settings\Chartjs\ChartjsOptions;
use Drupal\charts_chartjs\Settings\Chartjs\ChartjsScales;
use Drupal\charts_chartjs\Settings\Chartjs\ChartjsStacking;
use Drupal\charts_chartjs\Settings\Chartjs\ChartjsTickConfigurationOptions;
use Drupal\charts_chartjs\Settings\Chartjs\ChartjsTicks;
class Chartjs extends AbstractChart {
protected function buildChartType($options) {
switch ($options['type']) {
case 'bar':
$type = 'horizontalBar';
break;
case 'column':
$type = 'bar';
break;
case 'spline':
$type = 'line';
break;
case 'donut':
$type = 'doughnut';
break;
case 'area':
$type = 'line';
break;
case 'gauge':
$type = 'linearGauge';
break;
default:
$type = $options['type'];
break;
}
if (isset($options['polar']) && $options['polar'] == 1) {
$type = 'radar';
}
return $type;
}
protected function buildGaugeOptions(array $options) {
$scaleColorRanges = [];
$scaleColorRanges[0] = new \stdClass();
$scaleColorRanges[1] = new \stdClass();
$scaleColorRanges[2] = new \stdClass();
$scaleColorRanges[0]->start = isset($options['red_from']) ? $options['red_from'] : '';
$scaleColorRanges[0]->end = isset($options['red_to']) ? $options['red_to'] : '';
$scaleColorRanges[0]->color = '#ff000c';
$scaleColorRanges[1]->start = isset($options['yellow_from']) ? $options['yellow_from'] : '';
$scaleColorRanges[1]->end = isset($options['yellow_to']) ? $options['yellow_to'] : '';
$scaleColorRanges[1]->color = '#ffff00';
$scaleColorRanges[2]->start = isset($options['green_from']) ? $options['green_from'] : '';
$scaleColorRanges[2]->end = isset($options['green_to']) ? $options['green_to'] : '';
$scaleColorRanges[2]->color = '#008000';
return $scaleColorRanges;
}
protected function buildOptions(array $options) {
$chartjsOptions = new ChartjsOptions();
$chartjsScales = new ChartjsScales();
$chartjsStacking = new ChartjsStacking();
$ticks = new ChartjsTicks();
$tickOptions = new ChartjsTickConfigurationOptions();
if (!empty($options['grouping']) && $options['grouping'] == TRUE) {
$grouping = TRUE;
}
else {
$grouping = FALSE;
}
$chartjsStacking
->setStacking($grouping);
$chartjsScales
->setXAxes([
$chartjsStacking,
]);
$ticks
->setTicks($tickOptions);
$ticks
->setStacked($grouping);
$chartjsScales
->setYAxes([
$ticks,
]);
$chartjsOptions
->setScales($chartjsScales);
$tooltip = new \stdClass();
if ($options['tooltips'] == 'TRUE') {
$tooltip->enabled = TRUE;
}
else {
$tooltip->enabled = FALSE;
}
$chartjsOptions
->setTooltips($tooltip);
$chartjsOptions
->setLegend($this
->buildLegend($options));
$chartjsOptions
->setTitle($this
->buildTitle($options));
return $chartjsOptions;
}
protected function buildLegend($options) {
$legend = new \stdClass();
if (isset($options['legend']) && !empty($options['legend_position']) && $options['legend'] == TRUE) {
$legend->display = TRUE;
$legend->position = $options['legend_position'];
}
else {
$legend->display = FALSE;
}
return $legend;
}
protected function buildTitle($options) {
$title = new \stdClass();
if (!empty($options['title_position']) && !empty($options['title'])) {
$title->display = TRUE;
$title->position = $options['title_position'];
$title->text = $options['title'];
}
else {
$title->display = FALSE;
}
return $title;
}
public function buildVariables(array $options, array $categories = [], array $seriesData = [], array $attachmentDisplayOptions = [], array &$variables, $chartId, array $customOptions = []) {
$chartjs = new ChartjsChart();
$chartjsData = new ChartjsData();
$seriesCount = count($seriesData);
$attachmentCount = count($attachmentDisplayOptions);
$noAttachmentDisplays = $attachmentCount === 0;
$chartjs
->setType($this
->buildChartType($options));
$chartjsData
->setLabels($categories);
$dataset = [];
for ($i = 0; $i < $seriesCount; $i++) {
$dataset[$i] = new \stdClass();
$dataset[$i]->label = $seriesData[$i]['name'];
$dataset[$i]->data = $seriesData[$i]['data'];
$dataset[$i]->backgroundColor = $seriesData[$i]['color'];
$dataset[$i]->type = $this
->buildChartType($seriesData[$i]);
if ($seriesData[$i]['type'] == 'area') {
$dataset[$i]->fill = 'origin';
}
else {
$dataset[$i]->fill = FALSE;
}
if (!empty($options['polar']) && $options['polar'] == 1) {
$dataset[$i]->borderColor = $seriesData[$i]['color'];
$dataset[$i]->type = 'radar';
}
if ($dataset[$i]->type == 'linearGauge') {
$dataset[$i]->offset = ($i + 1) * 10;
}
if ($dataset[$i]->type == 'scatter') {
$data = $dataset[$i]->data;
$scatterDataSet = [];
for ($i = 0; $i < count($data); $i++) {
$scatterData = new \stdClass();
$scatterData->x = $data[$i][0];
$scatterData->y = $data[$i][1];
array_push($scatterDataSet, $scatterData);
}
$dataset[0]->data = $scatterDataSet;
}
}
$chartjsData
->setDatasets($dataset);
$chartjs
->setData($chartjsData);
if ($options['type'] == 'gauge') {
$chartjs
->setScaleColorRanges($this
->buildGaugeOptions($options));
$range = [];
$range['startValue'] = 1;
$range['endValue'] = 1000;
$chartjs
->setRange($range);
}
$chartjs
->setOptions($this
->buildOptions($options));
foreach ($customOptions as $option => $key) {
$setter = 'set' . ucfirst($option);
if (method_exists($chartjs, $setter)) {
$chartjs
->{$setter}($customOptions[$option]);
}
}
$variables['chart_type'] = 'chartjs';
$variables['content_attributes']['data-chart'][] = json_encode($chartjs);
$variables['attributes']['id'][0] = $chartId;
$variables['attributes']['class'][] = 'charts-chartjs';
}
}
Classes
Name |
Description |
Chartjs |
Define a concrete class for a Chart. |