Пример #1
0
 protected function unprefixColumns(&$columns)
 {
     $columns = Piwik::getArrayFromApiParameter($columns);
     foreach ($columns as &$column) {
         $column = str_replace(self::COLUMN_SUFFIX, "", $column);
     }
 }
Пример #2
0
 public function getRowEvolution($idSite, $period, $date, $apiModule, $apiAction, $label = false, $segment = false, $column = false, $language = false, $idGoal = false, $legendAppendMetric = true, $labelUseAbsoluteUrl = true)
 {
     // validation of requested $period & $date
     if ($period == 'range') {
         // load days in the range
         $period = 'day';
     }
     if (!Period::isMultiplePeriod($date, $period)) {
         throw new Exception("Row evolutions can not be processed with this combination of \\'date\\' and \\'period\\' parameters.");
     }
     $label = ResponseBuilder::unsanitizeLabelParameter($label);
     $labels = Piwik::getArrayFromApiParameter($label);
     $metadata = $this->getRowEvolutionMetaData($idSite, $period, $date, $apiModule, $apiAction, $language, $idGoal);
     $dataTable = $this->loadRowEvolutionDataFromAPI($metadata, $idSite, $period, $date, $apiModule, $apiAction, $labels, $segment, $idGoal);
     if (empty($labels)) {
         $labels = $this->getLabelsFromDataTable($dataTable, $labels);
         $dataTable = $this->enrichRowAddMetadataLabelIndex($labels, $dataTable);
     }
     if (count($labels) != 1) {
         $data = $this->getMultiRowEvolution($dataTable, $metadata, $apiModule, $apiAction, $labels, $column, $legendAppendMetric, $labelUseAbsoluteUrl);
     } else {
         $data = $this->getSingleRowEvolution($idSite, $dataTable, $metadata, $apiModule, $apiAction, $labels[0], $labelUseAbsoluteUrl);
     }
     return $data;
 }
Пример #3
0
 /**
  * Here you can configure how your report should be displayed. For instance whether your report supports a search
  * etc. You can also change the default request config. For instance change how many rows are displayed by default.
  *
  * @param ViewDataTable $view
  */
 public function configureView(ViewDataTable $view)
 {
     if ($view->isViewDataTableId(Sparklines::ID)) {
         /** @var Sparklines $view */
         $view->config->addSparklineMetric(array('server1'));
         $view->config->addSparklineMetric(array('server2'));
         $view->config->addTranslations(array('server1' => 'Evolution of temperature for server piwik.org'));
         $view->config->addTranslations(array('server2' => 'Evolution of temperature for server dev.piwik.org'));
     } elseif ($view->isViewDataTableId(Evolution::ID)) {
         /** @var Evolution $view */
         $selectableColumns = array('server1', 'server2');
         $columns = Common::getRequestVar('columns', false);
         if (!empty($columns)) {
             $columns = Piwik::getArrayFromApiParameter($columns);
         }
         $columns = array_merge($columns ? $columns : array(), $selectableColumns);
         $view->config->columns_to_display = $columns;
         $view->config->addTranslations(array_combine($columns, $columns));
         $view->config->selectable_columns = $selectableColumns;
         $view->requestConfig->filter_sort_column = 'label';
         $view->requestConfig->filter_sort_order = 'asc';
         $view->config->documentation = 'My documentation';
         $view->config->show_goals = false;
     }
 }
