Skip to content
Extraits de code Groupes Projets
Evolution.php 7,27 ko
Newer Older
  • Learn to ignore specific revisions
  • <?php
    /**
     * Piwik - Open source web analytics
     *
     * @link http://piwik.org
     * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
     *
    
     * @category Piwik_Plugins
     * @package CoreVisualizations
    
    namespace Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph;
    
    use Piwik\Plugin\Controller;
    
    use Piwik\Plugins\CoreVisualizations\JqplotDataGenerator;
    
    use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph;
    use Piwik\Site;
    
    use Piwik\ViewDataTable\Properties;
    use Piwik\Visualization\Config;
    use Piwik\Visualization\Request;
    
     * Visualization that renders HTML for a line graph using jqPlot.
    
     */
    class Evolution extends JqplotGraph
    {
        const ID = 'graphEvolution';
    
         */
        const SHOW_LINE_GRAPH = 'show_line_graph';
    
        public static $clientSideProperties = array('show_line_graph');
    
        public static $overridableProperties = array('show_line_graph');
    
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->calculateEvolutionDateRange();
    
        }
    
        public function beforeLoadDataTable(Request $request, Config $properties)
        {
            parent::beforeLoadDataTable($request, $properties);
    
            // period will be overridden when 'range' is requested in the UI
    
            // but the graph will display for each day of the range.
            // Default 'range' behavior is to return the 'sum' for the range
            if (Common::getRequestVar('period', false) == 'range') {
    
                $request->request_parameters_to_modify['period'] = 'day';
    
        /**
         * @param DataTable|DataTable\Map $dataTable
         * @param \Piwik\Visualization\Config $properties
         * @param \Piwik\Visualization\Request $request
         */
        public function afterAllFilteresAreApplied($dataTable, Config $properties, Request $request)
        {
            parent::afterAllFilteresAreApplied($dataTable, $properties, $request);
    
            if ($view->visualization_properties->x_axis_step_size === false) {
    
                $view->visualization_properties->x_axis_step_size = $this->getDefaultXAxisStepSize($dataTable->getRowsCount());
    
        public function configureVisualization(Config $properties)
        {
            $properties->datatable_js_type = 'JqplotEvolutionGraphDataTable';
    
        public static function getDefaultPropertyValues()
    
            $result = parent::getDefaultPropertyValues();
    
            $result['show_all_views_icons'] = false;
            $result['show_table'] = false;
            $result['show_table'] = false;
            $result['show_table_all_columns'] = false;
    
            $result['hide_annotations_view'] = false;
    
            $result['visualization_properties']['jqplot_graph']['x_axis_step_size'] = false;
    
            $result['visualization_properties']['graphEvolution']['show_line_graph'] = true;
    
            return $result;
        }
    
        protected function makeDataGenerator($properties)
        {
            return JqplotDataGenerator::factory('evolution', $properties);
        }
    
        /**
         * Based on the period, date and evolution_{$period}_last_n query parameters,
         * calculates the date range this evolution chart will display data for.
         */
    
    Thomas Steur's avatar
    Thomas Steur a validé
        private function calculateEvolutionDateRange()
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $view = $this->viewDataTable;
    
            $period = Common::getRequestVar('period');
    
            $defaultLastN = self::getDefaultLastN($period);
            $originalDate = Common::getRequestVar('date', 'last' . $defaultLastN, 'string');
    
    
            if ($period != 'range') { // show evolution limit if the period is not a range
                $view->show_limit_control = true;
    
    
                // set the evolution_{$period}_last_n query param
                if (Range::parseDateRange($originalDate)) { // if a multiple period
                    // overwrite last_n param using the date range
                    $oPeriod = new Range($period, $originalDate);
                    $lastN = count($oPeriod->getSubperiods());
                } else { // if not a multiple period
                    list($newDate, $lastN) = self::getDateRangeAndLastN($period, $originalDate, $defaultLastN);
                    $view->request_parameters_to_modify['date'] = $newDate;
                    $view->custom_parameters['dateUsedInGraph'] = $newDate;
                }
                $lastNParamName = self::getLastNParamName($period);
                $view->custom_parameters[$lastNParamName] = $lastN;
            }
        }
    
        /**
         * Returns the entire date range and lastN value for the current request, based on
         * a period type and end date.
         *
         * @param string $period The period type, 'day', 'week', 'month' or 'year'
         * @param string $endDate The end date.
         * @param int|null $defaultLastN The default lastN to use. If null, the result of
         *                               getDefaultLastN is used.
         * @return array An array w/ two elements. The first is a whole date range and the second
         *               is the lastN number used, ie, array('2010-01-01,2012-01-02', 2).
         */
        public static function getDateRangeAndLastN($period, $endDate, $defaultLastN = null)
        {
            if ($defaultLastN === null) {
                $defaultLastN = self::getDefaultLastN($period);
            }
    
            $lastNParamName = self::getLastNParamName($period);
            $lastN = Common::getRequestVar($lastNParamName, $defaultLastN, 'int');
    
            $site = new Site(Common::getRequestVar('idSite'));
    
            $dateRange = Controller::getDateRangeRelativeToEndDate($period, 'last' . $lastN, $endDate, $site);
    
            return array($dateRange, $lastN);
        }
    
        /**
         * Returns the default last N number of dates to display for a given period.
         *
         * @param string $period 'day', 'week', 'month' or 'year'
         * @return int
         */
        public static function getDefaultLastN($period)
        {
            switch ($period) {
                case 'week':
                    return 26;
                case 'month':
                    return 24;
                case 'year':
                    return 5;
                case 'day':
                default:
                    return 30;
            }
        }
    
        /**
         * Returns the query parameter that stores the lastN number of periods to get for
         * the evolution graph.
         *
         * @param string $period The period type, 'day', 'week', 'month' or 'year'.
         * @return string
         */
        public static function getLastNParamName($period)
        {
            return "evolution_{$period}_last_n";
        }
    
        public function getDefaultXAxisStepSize($countGraphElements)
    
        {
            // when the number of elements plotted can be small, make sure the X legend is useful
            if ($countGraphElements <= 7) {
                return 1;
            }
    
            $periodLabel = Common::getRequestVar('period');
            switch ($periodLabel) {
                case 'day':
                case 'range':
                    $steps = 5;
                    break;
                case 'week':
                    $steps = 4;
                    break;
                case 'month':
                    $steps = 5;
                    break;
                case 'year':
                    $steps = 5;
                    break;
                default:
                    $steps = 5;
                    break;
            }
    
            $paddedCount = $countGraphElements + 2; // pad count so last label won't be cut off
            return ceil($paddedCount / $steps);
        }