/plugins/CoreVisualizations/Visualizations/Sparkline.php
PHP | 128 lines | 77 code | 24 blank | 27 comment | 14 complexity | 87ec3e738f458d08473c3bb2bfbe9d51 MD5 | raw file
Possible License(s): LGPL-3.0, JSON, MIT, GPL-3.0, LGPL-2.1, GPL-2.0, AGPL-1.0, BSD-2-Clause, BSD-3-Clause
- <?php
- /**
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
- namespace Piwik\Plugins\CoreVisualizations\Visualizations;
- use Exception;
- use Piwik\Common;
- use Piwik\DataTable;
- use Piwik\Plugin\ViewDataTable;
- /**
- * Reads the requested DataTable from the API and prepare data for the Sparkline view.
- *
- */
- class Sparkline extends ViewDataTable
- {
- const ID = 'sparkline';
- /**
- * @see ViewDataTable::main()
- * @return mixed
- */
- protected function buildView()
- {
- // If period=range, we force the sparkline to draw daily data points
- $period = Common::getRequestVar('period');
- if ($period == 'range') {
- $_GET['period'] = 'day';
- }
- $this->loadDataTableFromAPI();
- // then revert the hack for potentially subsequent getRequestVar
- $_GET['period'] = $period;
- $values = $this->getValuesFromDataTable($this->dataTable);
- if (empty($values)) {
- $values = array_fill(0, 30, 0);
- }
- $graph = new \Piwik\Visualization\Sparkline();
- $graph->setValues($values);
- $height = Common::getRequestVar('height', 0, 'int');
- if (!empty($height)) {
- $graph->setHeight($height);
- }
- $width = Common::getRequestVar('width', 0, 'int');
- if (!empty($width)) {
- $graph->setWidth($width);
- }
- $graph->main();
- return $graph;
- }
- /**
- * @param DataTable\Map $dataTableMap
- * @param string $columnToPlot
- *
- * @return array
- * @throws \Exception
- */
- protected function getValuesFromDataTableMap($dataTableMap, $columnToPlot)
- {
- $dataTableMap->applyQueuedFilters();
- $values = array();
- foreach ($dataTableMap->getDataTables() as $table) {
- if ($table->getRowsCount() > 1) {
- throw new Exception("Expecting only one row per DataTable");
- }
- $value = 0;
- $onlyRow = $table->getFirstRow();
- if (false !== $onlyRow) {
- if (!empty($columnToPlot)) {
- $value = $onlyRow->getColumn($columnToPlot);
- } // if not specified, we load by default the first column found
- // eg. case of getLastDistinctCountriesGraph
- else {
- $columns = $onlyRow->getColumns();
- $value = current($columns);
- }
- }
- $values[] = $value;
- }
- return $values;
- }
- protected function getValuesFromDataTable($dataTable)
- {
- $columns = $this->config->columns_to_display;
- $columnToPlot = false;
- if (!empty($columns)) {
- $columnToPlot = reset($columns);
- if ($columnToPlot == 'label') {
- $columnToPlot = next($columns);
- }
- }
- // a Set is returned when using the normal code path to request data from Archives, in all core plugins
- // however plugins can also return simple datatable, hence why the sparkline can accept both data types
- if ($this->dataTable instanceof DataTable\Map) {
- $values = $this->getValuesFromDataTableMap($dataTable, $columnToPlot);
- } elseif ($this->dataTable instanceof DataTable) {
- $values = $this->dataTable->getColumn($columnToPlot);
- } else {
- $values = false;
- }
- return $values;
- }
- }