Пример #4
0
 public function get($idSite, $period, $date, $segment = false, $columns = false)
 {
     Piwik::checkUserHasViewAccess($idSite);
     $archive = Archive::build($idSite, $period, $date, $segment);
     // array values are comma separated
     $columns = Piwik::getArrayFromApiParameter($columns);
     $tempColumns = array();
     $bounceRateRequested = $actionsPerVisitRequested = $averageVisitDurationRequested = false;
     if (!empty($columns)) {
         // make sure base metrics are there for processed metrics
         if (false !== ($bounceRateRequested = array_search('bounce_rate', $columns))) {
             if (!in_array('nb_visits', $columns)) {
                 $tempColumns[] = 'nb_visits';
             }
             if (!in_array('bounce_count', $columns)) {
                 $tempColumns[] = 'bounce_count';
             }
             unset($columns[$bounceRateRequested]);
         }
         if (false !== ($actionsPerVisitRequested = array_search('nb_actions_per_visit', $columns))) {
             if (!in_array('nb_visits', $columns)) {
                 $tempColumns[] = 'nb_visits';
             }
             if (!in_array('nb_actions', $columns)) {
                 $tempColumns[] = 'nb_actions';
             }
             unset($columns[$actionsPerVisitRequested]);
         }
         if (false !== ($averageVisitDurationRequested = array_search('avg_time_on_site', $columns))) {
             if (!in_array('nb_visits', $columns)) {
                 $tempColumns[] = 'nb_visits';
             }
             if (!in_array('sum_visit_length', $columns)) {
                 $tempColumns[] = 'sum_visit_length';
             }
             unset($columns[$averageVisitDurationRequested]);
         }
         $tempColumns = array_unique($tempColumns);
         rsort($tempColumns);
         $columns = array_merge($columns, $tempColumns);
     } else {
         $bounceRateRequested = $actionsPerVisitRequested = $averageVisitDurationRequested = true;
         $columns = $this->getCoreColumns($period);
     }
     $dataTable = $archive->getDataTableFromNumeric($columns);
     // Process ratio metrics from base metrics, when requested
     if ($bounceRateRequested !== false) {
         $dataTable->filter('ColumnCallbackAddColumnPercentage', array('bounce_rate', 'bounce_count', 'nb_visits', 0));
     }
     if ($actionsPerVisitRequested !== false) {
         $dataTable->filter('ColumnCallbackAddColumnQuotient', array('nb_actions_per_visit', 'nb_actions', 'nb_visits', 1));
     }
     if ($averageVisitDurationRequested !== false) {
         $dataTable->filter('ColumnCallbackAddColumnQuotient', array('avg_time_on_site', 'sum_visit_length', 'nb_visits', 0));
     }
     // remove temp metrics that were used to compute processed metrics
     $dataTable->deleteColumns($tempColumns);
     return $dataTable;
 }
Пример #5
0
 public function getEvolutionGraph($fetch = false, array $columns = array())
 {
     if (empty($columns)) {
         $columns = Common::getRequestVar('columns');
         $columns = Piwik::getArrayFromApiParameter($columns);
     }
     $view = $this->getLastUnitGraphAcrossPlugins($this->pluginName, __FUNCTION__, $columns, $selectableColumns = array('server1', 'server2'), 'My documentation', 'ExampleUI.getTemperaturesEvolution');
     $view->requestConfig->filter_sort_column = 'label';
     return $this->renderView($view);
 }
Пример #6
0
 public function get($idSite, $period, $date, $segment = false, $columns = false)
 {
     Piwik::checkUserHasViewAccess($idSite);
     $archive = Archive::build($idSite, $period, $date, $segment);
     $requestedColumns = Piwik::getArrayFromApiParameter($columns);
     $report = ReportsProvider::factory("VisitsSummary", "get");
     $columns = $report->getMetricsRequiredForReport($this->getCoreColumns($period), $requestedColumns);
     $dataTable = $archive->getDataTableFromNumeric($columns);
     if (!empty($requestedColumns)) {
         $columnsToShow = $requestedColumns ?: $report->getAllMetrics();
         $dataTable->queueFilter('ColumnDelete', array($columnsToRemove = array(), $columnsToShow));
     }
     return $dataTable;
 }
Пример #7
0
 /**
  * Returns the list of metrics (pages, downloads, outlinks)
  *
  * @param int $idSite
  * @param string $period
  * @param string $date
  * @param bool|string $segment
  * @param bool|array $columns
  * @return DataTable
  */
 public function get($idSite, $period, $date, $segment = false, $columns = false)
 {
     Piwik::checkUserHasViewAccess($idSite);
     $archive = Archive::build($idSite, $period, $date, $segment);
     $metrics = Archiver::$actionsAggregateMetrics;
     $metrics['Actions_avg_time_generation'] = 'avg_time_generation';
     // get requested columns
     $columns = Piwik::getArrayFromApiParameter($columns);
     if (!empty($columns)) {
         // get the columns that are available and requested
         $columns = array_intersect($columns, array_values($metrics));
         $columns = array_values($columns);
         // make sure indexes are right
         $nameReplace = array();
         foreach ($columns as $i => $column) {
             $fullColumn = array_search($column, $metrics);
             $columns[$i] = $fullColumn;
             $nameReplace[$fullColumn] = $column;
         }
         if (false !== ($avgGenerationTimeRequested = array_search('Actions_avg_time_generation', $columns))) {
             unset($columns[$avgGenerationTimeRequested]);
             $avgGenerationTimeRequested = true;
         }
     } else {
         // get all columns
         unset($metrics['Actions_avg_time_generation']);
         $columns = array_keys($metrics);
         $nameReplace =& $metrics;
         $avgGenerationTimeRequested = true;
     }
     if ($avgGenerationTimeRequested) {
         $tempColumns[] = Archiver::METRIC_SUM_TIME_RECORD_NAME;
         $tempColumns[] = Archiver::METRIC_HITS_TIMED_RECORD_NAME;
         $columns = array_merge($columns, $tempColumns);
         $columns = array_unique($columns);
         $nameReplace[Archiver::METRIC_SUM_TIME_RECORD_NAME] = 'sum_time_generation';
         $nameReplace[Archiver::METRIC_HITS_TIMED_RECORD_NAME] = 'nb_hits_with_time_generation';
     }
     $table = $archive->getDataTableFromNumeric($columns);
     // replace labels (remove Actions_)
     $table->filter('ReplaceColumnNames', array($nameReplace));
     // compute avg generation time
     if ($avgGenerationTimeRequested) {
         $table->filter('ColumnCallbackAddColumnQuotient', array('avg_time_generation', 'sum_time_generation', 'nb_hits_with_time_generation', 3));
         $table->deleteColumns(array('sum_time_generation', 'nb_hits_with_time_generation'));
     }
     return $table;
 }
