From 7f150408b77fec19c85b119f3411d94def66bfba Mon Sep 17 00:00:00 2001 From: andileco <daniel@andile.co> Date: Fri, 31 Mar 2017 16:00:22 -0400 Subject: [PATCH] This commit takes all sub-module-specific code out of the core charts module, making the module more extensible. It also improves the libraries.yml files and removes unused code from various parts of the site. --- charts.api.php | 19 +-- charts.libraries.yml | 9 -- charts.module | 43 +----- charts.services.yml | 3 + includes/charts.pages.inc | 1 - js/charts.admin.js | 113 --------------- modules/charts_c3/charts_c3.libraries.yml | 4 +- modules/charts_c3/charts_c3.module | 104 +------------- .../charts_c3/src/Charts/C3ChartsRender.php | 114 ++++++++++++++++ .../src/Settings/CThree/ChartAxis.php | 2 +- .../src/Settings/CThree/ChartColor.php | 2 +- .../src/Settings/CThree/ChartData.php | 2 +- .../charts_google/charts_google.libraries.yml | 3 +- modules/charts_google/charts_google.module | 104 +------------- .../src/Charts/GoogleChartsRender.php | 129 ++++++++++++++++++ .../charts_highcharts.libraries.yml | 2 +- .../charts_highcharts.module | 101 +------------- .../src/Charts/HighchartsChartsRender.php | 113 +++++++++++++++ .../src/Settings/Highcharts/ChartLabel.php | 2 +- .../src/Settings/Highcharts/Highcharts.php | 8 +- .../src/Settings/Highcharts/Xaxis.php | 2 +- src/Charts/ModuleSelector.php | 40 ++++++ .../display/ChartsPluginDisplayChart.php | 27 ++-- .../views/style/ChartsPluginStyleChart.php | 44 +++--- src/Util/Util.php | 34 +++-- templates/views-view-charts.html.twig | 15 +- 26 files changed, 487 insertions(+), 553 deletions(-) delete mode 100644 charts.libraries.yml delete mode 100644 js/charts.admin.js create mode 100644 modules/charts_c3/src/Charts/C3ChartsRender.php create mode 100644 modules/charts_google/src/Charts/GoogleChartsRender.php create mode 100644 modules/charts_highcharts/src/Charts/HighchartsChartsRender.php create mode 100644 src/Charts/ModuleSelector.php diff --git a/charts.api.php b/charts.api.php index d06d5d5..c2a33b5 100644 --- a/charts.api.php +++ b/charts.api.php @@ -102,15 +102,6 @@ function hook_chart_CHART_ID_alter(&$chart) { * all charts may have a $chart_id. */ function hook_chart_definition_alter(&$definition, $chart) { - if ($chart['#chart_library'] === 'google') { - $definition['options']['titleTextStyle']['fontSize'] = 20; - } - if ($chart['#chart_library'] === 'c3') { - $definition['options']['titleTextStyle']['fontSize'] = 20; - } - elseif ($chart['#chart_library'] === 'highcharts') { - $definition['title']['style']['fontSize'] = 20; - } } /** @@ -132,16 +123,16 @@ function hook_chart_definition_CHART_ID_alter(&$chart) { * hook may be used as a #chart_library property on $chart renderables. */ function hook_charts_info() { - $info['my_charting_library'] = array( + $info['my_charting_library'] = [ 'label' => t('New charting library'), // Specify a callback function which will be responsible for accepting a // $chart renderable and printing a chart on the page. 'render' => '_my_charting_library_render', // Specify the chart types your library is capable of providing. - 'types' => array('area', 'bar', 'column', 'line', 'pie', 'scatter'), + 'types' => ['area', 'bar', 'column', 'line', 'pie', 'scatter'], // If your callback function is in a separate file, specify it's location. // 'file' => 'includes/my_charting_library.inc', - ); + ]; return $info; } @@ -165,7 +156,7 @@ function hook_charts_info_alter(&$info) { * all charting libraries. */ function hook_charts_type_info() { - $chart_types['bar'] = array( + $chart_types['bar'] = [ 'label' => t('Bar'), // If this chart supports both an X and Y axis, set this to // CHARTS_DUAL_AXIS. If only a single axis is supported (e.g. pie), then @@ -178,7 +169,7 @@ function hook_charts_type_info() { // For bar/area/other charts that support stacking of series, set this value // to TRUE. 'stacking' => TRUE, - ); + ]; return $chart_types; } diff --git a/charts.libraries.yml b/charts.libraries.yml deleted file mode 100644 index e50681f..0000000 --- a/charts.libraries.yml +++ /dev/null @@ -1,9 +0,0 @@ -charts: - version: 1.x - js: - js/charts.admin.js: {} - dependencies: - - core/jquery - - core/jquery.once - - core/drupal - - core/drupalSettings diff --git a/charts.module b/charts.module index 1c2b192..ea293d0 100644 --- a/charts.module +++ b/charts.module @@ -6,6 +6,7 @@ */ use Drupal\charts\Util\Util; +use Drupal\charts\Charts\ModuleSelector; /** * {@inheritdoc} @@ -73,8 +74,7 @@ function template_preprocess_views_view_charts(&$variables) { if (0 < count($attachmentView)) { $data = Util::viewsData($view, $valueField, $labelField, $color, $attachmentChartTypeOption[$i]); - } - else { + } else { $data = Util::viewsData($view, $valueField, $labelField, $color, $attachmentChartTypeOption[$i] = NULL); } @@ -91,43 +91,6 @@ function template_preprocess_views_view_charts(&$variables) { } $seriesData = array_merge($seriesData, $seriesDataAttachment); - // Handles the toggling from one library to another. - switch ($library) { - case 'google': - Util::checkMissingLibrary('charts_google', '/vendor/google/loader.js'); - $googleData = charts_google_render_charts($categories, $seriesData); - $googleOptions = charts_google_create_charts_options($options, $seriesData, $attachmentDisplayOptions); - $googleChartType = charts_google_create_chart_type($options); - $variables['chart_type'] = 'google'; - $variables['attributes']['class'][0] = 'charts-google'; - $variables['attributes']['id'][0] = $chartId; - $variables['content_attributes']['data-chart'][] = $googleData; - $variables['attributes']['google-options'][1] = json_encode($googleOptions); - $variables['attributes']['google-chart-type'][2] = json_encode($googleChartType); - - break; - - case 'highcharts': - Util::checkMissingLibrary('charts_highcharts', '/vendor/highcharts/highcharts.js'); - $highchart = charts_highcharts_render_charts($options, $categories, $seriesData, $attachmentDisplayOptions); - $variables['chart_type'] = 'highcharts'; - $variables['content_attributes']['data-chart'][] = json_encode($highchart); - $variables['attributes']['id'][0] = $chartId; - $variables['attributes']['class'][] = 'charts-highchart'; - - break; - - case 'c3': - Util::checkMissingLibrary('charts_c3', '/vendor/cthree/c3.min.js'); - $c3 = charts_c3_render_charts($options, $categories, $seriesData, $chartId, $attachmentDisplayOptions); - $variables['chart_type'] = 'c3'; - $variables['content_attributes']['data-chart'][] = json_encode($c3); - $variables['attributes']['id'][0] = $chartId; - $variables['attributes']['class'][] = 'charts-c3'; - break; - - default: - // Not handled. - } + $moduleSelector = new ModuleSelector($library, $categories, $seriesData, $options, $attachmentDisplayOptions, $variables, $chartId); } diff --git a/charts.services.yml b/charts.services.yml index a948584..6295540 100644 --- a/charts.services.yml +++ b/charts.services.yml @@ -4,3 +4,6 @@ services: charts.charts_attachment: class: Drupal\charts\Services\ChartAttachmentService + + charts.views_variable: + class: Drupal\charts\Services\ViewsDataService diff --git a/includes/charts.pages.inc b/includes/charts.pages.inc index 5fef5bb..9e34b1a 100644 --- a/includes/charts.pages.inc +++ b/includes/charts.pages.inc @@ -218,7 +218,6 @@ function charts_cast_element_integer_values(&$element) { function charts_settings_form($form, $defaults = array(), $field_options = array(), $parents = array()) { // Ensure all defaults are set. $options = array_merge(charts_default_settings(), $defaults); - $form['#attached']['library'][] = "charts/charts.admin"; // Get a list of available chart libraries. $charts_info = charts_info(); diff --git a/js/charts.admin.js b/js/charts.admin.js deleted file mode 100644 index 14b8c34..0000000 --- a/js/charts.admin.js +++ /dev/null @@ -1,113 +0,0 @@ -/** - * @file - * Scripting for administrative interfaces of Charts module. - */ -(function ($) { - 'use strict'; - - Drupal.behaviors.chartsAdmin = { - attach: function (context, settings) { - // Change options based on the chart type selected. - $(context).find('.form-radios.chart-type-radios').once('charts-axis-inverted', function () { - - // Manually attach collapsible fieldsets first. - if (Drupal.behaviors.collapse) { - Drupal.behaviors.collapse.attach(context, settings); - } - - var xAxisLabel = $('fieldset.chart-xaxis .fieldset-title').html(); - var yAxisLabel = $('fieldset.chart-yaxis .fieldset-title').html(); - - $(this).find('input:radio').change(function () { - if ($(this).is(':checked')) { - var groupingField = $(this).closest('form').find('.charts-grouping-field').val(); - - // Flip X/Y axis fieldset labels for inverted chart types. - if ($(this).attr('data-axis-inverted')) { - $('fieldset.chart-xaxis .fieldset-title').html(yAxisLabel); - $('fieldset.chart-xaxis .axis-inverted-show').closest('.form-item').show(); - $('fieldset.chart-xaxis .axis-inverted-hide').closest('.form-item').hide(); - $('fieldset.chart-yaxis .fieldset-title').html(xAxisLabel); - $('fieldset.chart-yaxis .axis-inverted-show').closest('.form-item').show(); - $('fieldset.chart-yaxis .axis-inverted-hide').closest('.form-item').hide(); - } - else { - $('fieldset.chart-xaxis .fieldset-title').html(xAxisLabel); - $('fieldset.chart-xaxis .axis-inverted-show').closest('.form-item').hide(); - $('fieldset.chart-xaxis .axis-inverted-hide').closest('.form-item').show(); - $('fieldset.chart-yaxis .fieldset-title').html(yAxisLabel); - $('fieldset.chart-yaxis .axis-inverted-show').closest('.form-item').hide(); - $('fieldset.chart-yaxis .axis-inverted-hide').closest('.form-item').show(); - } - - // Show color options for single axis settings. - if ($(this).attr('data-axis-single')) { - $('fieldset.chart-xaxis').hide(); - $('fieldset.chart-yaxis').hide(); - $('th.chart-field-color, td.chart-field-color').hide(); - $('div.chart-colors').show(); - } - else { - $('fieldset.chart-xaxis').show(); - $('fieldset.chart-yaxis').show(); - if (groupingField) { - $('th.chart-field-color, td.chart-field-color').hide(); - $('div.chart-colors').show(); - } - else { - $('th.chart-field-color, td.chart-field-color').show(); - $('div.chart-colors').hide(); - } - } - } - }); - - // Set the initial values. - $(this).find('input:radio:checked').triggerHandler('change'); - }); - - // React to the setting of a group field. - $(context).find('.charts-grouping-field').once('charts-grouping', function () { - $(this).change(function () { - var $form; - $form = $(this).closest('form'); - - // Hide the entire grouping field row, since no settings are applicable. - var value = $(this).val(); - $form.find('#chart-fields tr').show(); - if (value) { - var $labelField = $form.find('.chart-label-field input[value="' + value + '"]'); - $labelField.closest('tr').hide(); - if ($labelField.is(':checked')) { - $form.find('input[name="style_options[label_field]"][value=""]').attr('checked', 'checked').triggerHandler('change'); - } - } - // Restripe the table after hiding/showing rows. - $form.find('#chart-fields tr:visible') - .removeClass('odd even') - .filter(':even').addClass('odd').end() - .filter(':odd').addClass('even'); - - // Recalculate shown color fields by triggering the chart type change. - $form.find('.form-radios.chart-type-radios input:radio:checked').triggerHandler('change'); - }).triggerHandler('change'); - }); - - // Disable the data checkbox when a field is set as a label. - $(context).find('td.chart-label-field input').once('charts-axis-inverted', function () { - var $radio = $(this); - $radio.change(function () { - if ($radio.is(':checked')) { - $('.chart-data-field input').show(); - $('.chart-field-color input').show(); - $('input.chart-field-disabled').remove(); - $radio.closest('tr').find('.chart-data-field input').hide().after('<input type="checkbox" name="chart_field_disabled" disabled="disabled" class="chart-field-disabled" />'); - $radio.closest('tr').find('.chart-field-color input').hide(); - } - }); - $radio.triggerHandler('change'); - }); - - } - }; -}(jQuery)); diff --git a/modules/charts_c3/charts_c3.libraries.yml b/modules/charts_c3/charts_c3.libraries.yml index ab41b79..2db5b68 100644 --- a/modules/charts_c3/charts_c3.libraries.yml +++ b/modules/charts_c3/charts_c3.libraries.yml @@ -29,7 +29,5 @@ c3: js: vendor/cthree/c3.min.js: {} dependencies: - - core/jquery - - core/jquery.once - - core/drupal + - charts_c3/charts_c3 - charts_c3/d3 \ No newline at end of file diff --git a/modules/charts_c3/charts_c3.module b/modules/charts_c3/charts_c3.module index 0f70235..d8ee65b 100644 --- a/modules/charts_c3/charts_c3.module +++ b/modules/charts_c3/charts_c3.module @@ -5,111 +5,13 @@ * Charts module integration with C3 library. */ -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; - /** * Implements hook_charts_info(). */ function charts_c3_charts_info() { - $info['c3'] = array( + $info['c3'] = [ 'label' => t('C3 Charts'), - 'types' => array('area', 'bar', 'column', 'line', 'pie', 'scatter'), - ); + 'types' => ['area', 'bar', 'column', 'line', 'pie', 'scatter'], + ]; return $info; } - -/** - * @param $options - * @param array $categories - * @param array $seriesData - * @param $chartId - * @param array $attachmentDisplayOptions - * - * @return CThree - */ -function charts_c3_render_charts($options, $categories = array(), $seriesData = array(), $chartId, $attachmentDisplayOptions = []) { - - $noAttachmentDisplays = count($attachmentDisplayOptions); - $yAxis = []; - $types = []; - //sets secondary axis from the first attachment only - if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0){ - $yAxis[$seriesData[1]['name']] = 'y2'; - } - - for ($i = 1; $i <= count($attachmentDisplayOptions); $i++){ - if ($attachmentDisplayOptions[$i - 1]['style']['options']['type'] == 'column') - $types[$seriesData[$i]['name']] = 'bar'; - else - $types[$seriesData[$i]['name']] = $attachmentDisplayOptions[$i - 1]['style']['options']['type']; - } - $c3Data = array(); - 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->setChart($c3Chart); - //$c3->setLabels($options['data_labels']); - $c3->setTitle($c3ChartTitle); - $chartData = new ChartData(); - if ($noAttachmentDisplays > 0){ - $chartData->setLabels(FALSE); - } - if ($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 { - array_unshift($categories, 'x'); - array_push($c3Data, $categories); - $chartData->setColumns($c3Data); - } - } - $chartData->types = $types; - - $c3->setAxis($chartAxis); - - $chartColor = new ChartColor(); - $seriesColors = array(); - for ($i = 0; $i < count($seriesData); $i++) { - $seriesColor = $seriesData[$i]['color']; - array_push($seriesColors, $seriesColor); - } - $chartColor->setPattern($seriesColors); - $c3->setColor($chartColor); - - return $c3; -} diff --git a/modules/charts_c3/src/Charts/C3ChartsRender.php b/modules/charts_c3/src/Charts/C3ChartsRender.php new file mode 100644 index 0000000..8e26f97 --- /dev/null +++ b/modules/charts_c3/src/Charts/C3ChartsRender.php @@ -0,0 +1,114 @@ +<?php + +namespace Drupal\charts_c3\Charts; + +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 { + + public function __construct($categories, $seriesData, $options, $attachmentDisplayOptions, &$variables, $chartId) { + + Util::checkMissingLibrary('charts_c3', '/vendor/cthree/c3.min.js'); + $c3 = $this->charts_c3_render_charts($options, $categories, $seriesData, $chartId, $attachmentDisplayOptions); + $variables['chart_type'] = 'c3'; + $variables['content_attributes']['data-chart'][] = json_encode($c3); + $variables['attributes']['id'][0] = $chartId; + $variables['attributes']['class'][] = 'charts-c3'; + } + + /** + * @param $options + * @param array $categories + * @param array $seriesData + * @param $chartId + * @param array $attachmentDisplayOptions + * + * @return CThree + */ + private function charts_c3_render_charts($options, $categories = [], $seriesData = [], $chartId, $attachmentDisplayOptions = []) { + + $noAttachmentDisplays = count($attachmentDisplayOptions); + $yAxis = []; + $types = []; + //sets secondary axis from the first attachment only + if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0) { + $yAxis[$seriesData[1]['name']] = 'y2'; + } + + for ($i = 1; $i <= count($attachmentDisplayOptions); $i++) { + if ($attachmentDisplayOptions[$i - 1]['style']['options']['type'] == 'column') + $types[$seriesData[$i]['name']] = 'bar'; + else + $types[$seriesData[$i]['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->setChart($c3Chart); + //$c3->setLabels($options['data_labels']); + $c3->setTitle($c3ChartTitle); + $chartData = new ChartData(); + if ($noAttachmentDisplays > 0) { + $chartData->setLabels(FALSE); + } + if ($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 { + array_unshift($categories, 'x'); + array_push($c3Data, $categories); + $chartData->setColumns($c3Data); + } + } + $chartData->types = $types; + + $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); + + return $c3; + } + +} diff --git a/modules/charts_c3/src/Settings/CThree/ChartAxis.php b/modules/charts_c3/src/Settings/CThree/ChartAxis.php index 534906a..617254e 100644 --- a/modules/charts_c3/src/Settings/CThree/ChartAxis.php +++ b/modules/charts_c3/src/Settings/CThree/ChartAxis.php @@ -4,7 +4,7 @@ namespace Drupal\charts_c3\Settings\CThree; class ChartAxis implements \JsonSerializable { private $rotated = FALSE; - private $x = array('type' => 'category'); + private $x = ['type' => 'category']; /** * @return mixed diff --git a/modules/charts_c3/src/Settings/CThree/ChartColor.php b/modules/charts_c3/src/Settings/CThree/ChartColor.php index 9f881c3..aeb81f6 100644 --- a/modules/charts_c3/src/Settings/CThree/ChartColor.php +++ b/modules/charts_c3/src/Settings/CThree/ChartColor.php @@ -3,7 +3,7 @@ namespace Drupal\charts_c3\Settings\CThree; class ChartColor implements \JsonSerializable { - private $pattern = array(); + private $pattern = []; /** * @return mixed diff --git a/modules/charts_c3/src/Settings/CThree/ChartData.php b/modules/charts_c3/src/Settings/CThree/ChartData.php index 32a3150..017c050 100644 --- a/modules/charts_c3/src/Settings/CThree/ChartData.php +++ b/modules/charts_c3/src/Settings/CThree/ChartData.php @@ -3,7 +3,7 @@ namespace Drupal\charts_c3\Settings\CThree; class ChartData implements \JsonSerializable { - private $columns = array(); + private $columns = []; private $type; private $labels = TRUE; private $x = 'x'; diff --git a/modules/charts_google/charts_google.libraries.yml b/modules/charts_google/charts_google.libraries.yml index 19ebf46..d5a6e0f 100644 --- a/modules/charts_google/charts_google.libraries.yml +++ b/modules/charts_google/charts_google.libraries.yml @@ -6,7 +6,6 @@ charts_google: - core/jquery - core/jquery.once - core/drupal - - core/drupalSettings google: remote: https://www.gstatic.com/charts/loader.js @@ -17,3 +16,5 @@ google: gpl-compatible: false js: vendor/google/loader.js: {} + dependencies: + - charts_google/charts_google diff --git a/modules/charts_google/charts_google.module b/modules/charts_google/charts_google.module index ba5c351..64f95c0 100644 --- a/modules/charts_google/charts_google.module +++ b/modules/charts_google/charts_google.module @@ -13,111 +13,13 @@ use Drupal\charts_google\Settings\Google\ChartArea; * Implements hook_charts_info(). */ function charts_google_charts_info() { - $info['google'] = array( + $info['google'] = [ 'label' => t('Google Charts'), 'render' => '_charts_google_render', - 'types' => array('area', 'bar', 'column', 'line', 'pie', 'scatter'), + 'types' => ['area', 'bar', 'column', 'line', 'pie', 'scatter'], 'file' => 'charts_google.inc', - ); + ]; return $info; } -/** - * Creates a JSON Object formatted for Google charts to use - * @param array $categories - * @param array $seriesData - * - * @return json|string - */ -function charts_google_render_charts($categories = array(), $seriesData = array()) { - - $dataTable = array(); - for ($j = 0; $j < count($categories); $j++) { - $rowDataTable = []; - for ($i = 0; $i < count($seriesData); $i++) { - $rowDataTabletemp = $seriesData[$i]['data'][$j]; - array_push($rowDataTable, $rowDataTabletemp); - } - array_unshift($rowDataTable, $categories[$j]); - array_push($dataTable, $rowDataTable); - } - - $dataTableHeader = array(); - for ($r = 0; $r < count($seriesData); $r++) { - array_push($dataTableHeader, $seriesData[$r]['name']); - } - - array_unshift($dataTableHeader, 'label'); - array_unshift($dataTable, $dataTableHeader); - - return json_encode($dataTable); -} - -/** - * @param $options - * @param array $seriesData - * @param array $attachmentDisplayOptions - * @return GoogleOptions object with chart options or settings to be used by google visualization framework - */ -function charts_google_create_charts_options($options, $seriesData = array(), $attachmentDisplayOptions = []) { - $chartSelected = []; - $seriesTypes = array(); - $firstVaxis = array('minValue'=> 0, 'title' => $options['yaxis_title']); - $secondVaxis = array('minValue'=> 0); - $vAxes = array(); - array_push($vAxes, $firstVaxis); - //sets secondary axis from the first attachment only - if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0){ - $secondVaxis['title'] = $attachmentDisplayOptions[0]['style']['options']['yaxis_title']; - array_push($vAxes, $secondVaxis); - } - array_push($chartSelected, $options['type']); - for ($i = 0; $i < count($attachmentDisplayOptions); $i++){ - $attachmentChartType = $attachmentDisplayOptions[$i]['style']['options']['type']; - if ($attachmentChartType == 'column') - $attachmentChartType = 'bars'; - if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0 && $i == 0){ - $seriesTypes[$i + 1] = array('type' => $attachmentChartType, 'targetAxisIndex' => 1); - } - else - $seriesTypes[$i + 1] = array('type' => $attachmentChartType); - array_push($chartSelected, $attachmentChartType); - } - - $chartSelected = array_unique($chartSelected); - $googleOptions = new GoogleOptions(); - if (count($chartSelected) > 1){ - $parentChartType = $options['type']; - if ($parentChartType == 'column') - $parentChartType = 'bars'; - $googleOptions->seriesType = $parentChartType; - $googleOptions->series = $seriesTypes; - } - $googleOptions->setTitle($options['title']); - $googleOptions->vAxes = $vAxes; - //$vAxis['title'] = $options['yaxis_title']; - //$googleOptions->setVAxis($vAxis); - $chartArea = new ChartArea(); - $chartArea->setWidth(400); - // $googleOptions->setChartArea($chartArea); - $seriesColors = array(); - for ($i = 0; $i < count($seriesData); $i++) { - $seriesColor = $seriesData[$i]['color']; - array_push($seriesColors, $seriesColor); - } - $googleOptions->setColors($seriesColors); - return $googleOptions; -} - -/** - * @param $options - * @return ChartType - */ -function charts_google_create_chart_type($options) { - - $googleChartType = new ChartType(); - $googleChartType->setChartType($options['type']); - - return $googleChartType; -} diff --git a/modules/charts_google/src/Charts/GoogleChartsRender.php b/modules/charts_google/src/Charts/GoogleChartsRender.php new file mode 100644 index 0000000..925aefa --- /dev/null +++ b/modules/charts_google/src/Charts/GoogleChartsRender.php @@ -0,0 +1,129 @@ +<?php + +namespace Drupal\charts_google\Charts; + +use Drupal\charts\Util\Util; +use Drupal\charts_google\Settings\Google\GoogleOptions; +use Drupal\charts_google\Settings\Google\ChartType; +use Drupal\charts_google\Settings\Google\ChartArea; + +class GoogleChartsRender { + + private $googleData; + private $googleOptions; + private $googleChartType; + private $chartId; + + public function __construct($categories, $seriesData, $options, $attachmentDisplayOptions, &$variables, $chartId) { + Util::checkMissingLibrary('charts_google', '/vendor/google/loader.js'); + $this->chartId = $chartId; + $this->googleData = $this->charts_google_render_charts($categories, $seriesData); + $this->googleOptions = $this->charts_google_create_charts_options($options, $seriesData, $attachmentDisplayOptions); + $this->googleChartType = $this->charts_google_create_chart_type($options); + $variables['chart_type'] = 'google'; + $variables['attributes']['class'][0] = 'charts-google'; + $variables['attributes']['id'][0] = $this->chartId; + $variables['content_attributes']['data-chart'][] = $this->googleData; + $variables['attributes']['google-options'][1] = json_encode($this->googleOptions); + $variables['attributes']['google-chart-type'][2] = json_encode($this->googleChartType); + } + + /** + * Creates a JSON Object formatted for Google charts to use + * @param array $categories + * @param array $seriesData + * + * @return json|string + */ + private function charts_google_render_charts($categories = [], $seriesData = []) { + + $dataTable = []; + for ($j = 0; $j < count($categories); $j++) { + $rowDataTable = []; + for ($i = 0; $i < count($seriesData); $i++) { + $rowDataTabletemp = $seriesData[$i]['data'][$j]; + array_push($rowDataTable, $rowDataTabletemp); + } + array_unshift($rowDataTable, $categories[$j]); + array_push($dataTable, $rowDataTable); + } + + $dataTableHeader = []; + for ($r = 0; $r < count($seriesData); $r++) { + array_push($dataTableHeader, $seriesData[$r]['name']); + } + + array_unshift($dataTableHeader, 'label'); + array_unshift($dataTable, $dataTableHeader); + + return json_encode($dataTable); + } + + /** + * @param $options + * @param array $seriesData + * @param array $attachmentDisplayOptions + * @return GoogleOptions object with chart options or settings to be used by google visualization framework + */ + private function charts_google_create_charts_options($options, $seriesData = [], $attachmentDisplayOptions = []) { + $chartSelected = []; + $seriesTypes = []; + $firstVaxis = ['minValue' => 0, 'title' => $options['yaxis_title']]; + $secondVaxis = ['minValue' => 0]; + $vAxes = []; + array_push($vAxes, $firstVaxis); + //sets secondary axis from the first attachment only + if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0) { + $secondVaxis['title'] = $attachmentDisplayOptions[0]['style']['options']['yaxis_title']; + array_push($vAxes, $secondVaxis); + } + array_push($chartSelected, $options['type']); + for ($i = 0; $i < count($attachmentDisplayOptions); $i++) { + $attachmentChartType = $attachmentDisplayOptions[$i]['style']['options']['type']; + if ($attachmentChartType == 'column') + $attachmentChartType = 'bars'; + if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0 && $i == 0) { + $seriesTypes[$i + 1] = ['type' => $attachmentChartType, 'targetAxisIndex' => 1]; + } else + $seriesTypes[$i + 1] = ['type' => $attachmentChartType]; + array_push($chartSelected, $attachmentChartType); + } + + $chartSelected = array_unique($chartSelected); + $googleOptions = new GoogleOptions(); + if (count($chartSelected) > 1) { + $parentChartType = $options['type']; + if ($parentChartType == 'column') + $parentChartType = 'bars'; + $googleOptions->seriesType = $parentChartType; + $googleOptions->series = $seriesTypes; + } + $googleOptions->setTitle($options['title']); + $googleOptions->vAxes = $vAxes; + //$vAxis['title'] = $options['yaxis_title']; + //$googleOptions->setVAxis($vAxis); + $chartArea = new ChartArea(); + $chartArea->setWidth(400); + // $googleOptions->setChartArea($chartArea); + $seriesColors = []; + for ($i = 0; $i < count($seriesData); $i++) { + $seriesColor = $seriesData[$i]['color']; + array_push($seriesColors, $seriesColor); + } + $googleOptions->setColors($seriesColors); + + return $googleOptions; + } + + /** + * @param $options + * @return ChartType + */ + private function charts_google_create_chart_type($options) { + + $googleChartType = new ChartType(); + $googleChartType->setChartType($options['type']); + + return $googleChartType; + } +} diff --git a/modules/charts_highcharts/charts_highcharts.libraries.yml b/modules/charts_highcharts/charts_highcharts.libraries.yml index 03472b2..7a5d1fb 100644 --- a/modules/charts_highcharts/charts_highcharts.libraries.yml +++ b/modules/charts_highcharts/charts_highcharts.libraries.yml @@ -17,4 +17,4 @@ highcharts: js: vendor/highcharts/highcharts.js: {} dependencies: - - core/jquery + - charts_highcharts/charts_highcharts diff --git a/modules/charts_highcharts/charts_highcharts.module b/modules/charts_highcharts/charts_highcharts.module index 14cb767..258c824 100644 --- a/modules/charts_highcharts/charts_highcharts.module +++ b/modules/charts_highcharts/charts_highcharts.module @@ -3,111 +3,18 @@ * @file * Charts module integration with Highcharts library. */ -use Drupal\charts_highcharts\Settings\Highcharts\ChartType; -use Drupal\charts_highcharts\Settings\Highcharts\ChartTitle; -use Drupal\charts_highcharts\Settings\Highcharts\Xaxis; -use Drupal\charts_highcharts\Settings\Highcharts\ChartLabel; -use Drupal\charts_highcharts\Settings\Highcharts\YaxisLabel; -use Drupal\charts_highcharts\Settings\Highcharts\Yaxis; -use Drupal\charts_highcharts\Settings\Highcharts\YaxisTitle; -use Drupal\charts_highcharts\Settings\Highcharts\DataLabelStatus; -use Drupal\charts_highcharts\Settings\Highcharts\DataLabels; -use Drupal\charts_highcharts\Settings\Highcharts\PlotOptions; -use Drupal\charts_highcharts\Settings\Highcharts\Tooltip; -use Drupal\charts_highcharts\Settings\Highcharts\ChartCredits; -use Drupal\charts_highcharts\Settings\Highcharts\ChartLegend; -use Drupal\charts_highcharts\Settings\Highcharts\Highcharts; + /** * Implements hook_charts_info(). */ function charts_highcharts_charts_info() { - $info['highcharts'] = array( + $info['highcharts'] = [ 'label' => t('Highcharts'), 'render' => '_charts_highcharts_render', - 'types' => array('area', 'bar', 'column', 'line', 'pie', 'scatter'), + 'types' => ['area', 'bar', 'column', 'line', 'pie', 'scatter'], 'file' => 'charts_highcharts.inc', - ); + ]; return $info; } - -/** - * Creates a JSON Object formatted for Highcharts to use - * - * @param $options - * @param array $categories - * @param array $seriesData - * - * @param array $attachmentDisplayOptions - * - * @return Highcharts object to be used by highcharts javascripts visualization framework - */ -function charts_highcharts_render_charts($options, $categories = array(), $seriesData = array(), $attachmentDisplayOptions = []) { - - $chart = new ChartType(); - $chart->setType($options['type']); - $chartTitle = new ChartTitle(); - $chartTitle->setText($options['title']); - $chartXaxis = new Xaxis(); - $chartLabels = new ChartLabel(); - $chartLabels->setRotation($options['xaxis_labels_rotation']); - $chartXaxis->setCategories($categories); - $chartTitle->setText($options['title']); - $chartXaxis->setTitle($chartTitle); - $chartXaxis->setLabels($chartLabels); - $yaxisLabels = new YaxisLabel(); - $chartYaxis = new Yaxis(); - $yAxes = []; - $yAxisTitle = new YaxisTitle(); - $yAxisTitle->setText($options['yaxis_title']); - if (!empty($options['yaxis_min'])){ - $chartYaxis->min = $options['yaxis_min']; - } - if (!empty($options['yaxis_max'])){ - $chartYaxis->max = $options['yaxis_max']; - } - - $chartYaxis->setLabels($yaxisLabels); - $chartYaxis->setTitle($yAxisTitle); - array_push($yAxes, $chartYaxis); - // Chart libraries tend to supports only one secondary axis. - if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0){ - $chartYaxisSecondary = new Yaxis(); - $yAxisTitleSecondary = new YaxisTitle(); - $yAxisTitleSecondary->setText($attachmentDisplayOptions[0]['style']['options']['yaxis_title']); - $chartYaxisSecondary->setTitle($yAxisTitleSecondary); - $chartYaxisSecondary->setLabels($yaxisLabels); - $chartYaxisSecondary->opposite = 'true'; - - if (!empty($attachmentDisplayOptions[0]['style']['options']['yaxis_min'])){ - $chartYaxisSecondary->min = $attachmentDisplayOptions[0]['style']['options']['yaxis_min']; - } - if (!empty($attachmentDisplayOptions[0]['style']['options']['yaxis_max'])){ - $chartYaxisSecondary->max = $attachmentDisplayOptions[0]['style']['options']['yaxis_max']; - } - array_push($yAxes, $chartYaxisSecondary); - } - $dataLabelStatus = new DataLabelStatus(); - $dataLabels = new DataLabels(); - $dataLabels->setDataLabels($dataLabelStatus); - $barPlotOptns = new PlotOptions(); - $barPlotOptns->setBar($dataLabels); - $chartTooltip = new Tooltip(); - $chartCredits = new ChartCredits(); - $chartLegend = new ChartLegend(); - - $highchart = new Highcharts(); - $highchart->setChart($chart); - $highchart->setTitle($chartTitle); - $highchart->setXAxis($chartXaxis); - //$highchart->setYAxis($chartYaxis); - $highchart->yAxis = $yAxes; - $highchart->setTooltip($chartTooltip); - $highchart->setPlotOptions($barPlotOptns); - $highchart->setCredits($chartCredits); - $highchart->setLegend($chartLegend); - $highchart->setSeries($seriesData); - - return $highchart; -} diff --git a/modules/charts_highcharts/src/Charts/HighchartsChartsRender.php b/modules/charts_highcharts/src/Charts/HighchartsChartsRender.php new file mode 100644 index 0000000..e0116bb --- /dev/null +++ b/modules/charts_highcharts/src/Charts/HighchartsChartsRender.php @@ -0,0 +1,113 @@ +<?php + +namespace Drupal\charts_highcharts\Charts; + +use Drupal\charts\Util\Util; +use Drupal\charts_highcharts\Settings\Highcharts\ChartType; +use Drupal\charts_highcharts\Settings\Highcharts\ChartTitle; +use Drupal\charts_highcharts\Settings\Highcharts\Xaxis; +use Drupal\charts_highcharts\Settings\Highcharts\ChartLabel; +use Drupal\charts_highcharts\Settings\Highcharts\YaxisLabel; +use Drupal\charts_highcharts\Settings\Highcharts\Yaxis; +use Drupal\charts_highcharts\Settings\Highcharts\YaxisTitle; +use Drupal\charts_highcharts\Settings\Highcharts\DataLabelStatus; +use Drupal\charts_highcharts\Settings\Highcharts\DataLabels; +use Drupal\charts_highcharts\Settings\Highcharts\PlotOptions; +use Drupal\charts_highcharts\Settings\Highcharts\Tooltip; +use Drupal\charts_highcharts\Settings\Highcharts\ChartCredits; +use Drupal\charts_highcharts\Settings\Highcharts\ChartLegend; +use Drupal\charts_highcharts\Settings\Highcharts\Highcharts; + +class HighchartsChartsRender { + + public function __construct($categories, $seriesData, $options, $attachmentDisplayOptions, &$variables, $chartId) { + + Util::checkMissingLibrary('charts_highcharts', '/vendor/highcharts/highcharts.js'); + $highchart = $this->charts_highcharts_render_charts($options, $categories, $seriesData, $attachmentDisplayOptions); + $variables['chart_type'] = 'highcharts'; + $variables['content_attributes']['data-chart'][] = json_encode($highchart); + $variables['attributes']['id'][0] = $chartId; + $variables['attributes']['class'][] = 'charts-highchart'; + + } + + /** + * Creates a JSON Object formatted for Highcharts to use + * + * @param $options + * @param array $categories + * @param array $seriesData + * + * @param array $attachmentDisplayOptions + * + * @return Highcharts object to be used by highcharts javascripts visualization framework + */ + private function charts_highcharts_render_charts($options, $categories = [], $seriesData = [], $attachmentDisplayOptions = []) { + + $chart = new ChartType(); + $chart->setType($options['type']); + $chartTitle = new ChartTitle(); + $chartTitle->setText($options['title']); + $chartXaxis = new Xaxis(); + $chartLabels = new ChartLabel(); + $chartLabels->setRotation($options['xaxis_labels_rotation']); + $chartXaxis->setCategories($categories); + $chartTitle->setText($options['title']); + $chartXaxis->setTitle($chartTitle); + $chartXaxis->setLabels($chartLabels); + $yaxisLabels = new YaxisLabel(); + $chartYaxis = new Yaxis(); + $yAxes = []; + $yAxisTitle = new YaxisTitle(); + $yAxisTitle->setText($options['yaxis_title']); + if (!empty($options['yaxis_min'])) { + $chartYaxis->min = $options['yaxis_min']; + } + if (!empty($options['yaxis_max'])) { + $chartYaxis->max = $options['yaxis_max']; + } + + $chartYaxis->setLabels($yaxisLabels); + $chartYaxis->setTitle($yAxisTitle); + array_push($yAxes, $chartYaxis); + // Chart libraries tend to supports only one secondary axis. + if ($attachmentDisplayOptions[0]['inherit_yaxis'] == 0) { + $chartYaxisSecondary = new Yaxis(); + $yAxisTitleSecondary = new YaxisTitle(); + $yAxisTitleSecondary->setText($attachmentDisplayOptions[0]['style']['options']['yaxis_title']); + $chartYaxisSecondary->setTitle($yAxisTitleSecondary); + $chartYaxisSecondary->setLabels($yaxisLabels); + $chartYaxisSecondary->opposite = 'true'; + + if (!empty($attachmentDisplayOptions[0]['style']['options']['yaxis_min'])) { + $chartYaxisSecondary->min = $attachmentDisplayOptions[0]['style']['options']['yaxis_min']; + } + if (!empty($attachmentDisplayOptions[0]['style']['options']['yaxis_max'])) { + $chartYaxisSecondary->max = $attachmentDisplayOptions[0]['style']['options']['yaxis_max']; + } + array_push($yAxes, $chartYaxisSecondary); + } + $dataLabelStatus = new DataLabelStatus(); + $dataLabels = new DataLabels(); + $dataLabels->setDataLabels($dataLabelStatus); + $barPlotOptns = new PlotOptions(); + $barPlotOptns->setBar($dataLabels); + $chartTooltip = new Tooltip(); + $chartCredits = new ChartCredits(); + $chartLegend = new ChartLegend(); + + $highchart = new Highcharts(); + $highchart->setChart($chart); + $highchart->setTitle($chartTitle); + $highchart->setXAxis($chartXaxis); + //$highchart->setYAxis($chartYaxis); + $highchart->yAxis = $yAxes; + $highchart->setTooltip($chartTooltip); + $highchart->setPlotOptions($barPlotOptns); + $highchart->setCredits($chartCredits); + $highchart->setLegend($chartLegend); + $highchart->setSeries($seriesData); + + return $highchart; + } +} diff --git a/modules/charts_highcharts/src/Settings/Highcharts/ChartLabel.php b/modules/charts_highcharts/src/Settings/Highcharts/ChartLabel.php index ad7242c..7b65ae9 100644 --- a/modules/charts_highcharts/src/Settings/Highcharts/ChartLabel.php +++ b/modules/charts_highcharts/src/Settings/Highcharts/ChartLabel.php @@ -16,7 +16,7 @@ class ChartLabel implements \JsonSerializable { * @param mixed $rotation */ public function setRotation($rotation) { - $this->rotation = (int) $rotation; + $this->rotation = (int)$rotation; } /** diff --git a/modules/charts_highcharts/src/Settings/Highcharts/Highcharts.php b/modules/charts_highcharts/src/Settings/Highcharts/Highcharts.php index cb556d5..9a6863b 100644 --- a/modules/charts_highcharts/src/Settings/Highcharts/Highcharts.php +++ b/modules/charts_highcharts/src/Settings/Highcharts/Highcharts.php @@ -6,7 +6,7 @@ class Highcharts implements \JsonSerializable { private $chart; private $title; private $xAxis; - // private $yAxis; + // private $yAxis; private $tooltip; private $plotOptions; private $legend; @@ -64,9 +64,9 @@ class Highcharts implements \JsonSerializable { /** * @param mixed $yAxis */ - /* public function setYAxis($yAxis) { - $this->yAxis = $yAxis; - }*/ + /* public function setYAxis($yAxis) { + $this->yAxis = $yAxis; + }*/ /** * @return mixed diff --git a/modules/charts_highcharts/src/Settings/Highcharts/Xaxis.php b/modules/charts_highcharts/src/Settings/Highcharts/Xaxis.php index b532f40..65ddc15 100644 --- a/modules/charts_highcharts/src/Settings/Highcharts/Xaxis.php +++ b/modules/charts_highcharts/src/Settings/Highcharts/Xaxis.php @@ -3,7 +3,7 @@ namespace Drupal\charts_highcharts\Settings\Highcharts; class Xaxis implements \JsonSerializable { - private $categories = array(); + private $categories = []; private $title; private $labels; diff --git a/src/Charts/ModuleSelector.php b/src/Charts/ModuleSelector.php new file mode 100644 index 0000000..af5ecc1 --- /dev/null +++ b/src/Charts/ModuleSelector.php @@ -0,0 +1,40 @@ +<?php + +/** + * @ file + * + * + */ + +namespace Drupal\charts\Charts; + +class ModuleSelector { + + private $moduleName; + private $assetLocation = '/vendor/'; + private $assetName; + private $categories; + private $seriesData; + private $options; + private $attachmentDisplayOptions; + private $chartId; + + public function __construct($moduleName, $categories, $seriesData, $options, $attachmentDisplayOptions, &$variables, $chartId) { + $this->moduleName = $moduleName; + $this->categories = $categories; + $this->seriesData = $seriesData; + $this->options = $options; + $this->attachmentDisplayOptions = $attachmentDisplayOptions; + $this->chartId = $chartId; + $this->moduleExists($moduleName, $variables); + } + + private function moduleExists($moduleName, &$variables) { + $moduleExist = \Drupal::moduleHandler()->moduleExists($moduleName); + if ('charts_' . $moduleExist) { + $className = ucfirst($moduleName); + $moduleChartsRenderer = 'Drupal\charts_' . $moduleName . '\Charts\\' . ucfirst($moduleName) . 'ChartsRender'; + $chartingModule = new $moduleChartsRenderer($this->categories, $this->seriesData, $this->options, $this->attachmentDisplayOptions, $variables, $this->chartId); + } + } +} diff --git a/src/Plugin/views/display/ChartsPluginDisplayChart.php b/src/Plugin/views/display/ChartsPluginDisplayChart.php index 3d3c184..cd13c6b 100644 --- a/src/Plugin/views/display/ChartsPluginDisplayChart.php +++ b/src/Plugin/views/display/ChartsPluginDisplayChart.php @@ -33,7 +33,7 @@ class ChartsPluginDisplayChart extends Attachment { protected function defineOptions() { $options = parent::defineOptions(); $options['style_plugin']['default'] = 'chart'; - $options['inherit_yaxis'] = array('default' => '1'); + $options['inherit_yaxis'] = ['default' => '1']; return $options; @@ -63,8 +63,7 @@ class ChartsPluginDisplayChart extends Attachment { $displays = array_filter($this->getOption('displays')); if (count($displays) > 1) { $attach_to = $this->t('Multiple displays'); - } - elseif (count($displays) == 1) { + } elseif (count($displays) == 1) { $display = array_shift($displays); if ($display = $this->view->storage->getDisplay($display)) { $attach_to = $display['display_title']; @@ -73,23 +72,23 @@ class ChartsPluginDisplayChart extends Attachment { if (!isset($attach_to)) { $attach_to = $this->t('Not defined'); } - $options['displays'] = array( + $options['displays'] = [ 'category' => 'attachment', 'title' => $this->t('Parent display'), 'value' => $attach_to, - ); + ]; - $options['inherit_yaxis'] = array( + $options['inherit_yaxis'] = [ 'category' => 'attachment', 'title' => $this->t('Axis settings'), 'value' => $this->getOption('inherit_yaxis') ? t('Use primary Y-axis') : t('Create secondary axis'), - ); + ]; - $options['attachment_position'] = array('disabled' => TRUE); + $options['attachment_position'] = ['disabled' => TRUE]; - $options['inherit_pager'] = array('disabled' => TRUE); + $options['inherit_pager'] = ['disabled' => TRUE]; - $options['render_pager'] = array('disabled' => TRUE); + $options['render_pager'] = ['disabled' => TRUE]; } @@ -108,16 +107,16 @@ class ChartsPluginDisplayChart extends Attachment { break; case 'inherit_yaxis': $form['#title'] .= t('Axis settings'); - $form['inherit_yaxis'] = array( + $form['inherit_yaxis'] = [ '#title' => t('Y-Axis settings'), '#type' => 'radios', - '#options' => array( + '#options' => [ 1 => t('Inherit primary of parent display'), 0 => t('Create a secondary axis'), - ), + ], '#default_value' => $this->getOption('inherit_yaxis'), '#description' => t('In most charts, the X and Y axis from the parent display are both shared with each attached child chart. However, if this chart is going to use a different unit of measurement, a secondary axis may be added on the opposite side of the normal Y-axis.'), - ); + ]; break; } diff --git a/src/Plugin/views/style/ChartsPluginStyleChart.php b/src/Plugin/views/style/ChartsPluginStyleChart.php index 38831eb..55b558d 100644 --- a/src/Plugin/views/style/ChartsPluginStyleChart.php +++ b/src/Plugin/views/style/ChartsPluginStyleChart.php @@ -34,7 +34,7 @@ class ChartsPluginStyleChart extends StylePluginBase { $options = parent::defineOptions(); // Get the default chart values. - $defaults = \Drupal::state()->get('charts_default_settings', array()); + $defaults = \Drupal::state()->get('charts_default_settings', []); $defaults += charts_default_settings(); foreach ($defaults as $default_key => $default_value) { @@ -46,7 +46,7 @@ class ChartsPluginStyleChart extends StylePluginBase { if ($this->view->style_plugin === 'chart_extension') { $options['type']['default'] = NULL; } - $options['path'] = array('default' => 'charts'); + $options['path'] = ['default' => 'charts']; return $options; } @@ -59,7 +59,7 @@ class ChartsPluginStyleChart extends StylePluginBase { $handlers = $this->displayHandler->getHandlers('field'); if (empty($handlers)) { - $form['error_markup'] = array('#markup' => '<div class="error messages">' . t('You need at least one field before you can configure your table settings') . '</div>',); + $form['error_markup'] = ['#markup' => '<div class="error messages">' . t('You need at least one field before you can configure your table settings') . '</div>',]; } // Limit grouping options (we only support one grouping field). @@ -77,7 +77,7 @@ class ChartsPluginStyleChart extends StylePluginBase { // Merge in the global chart settings form. $field_options = $this->displayHandler->getFieldLabels(); - $form = charts_settings_form($form, $this->options, $field_options, array('style_options')); + $form = charts_settings_form($form, $this->options, $field_options, ['style_options']); // Reduce the options if this is a chart extension. /*if (empty($this->displayHandler->getAttachedDisplays())) { @@ -115,7 +115,7 @@ class ChartsPluginStyleChart extends StylePluginBase { $errors = parent::validate(); $dataFields = $this->options['data_fields']; - $dataFieldsValueState = array(); + $dataFieldsValueState = []; $dataFieldsCounter = 0; foreach ($dataFields as $value) { @@ -159,7 +159,7 @@ class ChartsPluginStyleChart extends StylePluginBase { // Assemble the fields to be used to provide data access. $data_field_options = array_filter($this->options['data_fields']); - $data_fields = array(); + $data_fields = []; foreach ($data_field_options as $field_key) { if (isset($field_handlers[$field_key])) { $data_fields[$field_key] = $field_handlers[$field_key]; @@ -170,7 +170,7 @@ class ChartsPluginStyleChart extends StylePluginBase { unset($data_fields[$label_field_key]); } $chart_id = $this->view->id() . '__' . $this->view->current_display; - $chart = array( + $chart = [ '#type' => 'chart', '#chart_type' => $this->options['type'], '#chart_library' => $this->options['library'], @@ -189,17 +189,17 @@ class ChartsPluginStyleChart extends StylePluginBase { '#view' => $this->view, // Pass info about the actual view results to allow further processing '#theme' => 'views_view_charts', - ); + ]; $chart_type_info = charts_get_type($this->options['type']); if ($chart_type_info['axis'] === CHARTS_SINGLE_AXIS) { $data_field_key = key($data_fields); $data_field = $data_fields[$data_field_key]; - $data = array(); + $data = []; $this->renderFields($this->view->result); $renders = $this->rendered_fields; foreach ($renders as $row_number => $row) { - $data_row = array(); + $data_row = []; if ($label_field_key) { // Labels need to be decoded, as the charting library will re-encode. $data_row[] = htmlspecialchars_decode($this->getField($row_number, $label_field_key), ENT_QUOTES); @@ -210,7 +210,7 @@ class ChartsPluginStyleChart extends StylePluginBase { $value = NULL; } // Strip thousands placeholders if present, then cast to float. else { - $value = (float)str_replace(array(',', ' '), '', $value); + $value = (float)str_replace([',', ' '], '', $value); } $data_row[] = $value; $data[] = $data_row; @@ -220,25 +220,25 @@ class ChartsPluginStyleChart extends StylePluginBase { $chart['#legend_title'] = $label_field->options['label']; } - $chart[$this->view->current_display . '_series'] = array( + $chart[$this->view->current_display . '_series'] = [ '#type' => 'chart_data', '#data' => $data, '#title' => $data_field->options['label'], - ); + ]; } else { - $chart['xaxis'] = array( + $chart['xaxis'] = [ '#type' => 'chart_xaxis', '#title' => $this->options['xaxis_title'] ? $this->options['xaxis_title'] : FALSE, '#labels_rotation' => $this->options['xaxis_labels_rotation'], - ); - $chart['yaxis'] = array( + ]; + $chart['yaxis'] = [ '#type' => 'chart_yaxis', '#title' => $this->options['yaxis_title'] ? $this->options['yaxis_title'] : FALSE, '#labels_rotation' => $this->options['yaxis_labels_rotation'], '#max' => $this->options['yaxis_max'], '#min' => $this->options['yaxis_min'], - ); + ]; // @todo incorporate this patch: https://www.drupal.org/files/issues/charts_grouping-2146927-6.patch. $sets = $this->renderGrouping($this->view->result, $this->options['grouping'], TRUE); @@ -246,16 +246,16 @@ class ChartsPluginStyleChart extends StylePluginBase { $series_index = isset($series_index) ? $series_index + 1 : 0; $series_key = $this->view->current_display . '__' . $field_key . '_' . $series_index; foreach ($data_fields as $field_key => $field_handler) { - $chart[$series_key] = array( + $chart[$series_key] = [ '#type' => 'chart_data', - '#data' => array(), + '#data' => [], // If using a grouping field, inherit from the chart level colors. '#color' => ($series_label === '' && isset($this->options['field_colors'][$field_key])) ? $this->options['field_colors'][$field_key] : NULL, '#title' => $series_label ? $series_label : $field_handler->options['label'], '#prefix' => $this->options['yaxis_prefix'] ? $this->options['yaxis_prefix'] : NULL, '#suffix' => $this->options['yaxis_suffix'] ? $this->options['yaxis_suffix'] : NULL, '#decimal_count' => $this->options['yaxis_decimal_count'] ? $this->options['yaxis_decimal_count'] : NULL, - ); + ]; } // Grouped results come back indexed by their original result number @@ -278,7 +278,7 @@ class ChartsPluginStyleChart extends StylePluginBase { $value = NULL; } // Strip thousands placeholders if present, then cast to float. else { - $value = (float)str_replace(array(',', ' '), '', $value); + $value = (float)str_replace([',', ' '], '', $value); } $chart[$series_key]['#data'][] = $value; } @@ -291,7 +291,7 @@ class ChartsPluginStyleChart extends StylePluginBase { // on top of it. $children_displays = $this->getChildrenChartDisplays(); //contains the different subviews of the attachments - $attachments = array(); + $attachments = []; $service = \Drupal::service('charts.charts_attachment'); foreach ($children_displays as $child_display) { diff --git a/src/Util/Util.php b/src/Util/Util.php index 4bb54f8..b9f63dd 100644 --- a/src/Util/Util.php +++ b/src/Util/Util.php @@ -1,4 +1,10 @@ <?php +/** + * @file + * + * A class with a series of utility functions for manipulation of views & attachment data. + * + */ namespace Drupal\charts\Util; @@ -12,20 +18,20 @@ class Util { * @return array */ public static function viewsData($view, $labelValues, $labelField, $color, $attachmentChartTypeOption) { - $data = array(); + $data = []; foreach ($view->result as $id => $row) { $numberFields = 0; - $rowData = array(); + $rowData = []; foreach ($labelValues as $fieldId => $rowDataValue) { - $rowData[$numberFields] = array( + $rowData[$numberFields] = [ 'value' => $view->field[$fieldId]->getValue($row), 'label_field' => $view->field[$labelField]->getValue($row), 'label' => $view->field[$fieldId]->label(), // 'label' => $view->display_handler->display['id'], to use display_id 'color' => $color[$fieldId], 'type' => $attachmentChartTypeOption, - ); + ]; $numberFields++; } $data[$id] = $rowData; @@ -39,7 +45,7 @@ class Util { */ public static function removeUnselectedFields($valueField) { - $fieldValues = array(); + $fieldValues = []; foreach ($valueField as $key => $value) { if (!empty($value)) { $fieldValues[$key] = $value; @@ -53,20 +59,20 @@ class Util { */ public static function createChartableData($data) { - $chartData = array(); - $categories = array(); - $seriesData = array(); + $chartData = []; + $categories = []; + $seriesData = []; for ($i = 0; $i < count($data[0]); $i++) { - $seriesRowData = array('name' => '', 'color' => '', 'type' => '', 'data' => array()); + $seriesRowData = ['name' => '', 'color' => '', 'type' => '', 'data' => []]; for ($j = 0; $j < count($data); $j++) { $categories[$j] = $data[$j][$i]['label_field']; $seriesRowData['name'] = $data[$j][$i]['label']; // $seriesRowData['name'] = $data[$j][$i]['label_field']; $seriesRowData['type'] = $data[$j][$i]['type']; $seriesRowData['color'] = $data[$j][$i]['color']; - array_push($seriesRowData['data'], ((int) ($data[$j][$i]['value']))); + array_push($seriesRowData['data'], ((int)($data[$j][$i]['value']))); } array_push($seriesData, $seriesRowData); } @@ -83,11 +89,11 @@ class Util { * @param $libraryPath * */ - public static function checkMissingLibrary($moduleName, $libraryPath){ + public static function checkMissingLibrary($moduleName, $libraryPath) { $module_path = drupal_get_path('module', $moduleName); - if (!file_exists($module_path . $libraryPath)){ - drupal_set_message(t('Charting libraries for '.$moduleName.' might - not be installed. Run \'composer install\' for '.$moduleName.' sub-module.'), 'error'); + if (!file_exists($module_path . $libraryPath)) { + drupal_set_message(t('Charting libraries for ' . $moduleName . ' might + not be installed. Run \'composer install\' for ' . $moduleName . ' sub-module.'), 'error'); } } diff --git a/templates/views-view-charts.html.twig b/templates/views-view-charts.html.twig index 2481122..5c4f4a3 100644 --- a/templates/views-view-charts.html.twig +++ b/templates/views-view-charts.html.twig @@ -1,14 +1,3 @@ -{% if chart_type == 'google' %} - {{ attach_library('charts_google/google') }} - {{ attach_library('charts_google/charts_google') }} -{% elseif chart_type == 'highcharts' %} - {{ attach_library('charts_highcharts/highcharts') }} - {{ attach_library('charts_highcharts/charts_highcharts') }} -{% elseif chart_type == 'c3' %} - {{ attach_library('charts_c3/d3') }} - {{ attach_library('charts_c3/c3') }} - {{ attach_library('charts_c3/charts_c3') }} -{% else %} - Unconfigured charts -{% endif %} +{% set library = 'charts_' ~ chart_type ~ '/' ~ chart_type %} +{{ attach_library("#{ library }") }} <div {{ attributes }} {{ content_attributes }} style="width:100%; height:400px;"></div> -- GitLab