Welcome to mirror list, hosted at ThFree Co, Russian Federation.

Sparkline.php « Visualizations « CoreVisualizations « plugins - github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: a2bdb09d2c12091ebdf02910b5b124d340e1b6b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?php
/**
 * Piwik - free/libre analytics platform
 *
 * @link https://matomo.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
     */
    public function render()
    {
        // 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->render();
    }

    /**
     * @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;
    }
}