Пример #8
0
 public function getEvolutionGraph(array $columns = array(), array $defaultColumns = array())
 {
     if (empty($columns)) {
         $columns = Common::getRequestVar('columns', false);
         if (false !== $columns) {
             $columns = Piwik::getArrayFromApiParameter($columns);
         }
     }
     $view = $this->getLastUnitGraphAcrossPlugins($this->pluginName, __FUNCTION__, $columns, $selectableColumns = array('server1', 'server2'), 'My documentation', 'ExampleUI.getTemperaturesEvolution');
     $view->requestConfig->filter_sort_column = 'label';
     $view->requestConfig->filter_sort_order = 'asc';
     if (empty($view->config->columns_to_display) && !empty($defaultColumns)) {
         $view->config->columns_to_display = $defaultColumns;
     }
     return $this->renderView($view);
 }
Пример #9
0
 public function getEvolutionGraph($fetch = false, array $columns = array())
 {
     if (empty($columns)) {
         $columns = Common::getRequestVar('columns');
         $columns = Piwik::getArrayFromApiParameter($columns);
     }
     $documentation = Piwik::translate('VisitFrequency_ReturningVisitsDocumentation') . '<br />' . Piwik::translate('General_BrokenDownReportDocumentation') . '<br />' . Piwik::translate('VisitFrequency_ReturningVisitDocumentation');
     // Note: if you edit this array, maybe edit the code below as well
     $selectableColumns = array('nb_visits_returning', 'nb_actions_returning', 'nb_actions_per_visit_returning', 'bounce_rate_returning', 'avg_time_on_site_returning', 'nb_visits', 'nb_actions', 'nb_actions_per_visit', 'bounce_rate', 'avg_time_on_site');
     $period = Common::getRequestVar('period', false);
     if ($period == 'day') {
         // add number of unique (returning) visitors for period=day
         $selectableColumns = array_merge(array($selectableColumns[0]), array('nb_uniq_visitors_returning'), array_slice($selectableColumns, 1, -4), array('nb_uniq_visitors'), array_slice($selectableColumns, -4));
     }
     $view = $this->getLastUnitGraphAcrossPlugins($this->pluginName, __FUNCTION__, $columns, $selectableColumns, $documentation);
     return $this->renderView($view);
 }
Пример #10
0
 public function getEvolutionGraph($fetch = false, array $columns = array())
 {
     if (empty($columns)) {
         $columns = Common::getRequestVar('columns');
         $columns = Piwik::getArrayFromApiParameter($columns);
     }
     $documentation = Piwik::translate('VisitsSummary_VisitsSummaryDocumentation') . '<br />' . Piwik::translate('General_BrokenDownReportDocumentation') . '<br /><br />' . '<b>' . Piwik::translate('General_ColumnNbVisits') . ':</b> ' . Piwik::translate('General_ColumnNbVisitsDocumentation') . '<br />' . '<b>' . Piwik::translate('General_ColumnNbUniqVisitors') . ':</b> ' . Piwik::translate('General_ColumnNbUniqVisitorsDocumentation') . '<br />' . '<b>' . Piwik::translate('General_ColumnNbActions') . ':</b> ' . Piwik::translate('General_ColumnNbActionsDocumentation') . '<br />' . '<b>' . Piwik::translate('General_ColumnActionsPerVisit') . ':</b> ' . Piwik::translate('General_ColumnActionsPerVisitDocumentation');
     $selectableColumns = array('nb_visits', 'nb_uniq_visitors', 'avg_time_on_site', 'bounce_rate', 'nb_actions_per_visit', 'max_actions', 'nb_visits_converted', 'nb_pageviews', 'nb_uniq_pageviews', 'nb_downloads', 'nb_uniq_downloads', 'nb_outlinks', 'nb_uniq_outlinks', 'avg_time_generation');
     $idSite = Common::getRequestVar('idSite');
     $displaySiteSearch = Site::isSiteSearchEnabledFor($idSite);
     if ($displaySiteSearch) {
         $selectableColumns[] = 'nb_searches';
         $selectableColumns[] = 'nb_keywords';
     }
     $view = $this->getLastUnitGraphAcrossPlugins($this->pluginName, __FUNCTION__, $columns, $selectableColumns, $documentation);
     return $this->renderView($view);
 }
Пример #11
0
 /**
  * Returns the list of metrics (pages, downloads, outlinks)
  *
  * @param int $idSite
  * @param string $period
  * @param string $date
  * @param bool|string $segment
  * @param bool|array $columns
  * @return DataTable
  */
 public function get($idSite, $period, $date, $segment = false, $columns = false)
 {
     Piwik::checkUserHasViewAccess($idSite);
     $report = Report::factory("Actions", "get");
     $archive = Archive::build($idSite, $period, $date, $segment);
     $requestedColumns = Piwik::getArrayFromApiParameter($columns);
     $columns = $report->getMetricsRequiredForReport($allColumns = null, $requestedColumns);
     $inDbColumnNames = array_map(function ($value) {
         return 'Actions_' . $value;
     }, $columns);
     $dataTable = $archive->getDataTableFromNumeric($inDbColumnNames);
     $dataTable->deleteColumns(array_diff($requestedColumns, $columns));
     $newNameMapping = array_combine($inDbColumnNames, $columns);
     $dataTable->filter('ReplaceColumnNames', array($newNameMapping));
     $columnsToShow = $requestedColumns ?: $report->getAllMetrics();
     $dataTable->queueFilter('ColumnDelete', array($columnsToRemove = array(), $columnsToShow));
     return $dataTable;
 }
Пример #12
0
 public function getEvolutionGraph(array $columns = array(), array $defaultColumns = array())
 {
     if (empty($columns)) {
         $columns = Common::getRequestVar('columns', false);
         if (false !== $columns) {
             $columns = Piwik::getArrayFromApiParameter($columns);
         }
     }
     $documentation = Piwik::translate('VisitsSummary_VisitsSummaryDocumentation') . '<br />' . Piwik::translate('General_BrokenDownReportDocumentation') . '<br /><br />' . '<b>' . Piwik::translate('General_ColumnNbVisits') . ':</b> ' . Piwik::translate('General_ColumnNbVisitsDocumentation') . '<br />' . '<b>' . Piwik::translate('General_ColumnNbUniqVisitors') . ':</b> ' . Piwik::translate('General_ColumnNbUniqVisitorsDocumentation') . '<br />' . '<b>' . Piwik::translate('General_ColumnNbActions') . ':</b> ' . Piwik::translate('General_ColumnNbActionsDocumentation') . '<br />' . '<b>' . Piwik::translate('General_ColumnNbUsers') . ':</b> ' . Piwik::translate('General_ColumnNbUsersDocumentation') . ' (<a target="_blank" href="http://piwik.org/docs/user-id/">User ID</a>)<br />' . '<b>' . Piwik::translate('General_ColumnActionsPerVisit') . ':</b> ' . Piwik::translate('General_ColumnActionsPerVisitDocumentation');
     $selectableColumns = array('nb_visits', 'nb_uniq_visitors', 'nb_users', 'avg_time_on_site', 'bounce_rate', 'nb_actions_per_visit', 'max_actions', 'nb_visits_converted', 'nb_pageviews', 'nb_uniq_pageviews', 'nb_downloads', 'nb_uniq_downloads', 'nb_outlinks', 'nb_uniq_outlinks', 'avg_time_generation');
     $idSite = Common::getRequestVar('idSite');
     $displaySiteSearch = Site::isSiteSearchEnabledFor($idSite);
     if ($displaySiteSearch) {
         $selectableColumns[] = 'nb_searches';
         $selectableColumns[] = 'nb_keywords';
     }
     $view = $this->getLastUnitGraphAcrossPlugins($this->pluginName, __FUNCTION__, $columns, $selectableColumns, $documentation);
     if (empty($view->config->columns_to_display) && !empty($defaultColumns)) {
         $view->config->columns_to_display = $defaultColumns;
     }
     return $this->renderView($view);
 }
Пример #13
0
 private function overrideViewPropertiesWithQueryParams()
 {
     $properties = $this->getOverridableProperties();
     foreach ($properties as $name) {
         if (property_exists($this->requestConfig, $name)) {
             $this->requestConfig->{$name} = $this->getPropertyFromQueryParam($name, $this->requestConfig->{$name});
         } elseif (property_exists($this->config, $name)) {
             $this->config->{$name} = $this->getPropertyFromQueryParam($name, $this->config->{$name});
         }
     }
     // handle special 'columns' query parameter
     $columns = Common::getRequestVar('columns', false);
     if (false !== $columns) {
         $this->config->columns_to_display = Piwik::getArrayFromApiParameter($columns);
         array_unshift($this->config->columns_to_display, 'label');
     }
 }
Пример #14
0
 public function getEvolutionGraph($fetch = false, array $columns = array(), $idGoal = false)
 {
     if (empty($columns)) {
         $columns = Common::getRequestVar('columns');
         $columns = Piwik::getArrayFromApiParameter($columns);
     }
     $columns = !is_array($columns) ? array($columns) : $columns;
     if (empty($idGoal)) {
         $idGoal = Common::getRequestVar('idGoal', false, 'string');
     }
     $view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, 'Goals.get');
     $view->requestConfig->request_parameters_to_modify['idGoal'] = $idGoal;
     $nameToLabel = $this->goalColumnNameToLabel;
     if ($idGoal == Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER) {
         $nameToLabel['nb_conversions'] = 'General_EcommerceOrders';
     } elseif ($idGoal == Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_CART) {
         $nameToLabel['nb_conversions'] = Piwik::translate('General_VisitsWith', Piwik::translate('Goals_AbandonedCart'));
         $nameToLabel['conversion_rate'] = $nameToLabel['nb_conversions'];
         $nameToLabel['revenue'] = Piwik::translate('Goals_LeftInCart', Piwik::translate('General_ColumnRevenue'));
         $nameToLabel['items'] = Piwik::translate('Goals_LeftInCart', Piwik::translate('Goals_Products'));
     }
     $selectableColumns = array('nb_conversions', 'conversion_rate', 'revenue');
     if ($this->site->isEcommerceEnabled()) {
         $selectableColumns[] = 'items';
         $selectableColumns[] = 'avg_order_revenue';
     }
     foreach (array_merge($columns, $selectableColumns) as $columnName) {
         $columnTranslation = '';
         // find the right translation for this column, eg. find 'revenue' if column is Goal_1_revenue
         foreach ($nameToLabel as $metric => $metricTranslation) {
             if (strpos($columnName, $metric) !== false) {
                 $columnTranslation = Piwik::translate($metricTranslation);
                 break;
             }
         }
         if (!empty($idGoal) && isset($this->goals[$idGoal])) {
             $goalName = $this->goals[$idGoal]['name'];
             $columnTranslation = "{$columnTranslation} (" . Piwik::translate('Goals_GoalX', "{$goalName}") . ")";
         }
         $view->config->translations[$columnName] = $columnTranslation;
     }
     $view->config->columns_to_display = $columns;
     $view->config->selectable_columns = $selectableColumns;
     $langString = $idGoal ? 'Goals_SingleGoalOverviewDocumentation' : 'Goals_GoalsOverviewDocumentation';
     $view->config->documentation = Piwik::translate($langString, '<br />');
     return $this->renderView($view);
 }
Пример #15
0
    /**
     * Returns all websites with a timezone matching one the specified timezones
     *
     * @param array $timezones
     * @return array
     * @ignore
     */
    public function getSitesIdFromTimezones($timezones)
    {
        Piwik::checkUserHasSuperUserAccess();
        $timezones = Piwik::getArrayFromApiParameter($timezones);
        $timezones = array_unique($timezones);
        $ids = Db::get()->fetchAll('SELECT idsite
            FROM ' . Common::prefixTable('site') . '
					WHERE timezone IN (' . Common::getSqlStringFieldsArray($timezones) . ')
					ORDER BY idsite ASC', $timezones);
        $return = array();
        foreach ($ids as $id) {
            $return[] = $id['idsite'];
        }
        return $return;
    }
Пример #16
0
 /**
  * Returns Goals data
  *
  * @param int $idSite
  * @param string $period
  * @param string $date
  * @param bool $segment
  * @param bool|int $idGoal
  * @param array $columns Array of metrics to fetch: nb_conversions, conversion_rate, revenue
  * @return DataTable
  */
 public function get($idSite, $period, $date, $segment = false, $idGoal = false, $columns = array())
 {
     Piwik::checkUserHasViewAccess($idSite);
     $archive = Archive::build($idSite, $period, $date, $segment);
     $columns = Piwik::getArrayFromApiParameter($columns);
     // Mapping string idGoal to internal ID
     $idGoal = self::convertSpecialGoalIds($idGoal);
     if (empty($columns)) {
         $columns = Goals::getGoalColumns($idGoal);
         if ($idGoal == Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER) {
             $columns[] = 'avg_order_revenue';
         }
     }
     if (in_array('avg_order_revenue', $columns) && $idGoal == Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER) {
         $columns[] = 'nb_conversions';
         $columns[] = 'revenue';
         $columns = array_values(array_unique($columns));
     }
     $columnsToSelect = array();
     foreach ($columns as &$columnName) {
         $columnsToSelect[] = Archiver::getRecordName($columnName, $idGoal);
     }
     $dataTable = $archive->getDataTableFromNumeric($columnsToSelect);
     // Rewrite column names as we expect them
     foreach ($columnsToSelect as $id => $oldName) {
         $dataTable->renameColumn($oldName, $columns[$id]);
     }
     if ($idGoal == Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER) {
         if ($dataTable instanceof DataTable\Map) {
             foreach ($dataTable->getDataTables() as $row) {
                 $this->enrichTable($row);
             }
         } else {
             $this->enrichTable($dataTable);
         }
     }
     return $dataTable;
 }
Пример #17
0
 /**
  * Get a combined report of the *.get API methods.
  */
 public function get($idSite, $period, $date, $segment = false, $columns = false)
 {
     $columns = Piwik::getArrayFromApiParameter($columns);
     // build columns map for faster checks later on
     $columnsMap = array();
     foreach ($columns as $column) {
         $columnsMap[$column] = true;
     }
     // find out which columns belong to which plugin
     $columnsByPlugin = array();
     $meta = \Piwik\Plugins\API\API::getInstance()->getReportMetadata($idSite, $period, $date);
     foreach ($meta as $reportMeta) {
         // scan all *.get reports
         if ($reportMeta['action'] == 'get' && !isset($reportMeta['parameters']) && $reportMeta['module'] != 'API' && !empty($reportMeta['metrics'])) {
             $plugin = $reportMeta['module'];
             foreach ($reportMeta['metrics'] as $column => $columnTranslation) {
                 // a metric from this report has been requested
                 if (isset($columnsMap[$column]) || empty($columnsMap)) {
                     $columnsByPlugin[$plugin][] = $column;
                 }
             }
         }
     }
     krsort($columnsByPlugin);
     $mergedDataTable = false;
     $params = compact('idSite', 'period', 'date', 'segment', 'idGoal');
     foreach ($columnsByPlugin as $plugin => $columns) {
         // load the data
         $className = Request::getClassNameAPI($plugin);
         $params['columns'] = implode(',', $columns);
         $dataTable = Proxy::getInstance()->call($className, 'get', $params);
         // make sure the table has all columns
         $array = $dataTable instanceof DataTable\Map ? $dataTable->getDataTables() : array($dataTable);
         foreach ($array as $table) {
             // we don't support idSites=all&date=DATE1,DATE2
             if ($table instanceof DataTable) {
                 $firstRow = $table->getFirstRow();
                 if (!$firstRow) {
                     $firstRow = new Row();
                     $table->addRow($firstRow);
                 }
                 foreach ($columns as $column) {
                     if ($firstRow->getColumn($column) === false) {
                         $firstRow->setColumn($column, 0);
                     }
                 }
             }
         }
         // merge reports
         if ($mergedDataTable === false) {
             $mergedDataTable = $dataTable;
         } else {
             $this->mergeDataTables($mergedDataTable, $dataTable);
         }
     }
     return $mergedDataTable;
 }
Пример #18
0
 /**
  * Get a combined report of the *.get API methods.
  */
 public function get($idSite, $period, $date, $segment = false, $columns = false)
 {
     Piwik::checkUserHasViewAccess($idSite);
     $columns = Piwik::getArrayFromApiParameter($columns);
     // build columns map for faster checks later on
     $columnsMap = array();
     foreach ($columns as $column) {
         $columnsMap[$column] = true;
     }
     // find out which columns belong to which plugin
     $columnsByPlugin = array();
     $meta = \Piwik\Plugins\API\API::getInstance()->getReportMetadata($idSite, $period, $date);
     foreach ($meta as $reportMeta) {
         // scan all *.get reports
         if ($reportMeta['action'] == 'get' && !isset($reportMeta['parameters']) && $reportMeta['module'] != 'API' && !empty($reportMeta['metrics'])) {
             $plugin = $reportMeta['module'];
             $allMetrics = array_merge($reportMeta['metrics'], @$reportMeta['processedMetrics'] ?: array());
             foreach ($allMetrics as $column => $columnTranslation) {
                 // a metric from this report has been requested
                 if (isset($columnsMap[$column]) || empty($columnsMap)) {
                     $columnsByPlugin[$plugin][] = $column;
                 }
             }
         }
     }
     krsort($columnsByPlugin);
     $mergedDataTable = false;
     $params = compact('idSite', 'period', 'date', 'segment', 'idGoal');
     foreach ($columnsByPlugin as $plugin => $columns) {
         // load the data
         $className = Request::getClassNameAPI($plugin);
         $params['columns'] = implode(',', $columns);
         $dataTable = Proxy::getInstance()->call($className, 'get', $params);
         $dataTable->filter(function (DataTable $table) {
             $table->clearQueuedFilters();
         });
         // merge reports
         if ($mergedDataTable === false) {
             $mergedDataTable = $dataTable;
         } else {
             $merger = new MergeDataTables();
             $merger->mergeDataTables($mergedDataTable, $dataTable);
         }
     }
     if (!empty($columnsMap) && !empty($mergedDataTable)) {
         $mergedDataTable->queueFilter('ColumnDelete', array(false, array_keys($columnsMap)));
     }
     return $mergedDataTable;
 }
Пример #19
0
 /**
  * Generates a graphic report based on the given parameters
  * @param  string $type             
  * @param  string $apiMethod        
  * @param  string $controllerMethod 
  * @param  array  $selectable       
  * @param  array  $to_display       
  * @return View                   
  */
 private function getReportGraph($type, $apiMethod, $controllerMethod, $selectable = array(), $to_display = array())
 {
     $view = ViewDataTableFactory::build($type, $apiMethod, $controllerMethod, $forceDefault = true);
     $view->config->show_goals = false;
     if (empty($selectable)) {
         if (Common::getRequestVar('period', false) == 'day') {
             $selectable = array('nb_visits', 'nb_uniq_visitors', 'nb_actions');
         } else {
             $selectable = array('nb_visits', 'nb_actions');
         }
     }
     if (empty($to_display)) {
         $to_display = Common::getRequestVar('columns', false);
         if (false !== $to_display) {
             $to_display = Piwik::getArrayFromApiParameter($columns);
         }
     }
     if (false !== $to_display) {
         $to_display = !is_array($to_display) ? array($to_display) : $to_display;
     } else {
         $to_display = $selectable;
     }
     $view->config->selectable_columns = $selectable;
     $view->config->columns_to_display = $to_display;
     $view->config->show_footer_icons = false;
     return $this->renderView($view);
 }
Пример #20
0
 /**
  * Similar to {@link get()} but does not return any metrics for new and returning visitors. It won't apply
  * any segment by default. This method is deprecated from the API as it is only there to make the implementation of
  * the actual {@link get()} method easy.
  *
  * @deprecated
  * @internal
  */
 public function getMetrics($idSite, $period, $date, $segment = false, $idGoal = false, $columns = array())
 {
     Piwik::checkUserHasViewAccess($idSite);
     $archive = Archive::build($idSite, $period, $date, $segment);
     // Mapping string idGoal to internal ID
     $idGoal = self::convertSpecialGoalIds($idGoal);
     $isEcommerceGoal = $idGoal === GoalManager::IDGOAL_ORDER || $idGoal === GoalManager::IDGOAL_CART;
     $allMetrics = Goals::getGoalColumns($idGoal);
     $columnsToShow = Piwik::getArrayFromApiParameter($columns);
     $requestedColumns = $columnsToShow;
     $shouldAddAverageOrderRevenue = (in_array('avg_order_revenue', $requestedColumns) || empty($requestedColumns)) && $isEcommerceGoal;
     if ($shouldAddAverageOrderRevenue && !empty($requestedColumns)) {
         $avgOrder = new AverageOrderRevenue();
         $metricsToAdd = $avgOrder->getDependentMetrics();
         $requestedColumns = array_unique(array_merge($requestedColumns, $metricsToAdd));
     }
     $report = Report::factory('Goals', 'getMetrics');
     $columnsToGet = $report->getMetricsRequiredForReport($allMetrics, $requestedColumns);
     $inDbMetricNames = array_map(function ($name) use($idGoal) {
         return $name == 'nb_visits' ? $name : Archiver::getRecordName($name, $idGoal);
     }, $columnsToGet);
     $dataTable = $archive->getDataTableFromNumeric($inDbMetricNames);
     if (count($columnsToGet) > 0) {
         $newNameMapping = array_combine($inDbMetricNames, $columnsToGet);
     } else {
         $newNameMapping = array();
     }
     $dataTable->filter('ReplaceColumnNames', array($newNameMapping));
     // TODO: this should be in Goals/Get.php but it depends on idGoal parameter which isn't always in _GET (ie,
     //       it's not in ProcessedReport.php). more refactoring must be done to report class before this can be
     //       corrected.
     if ($shouldAddAverageOrderRevenue) {
         $dataTable->filter(function (DataTable $table) {
             $extraProcessedMetrics = $table->getMetadata(DataTable::EXTRA_PROCESSED_METRICS_METADATA_NAME);
             if (empty($extraProcessedMetrics)) {
                 $extraProcessedMetrics = array();
             }
             $extraProcessedMetrics[] = new AverageOrderRevenue();
             $table->setMetadata(DataTable::EXTRA_PROCESSED_METRICS_METADATA_NAME, $extraProcessedMetrics);
         });
     }
     // remove temporary metrics that were not explicitly requested
     if (empty($columnsToShow)) {
         $columnsToShow = $allMetrics;
         $columnsToShow[] = 'conversion_rate';
         if ($isEcommerceGoal) {
             $columnsToShow[] = 'avg_order_revenue';
         }
     }
     $dataTable->queueFilter('ColumnDelete', array($columnsToRemove = array(), $columnsToShow));
     return $dataTable;
 }
Пример #21
0
 public function getEvolutionGraph($typeReferrer = false, array $columns = array(), array $defaultColumns = array())
 {
     $view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, 'Referrers.getReferrerType');
     $view->config->add_total_row = true;
     // configure displayed columns
     if (empty($columns)) {
         $columns = Common::getRequestVar('columns', false);
         if (false !== $columns) {
             $columns = Piwik::getArrayFromApiParameter($columns);
         }
     }
     if (false !== $columns) {
         $columns = !is_array($columns) ? array($columns) : $columns;
     }
     if (!empty($columns)) {
         $view->config->columns_to_display = $columns;
     } elseif (empty($view->config->columns_to_display) && !empty($defaultColumns)) {
         $view->config->columns_to_display = $defaultColumns;
     }
     // configure selectable columns
     // todo: should use SettingsPiwik::isUniqueVisitorsEnabled
     if (Common::getRequestVar('period', false) == 'day') {
         $selectable = array('nb_visits', 'nb_uniq_visitors', 'nb_users', 'nb_actions');
     } else {
         $selectable = array('nb_visits', 'nb_actions');
     }
     $view->config->selectable_columns = $selectable;
     // configure displayed rows
     $visibleRows = Common::getRequestVar('rows', false);
     if ($visibleRows !== false) {
         // this happens when the row picker has been used
         $visibleRows = Piwik::getArrayFromApiParameter($visibleRows);
         // typeReferrer is redundant if rows are defined, so make sure it's not used
         $view->config->custom_parameters['typeReferrer'] = false;
     } else {
         // use $typeReferrer as default
         if ($typeReferrer === false) {
             $typeReferrer = Common::getRequestVar('typeReferrer', false);
         }
         $label = self::getTranslatedReferrerTypeLabel($typeReferrer);
         $total = Piwik::translate('General_Total');
         if (!empty($view->config->rows_to_display)) {
             $visibleRows = $view->config->rows_to_display;
         } else {
             $visibleRows = array($label, $total);
         }
         $view->requestConfig->request_parameters_to_modify['rows'] = $label . ',' . $total;
     }
     $view->config->row_picker_match_rows_by = 'label';
     $view->config->rows_to_display = $visibleRows;
     $view->config->documentation = Piwik::translate('Referrers_EvolutionDocumentation') . '<br />' . Piwik::translate('General_BrokenDownReportDocumentation') . '<br />' . Piwik::translate('Referrers_EvolutionDocumentationMoreInfo', '&quot;' . Piwik::translate('Referrers_DetailsByReferrerType') . '&quot;');
     return $this->renderView($view);
 }
Пример #22
0
 /**
  * Returns all websites with a timezone matching one the specified timezones
  *
  * @param array $timezones
  * @return array
  * @ignore
  */
 public function getSitesIdFromTimezones($timezones)
 {
     Piwik::checkUserHasSuperUserAccess();
     $timezones = Piwik::getArrayFromApiParameter($timezones);
     $timezones = array_unique($timezones);
     $ids = $this->getModel()->getSitesFromTimezones($timezones);
     $return = array();
     foreach ($ids as $id) {
         $return[] = $id['idsite'];
     }
     return $return;
 }