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

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormattab <matthieu.aubry@gmail.com>2013-03-28 03:42:39 +0400
committermattab <matthieu.aubry@gmail.com>2013-03-28 03:42:40 +0400
commitae4b03163792f0b6e933933e5d37df87dc3fd566 (patch)
treed1d7510a9728f587d3d63ebd03e4ecf3d904838b /plugins/MultiSites
parent158c2150f5f2e13ece459b8d131244c11b763997 (diff)
Mass conversion of all files to the newly agreed coding standard: PSR 1/2
Converting Piwik core source files, PHP, JS, TPL, CSS More info: http://piwik.org/participate/coding-standards/
Diffstat (limited to 'plugins/MultiSites')
-rwxr-xr-xplugins/MultiSites/API.php930
-rw-r--r--plugins/MultiSites/Controller.php431
-rw-r--r--plugins/MultiSites/MultiSites.php157
-rw-r--r--plugins/MultiSites/templates/common.js411
-rw-r--r--plugins/MultiSites/templates/index.tpl191
-rw-r--r--plugins/MultiSites/templates/row.tpl37
-rw-r--r--plugins/MultiSites/templates/styles.css76
7 files changed, 1080 insertions, 1153 deletions
diff --git a/plugins/MultiSites/API.php b/plugins/MultiSites/API.php
index 3f4176bbc0..2277291598 100755
--- a/plugins/MultiSites/API.php
+++ b/plugins/MultiSites/API.php
@@ -1,10 +1,10 @@
<?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 Piwik_MultiSites
*/
@@ -14,487 +14,447 @@
*/
class Piwik_MultiSites_API
{
- const METRIC_TRANSLATION_KEY = 'translation';
- const METRIC_EVOLUTION_COL_NAME_KEY = 'evolution_column_name';
- const METRIC_RECORD_NAME_KEY = 'record_name';
- const METRIC_IS_ECOMMERCE_KEY = 'is_ecommerce';
-
- const NB_VISITS_METRIC = 'nb_visits';
- const NB_ACTIONS_METRIC = 'nb_actions';
- const NB_PAGEVIEWS_LABEL = 'nb_pageviews';
- const NB_PAGEVIEWS_METRIC = 'Actions_nb_pageviews';
- const GOAL_REVENUE_METRIC = 'revenue';
- const GOAL_CONVERSION_METRIC = 'nb_conversions';
- const ECOMMERCE_ORDERS_METRIC = 'orders';
- const ECOMMERCE_REVENUE_METRIC = 'ecommerce_revenue';
-
- static private $baseMetrics = array(
- self::NB_VISITS_METRIC => array (
- self::METRIC_TRANSLATION_KEY => 'General_ColumnNbVisits',
- self::METRIC_EVOLUTION_COL_NAME_KEY => 'visits_evolution',
- self::METRIC_RECORD_NAME_KEY => self::NB_VISITS_METRIC,
- self::METRIC_IS_ECOMMERCE_KEY => false,
- ),
- self::NB_ACTIONS_METRIC => array (
- self::METRIC_TRANSLATION_KEY => 'General_ColumnNbActions',
- self::METRIC_EVOLUTION_COL_NAME_KEY => 'actions_evolution',
- self::METRIC_RECORD_NAME_KEY => self::NB_ACTIONS_METRIC,
- self::METRIC_IS_ECOMMERCE_KEY => false,
- ),
- self::NB_PAGEVIEWS_LABEL => array (
- self::METRIC_TRANSLATION_KEY => 'General_ColumnPageviews',
- self::METRIC_EVOLUTION_COL_NAME_KEY => 'pageviews_evolution',
- self::METRIC_RECORD_NAME_KEY => self::NB_PAGEVIEWS_METRIC,
- self::METRIC_IS_ECOMMERCE_KEY => false,
- )
- );
-
- /**
- * The singleton instance of this class.
- */
- static private $instance = null;
-
- /**
- * Returns the singleton instance of this class. The instance is created
- * if it hasn't been already.
- *
- * @return Piwik_MultiSites_API
- */
- static public function getInstance()
- {
- if (self::$instance == null)
- {
- self::$instance = new self;
- }
-
- return self::$instance;
- }
-
- /**
- * Returns a report displaying the total visits, actions and revenue, as
- * well as the evolution of these values, of all existing sites over a
- * specified period of time.
- *
- * If the specified period is not a 'range', this function will calculcate
- * evolution metrics. Evolution metrics are metrics that display the
- * percent increase/decrease of another metric since the last period.
- *
- * This function will merge the result of the archive query so each
- * row in the result DataTable will correspond to the metrics of a single
- * site. If a date range is specified, the result will be a
- * DataTable_Array, but it will still be merged.
- *
- * @param string $period The period type to get data for.
- * @param string $date The date(s) to get data for.
- * @param bool|string $segment The segments to get data for.
- * @param bool|string $_restrictSitesToLogin Hack used to enforce we restrict the returned data to the specified username
- * Only used when a scheduled task is running
- * @param bool|string $enhanced When true, return additional goal & ecommerce metrics
- * @param bool|string $pattern If specified, only the website which names (or site ID) match the pattern will be returned using SitesManager.getPatternMatchSites
- * @return Piwik_DataTable
- */
- public function getAll($period, $date, $segment = false, $_restrictSitesToLogin = false, $enhanced = false, $pattern = false)
- {
- Piwik::checkUserHasSomeViewAccess();
-
- $idSites = $this->getSitesIdFromPattern($pattern);
-
- return $this->buildDataTable(
- $idSites,
- $period,
- $date,
- $segment,
- $_restrictSitesToLogin,
- $enhanced,
- $multipleWebsitesRequested = true
- );
- }
-
- /**
- * Fetches the list of sites which names match the string pattern
- *
- * @param $pattern
- * @return array|string
- */
- private function getSitesIdFromPattern($pattern)
- {
- $idSites = 'all';
- if (!empty($pattern)) {
- $sites = Piwik_API_Request::processRequest('SitesManager.getPatternMatchSites',
- array('pattern' => $pattern,
- // added because caller could overwrite these
- 'serialize' => 0,
- 'format' => 'original'));
- if (!empty($sites)) {
- $idSites = array();
- foreach ($sites as $site) {
- $idSites[] = $site['idsite'];
- }
- }
- }
- return $idSites;
- }
-
- /**
- * Same as getAll but for a unique Piwik site
- * @see Piwik_MultiSites_API::getAll()
- *
- * @param int $idSite Id of the Piwik site
- * @param string $period The period type to get data for.
- * @param string $date The date(s) to get data for.
- * @param bool|string $segment The segments to get data for.
- * @param bool|string $_restrictSitesToLogin Hack used to enforce we restrict the returned data to the specified username
- * Only used when a scheduled task is running
- * @param bool|string $enhanced When true, return additional goal & ecommerce metrics
- * @return Piwik_DataTable
- */
- public function getOne($idSite, $period, $date, $segment = false, $_restrictSitesToLogin = false, $enhanced = false)
- {
- Piwik::checkUserHasViewAccess($idSite);
- return $this->buildDataTable(
- $idSite,
- $period,
- $date,
- $segment,
- $_restrictSitesToLogin,
- $enhanced,
- $multipleWebsitesRequested = false
- );
- }
-
- private function buildDataTable($sites, $period, $date, $segment, $_restrictSitesToLogin, $enhanced, $multipleWebsitesRequested)
- {
- $allWebsitesRequested = ($sites == 'all');
- if($allWebsitesRequested)
- {
- if (Piwik::isUserIsSuperUser()
- // Hack: when this API function is called as a Scheduled Task, Super User status is enforced.
- // This means this function would return ALL websites in all cases.
- // Instead, we make sure that only the right set of data is returned
- && !Piwik_TaskScheduler::isTaskBeingExecuted())
- {
- Piwik_Site::setSites(
- Piwik_SitesManager_API::getInstance()->getAllSites()
- );
- }
- else
- {
- Piwik_Site::setSitesFromArray(
- Piwik_SitesManager_API::getInstance()->getSitesWithAtLeastViewAccess($limit = false, $_restrictSitesToLogin)
- );
- }
- }
-
- // build the archive type used to query archive data
- $archive = Piwik_Archive::build(
- $sites,
- $period,
- $date,
- $segment,
- $_restrictSitesToLogin
- );
-
- // determine what data will be displayed
- $fieldsToGet = array();
- $columnNameRewrites = array();
- $apiECommerceMetrics = array();
- $apiMetrics = Piwik_MultiSites_API::getApiMetrics($enhanced);
- foreach($apiMetrics as $metricName => $metricSettings)
- {
- $fieldsToGet[] = $metricSettings[self::METRIC_RECORD_NAME_KEY];
- $columnNameRewrites[$metricSettings[self::METRIC_RECORD_NAME_KEY]] = $metricName;
-
- if($metricSettings[self::METRIC_IS_ECOMMERCE_KEY])
- {
- $apiECommerceMetrics[$metricName] = $metricSettings;
- }
- }
-
- // get the data
- // $dataTable instanceOf Piwik_DataTable_Array
- $dataTable = $archive->getDataTableFromNumeric($fieldsToGet);
-
- // get rid of the DataTable_Array that is created by the IndexedBySite archive type
- if($dataTable instanceof Piwik_DataTable_Array
- && $multipleWebsitesRequested)
- {
- $dataTable = $dataTable->mergeChildren();
- }
- else
- {
- if(!$dataTable instanceof Piwik_DataTable_Array)
- {
- $firstDataTableRow = $dataTable->getFirstRow();
- $firstDataTableRow->setColumn('label', $sites);
- }
- }
-
- // calculate total visits/actions/revenue
- $this->setMetricsTotalsMetadata($dataTable, $apiMetrics);
-
- // if the period isn't a range & a lastN/previousN date isn't used, we get the same
- // data for the last period to show the evolution of visits/actions/revenue
- list($strLastDate, $lastPeriod) = Piwik_Period_Range::getLastDate($date, $period);
- if ($strLastDate !== false)
- {
- if ($lastPeriod !== false)
- {
- // NOTE: no easy way to set last period date metadata when range of dates is requested.
- // will be easier if DataTable_Array::metadata is removed, and metadata that is
- // put there is put directly in Piwik_DataTable::metadata.
- $dataTable->setMetadata(self::getLastPeriodMetadataName('date'), $lastPeriod);
- }
-
- $pastArchive = Piwik_Archive::build('all', $period, $strLastDate, $segment, $_restrictSitesToLogin);
- $pastData = $pastArchive->getDataTableFromNumeric($fieldsToGet);
-
- $pastData = $pastData->mergeChildren();
-
- // use past data to calculate evolution percentages
- $this->calculateEvolutionPercentages($dataTable, $pastData, $apiMetrics);
-
- $this->setPastDataMetadata($dataTable, $pastData, $apiMetrics);
- }
-
- // remove eCommerce related metrics on non eCommerce Piwik sites
- // note: this is not optimal in terms of performance: those metrics should not be retrieved in the first place
- if($enhanced)
- {
- // $dataTableRows instanceOf Piwik_DataTable_Row[]
- $dataTableRows = $dataTable->getRows();
-
- foreach($dataTableRows as $dataTableRow)
- {
- $siteId = $dataTableRow->getColumn('label');
- if(!Piwik_Site::isEcommerceEnabledFor($siteId))
- {
- foreach($apiECommerceMetrics as $metricSettings)
- {
- $dataTableRow->deleteColumn($metricSettings[self::METRIC_RECORD_NAME_KEY]);
- $dataTableRow->deleteColumn($metricSettings[self::METRIC_EVOLUTION_COL_NAME_KEY]);
- }
- }
- }
- }
-
- // move the site id to a metadata column
- $dataTable->filter('ColumnCallbackAddMetadata', array('label', 'idsite'));
-
- // set the label of each row to the site name
- if($multipleWebsitesRequested)
- {
- $getNameFor = array('Piwik_Site', 'getNameFor');
- $dataTable->filter('ColumnCallbackReplace', array('label', $getNameFor));
- }
- else
- {
- $dataTable->filter('ColumnDelete', array('label'));
- }
-
- // replace record names with user friendly metric names
- $dataTable->filter('ReplaceColumnNames', array($columnNameRewrites));
-
- // Ensures data set sorted, for Metadata output
- $dataTable->filter('Sort', array(self::NB_VISITS_METRIC, 'desc', $naturalSort = false));
-
- // filter rows without visits
- // note: if only one website is queried and there are no visits, we can not remove the row otherwise Piwik_API_ResponseBuilder throws 'Call to a member function getColumns() on a non-object'
- if($multipleWebsitesRequested)
- {
- $dataTable->filter(
- 'ColumnCallbackDeleteRow',
- array(
- self::NB_VISITS_METRIC,
- create_function ( '$value', 'return $value != 0;')
- )
- );
- }
-
- return $dataTable;
- }
-
- /**
- * Performs a binary filter of two
- * DataTables in order to correctly calculate evolution metrics.
- *
- * @param Piwik_DataTable|Piwik_DataTable_Array $currentData
- * @param Piwik_DataTable|Piwik_DataTable_Array $pastData
- * @param array $fields The array of string fields to calculate evolution
- * metrics for.
- */
- private function calculateEvolutionPercentages($currentData, $pastData, $apiMetrics)
- {
- if ($currentData instanceof Piwik_DataTable_Array)
- {
- $pastArray = $pastData->getArray();
- foreach ($currentData->getArray() as $subTable)
- {
- $this->calculateEvolutionPercentages($subTable, current($pastArray), $apiMetrics);
- next($pastArray);
- }
- }
- else
- {
- foreach ($apiMetrics as $metricSettings)
- {
- $currentData->filter(
- 'CalculateEvolutionFilter',
- array(
- $pastData,
- $metricSettings[self::METRIC_EVOLUTION_COL_NAME_KEY],
- $metricSettings[self::METRIC_RECORD_NAME_KEY],
- $quotientPrecision = 1)
- );
- }
- }
- }
-
- /**
- * Sets the total visits, actions & revenue for a DataTable returned by
- * $this->buildDataTable.
- *
- * @param Piwik_DataTable $dataTable
- * @param array $apiMetrics Metrics info.
- * @return array Array of three values: total visits, total actions, total revenue
- */
- private function setMetricsTotalsMetadata( $dataTable, $apiMetrics )
- {
- if ($dataTable instanceof Piwik_DataTable_Array)
- {
- foreach ($dataTable->getArray() as $table)
- {
- $this->setMetricsTotalsMetadata($table, $apiMetrics);
- }
- }
- else
- {
- $revenueMetric = '';
- if (Piwik_Common::isGoalPluginEnabled())
- {
- $revenueMetric = Piwik_Goals::getRecordName(self::GOAL_REVENUE_METRIC);
- }
-
- $totals = array();
- foreach ($apiMetrics as $label => $metricInfo)
- {
- $totalMetadataName = self::getTotalMetadataName($label);
- $totals[$totalMetadataName] = 0;
- }
-
- foreach ($dataTable->getRows() as $row)
- {
- foreach ($apiMetrics as $label => $metricInfo)
- {
- $totalMetadataName = self::getTotalMetadataName($label);
- $totals[$totalMetadataName] += $row->getColumn($metricInfo[self::METRIC_RECORD_NAME_KEY]);
- }
- }
-
- foreach ($totals as $name => $value)
- {
- $dataTable->setMetadata($name, $value);
- }
- }
- }
-
- /**
- * Sets the total evolution metadata for a datatable returned by $this->buildDataTable
- * given data for the last period.
- *
- * @param Piwik_DataTable $dataTable
- * @param Piwik_DataTable $pastData
- * @param array $apiMetrics Metrics info.
- */
- private function setPastDataMetadata( $dataTable, $pastData, $apiMetrics )
- {
- if ($dataTable instanceof Piwik_DataTable_Array)
- {
- $pastArray = $pastData->getArray();
- foreach ($dataTable->getArray() as $subTable)
- {
- $this->setPastDataMetadata($subTable, current($pastArray), $apiMetrics);
- next($pastArray);
- }
- }
- else
- {
- // calculate total visits/actions/revenue for past data
- $this->setMetricsTotalsMetadata($pastData, $apiMetrics);
-
- foreach ($apiMetrics as $label => $metricInfo)
- {
- // get the names of metadata to set
- $totalMetadataName = self::getTotalMetadataName($label);
- $lastPeriodTotalMetadataName = self::getLastPeriodMetadataName($totalMetadataName);
- $totalEvolutionMetadataName =
- self::getTotalMetadataName($metricInfo[self::METRIC_EVOLUTION_COL_NAME_KEY]);
-
- // set last period total
- $pastTotal = $pastData->getMetadata($totalMetadataName);
- $dataTable->setMetadata($lastPeriodTotalMetadataName, $pastTotal);
-
- // calculate & set evolution
- $currentTotal = $dataTable->getMetadata($totalMetadataName);
- $evolution = Piwik_DataTable_Filter_CalculateEvolutionFilter::calculate($currentTotal, $pastTotal);
- $dataTable->setMetadata($totalEvolutionMetadataName, $evolution);
- }
- }
- }
-
- /**
- * @ignore
- */
- public static function getApiMetrics($enhanced)
- {
- $metrics = self::$baseMetrics;
- if (Piwik_Common::isGoalPluginEnabled())
- {
- // goal revenue metric
- $metrics[self::GOAL_REVENUE_METRIC] = array(
- self::METRIC_TRANSLATION_KEY => 'Goals_ColumnRevenue',
- self::METRIC_EVOLUTION_COL_NAME_KEY => self::GOAL_REVENUE_METRIC . '_evolution',
- self::METRIC_RECORD_NAME_KEY => Piwik_Goals::getRecordName(self::GOAL_REVENUE_METRIC),
- self::METRIC_IS_ECOMMERCE_KEY => false,
- );
-
- if($enhanced)
- {
- // number of goal conversions metric
- $metrics[self::GOAL_CONVERSION_METRIC] = array(
- self::METRIC_TRANSLATION_KEY => 'Goals_ColumnConversions',
- self::METRIC_EVOLUTION_COL_NAME_KEY => self::GOAL_CONVERSION_METRIC . '_evolution',
- self::METRIC_RECORD_NAME_KEY => Piwik_Goals::getRecordName(self::GOAL_CONVERSION_METRIC),
- self::METRIC_IS_ECOMMERCE_KEY => false,
- );
-
- // number of orders
- $metrics[self::ECOMMERCE_ORDERS_METRIC] = array(
- self::METRIC_TRANSLATION_KEY => 'General_EcommerceOrders',
- self::METRIC_EVOLUTION_COL_NAME_KEY => self::ECOMMERCE_ORDERS_METRIC . '_evolution',
- self::METRIC_RECORD_NAME_KEY => Piwik_Goals::getRecordName(self::GOAL_CONVERSION_METRIC ,0),
- self::METRIC_IS_ECOMMERCE_KEY => true,
- );
-
- // eCommerce revenue
- $metrics[self::ECOMMERCE_REVENUE_METRIC] = array(
- self::METRIC_TRANSLATION_KEY => 'General_ProductRevenue',
- self::METRIC_EVOLUTION_COL_NAME_KEY => self::ECOMMERCE_REVENUE_METRIC . '_evolution',
- self::METRIC_RECORD_NAME_KEY => Piwik_Goals::getRecordName(self::GOAL_REVENUE_METRIC ,0),
- self::METRIC_IS_ECOMMERCE_KEY => true,
- );
- }
- }
-
- return $metrics;
- }
-
- private static function getTotalMetadataName( $name )
- {
- return 'total_'.$name;
- }
-
- private static function getLastPeriodMetadataName( $name )
- {
- return 'last_period_'.$name;
- }
+ const METRIC_TRANSLATION_KEY = 'translation';
+ const METRIC_EVOLUTION_COL_NAME_KEY = 'evolution_column_name';
+ const METRIC_RECORD_NAME_KEY = 'record_name';
+ const METRIC_IS_ECOMMERCE_KEY = 'is_ecommerce';
+
+ const NB_VISITS_METRIC = 'nb_visits';
+ const NB_ACTIONS_METRIC = 'nb_actions';
+ const NB_PAGEVIEWS_LABEL = 'nb_pageviews';
+ const NB_PAGEVIEWS_METRIC = 'Actions_nb_pageviews';
+ const GOAL_REVENUE_METRIC = 'revenue';
+ const GOAL_CONVERSION_METRIC = 'nb_conversions';
+ const ECOMMERCE_ORDERS_METRIC = 'orders';
+ const ECOMMERCE_REVENUE_METRIC = 'ecommerce_revenue';
+
+ static private $baseMetrics = array(
+ self::NB_VISITS_METRIC => array(
+ self::METRIC_TRANSLATION_KEY => 'General_ColumnNbVisits',
+ self::METRIC_EVOLUTION_COL_NAME_KEY => 'visits_evolution',
+ self::METRIC_RECORD_NAME_KEY => self::NB_VISITS_METRIC,
+ self::METRIC_IS_ECOMMERCE_KEY => false,
+ ),
+ self::NB_ACTIONS_METRIC => array(
+ self::METRIC_TRANSLATION_KEY => 'General_ColumnNbActions',
+ self::METRIC_EVOLUTION_COL_NAME_KEY => 'actions_evolution',
+ self::METRIC_RECORD_NAME_KEY => self::NB_ACTIONS_METRIC,
+ self::METRIC_IS_ECOMMERCE_KEY => false,
+ ),
+ self::NB_PAGEVIEWS_LABEL => array(
+ self::METRIC_TRANSLATION_KEY => 'General_ColumnPageviews',
+ self::METRIC_EVOLUTION_COL_NAME_KEY => 'pageviews_evolution',
+ self::METRIC_RECORD_NAME_KEY => self::NB_PAGEVIEWS_METRIC,
+ self::METRIC_IS_ECOMMERCE_KEY => false,
+ )
+ );
+
+ /**
+ * The singleton instance of this class.
+ */
+ static private $instance = null;
+
+ /**
+ * Returns the singleton instance of this class. The instance is created
+ * if it hasn't been already.
+ *
+ * @return Piwik_MultiSites_API
+ */
+ static public function getInstance()
+ {
+ if (self::$instance == null) {
+ self::$instance = new self;
+ }
+
+ return self::$instance;
+ }
+
+ /**
+ * Returns a report displaying the total visits, actions and revenue, as
+ * well as the evolution of these values, of all existing sites over a
+ * specified period of time.
+ *
+ * If the specified period is not a 'range', this function will calculcate
+ * evolution metrics. Evolution metrics are metrics that display the
+ * percent increase/decrease of another metric since the last period.
+ *
+ * This function will merge the result of the archive query so each
+ * row in the result DataTable will correspond to the metrics of a single
+ * site. If a date range is specified, the result will be a
+ * DataTable_Array, but it will still be merged.
+ *
+ * @param string $period The period type to get data for.
+ * @param string $date The date(s) to get data for.
+ * @param bool|string $segment The segments to get data for.
+ * @param bool|string $_restrictSitesToLogin Hack used to enforce we restrict the returned data to the specified username
+ * Only used when a scheduled task is running
+ * @param bool|string $enhanced When true, return additional goal & ecommerce metrics
+ * @param bool|string $pattern If specified, only the website which names (or site ID) match the pattern will be returned using SitesManager.getPatternMatchSites
+ * @return Piwik_DataTable
+ */
+ public function getAll($period, $date, $segment = false, $_restrictSitesToLogin = false, $enhanced = false, $pattern = false)
+ {
+ Piwik::checkUserHasSomeViewAccess();
+
+ $idSites = $this->getSitesIdFromPattern($pattern);
+
+ return $this->buildDataTable(
+ $idSites,
+ $period,
+ $date,
+ $segment,
+ $_restrictSitesToLogin,
+ $enhanced,
+ $multipleWebsitesRequested = true
+ );
+ }
+
+ /**
+ * Fetches the list of sites which names match the string pattern
+ *
+ * @param $pattern
+ * @return array|string
+ */
+ private function getSitesIdFromPattern($pattern)
+ {
+ $idSites = 'all';
+ if (!empty($pattern)) {
+ $sites = Piwik_API_Request::processRequest('SitesManager.getPatternMatchSites',
+ array('pattern' => $pattern,
+ // added because caller could overwrite these
+ 'serialize' => 0,
+ 'format' => 'original'));
+ if (!empty($sites)) {
+ $idSites = array();
+ foreach ($sites as $site) {
+ $idSites[] = $site['idsite'];
+ }
+ }
+ }
+ return $idSites;
+ }
+
+ /**
+ * Same as getAll but for a unique Piwik site
+ * @see Piwik_MultiSites_API::getAll()
+ *
+ * @param int $idSite Id of the Piwik site
+ * @param string $period The period type to get data for.
+ * @param string $date The date(s) to get data for.
+ * @param bool|string $segment The segments to get data for.
+ * @param bool|string $_restrictSitesToLogin Hack used to enforce we restrict the returned data to the specified username
+ * Only used when a scheduled task is running
+ * @param bool|string $enhanced When true, return additional goal & ecommerce metrics
+ * @return Piwik_DataTable
+ */
+ public function getOne($idSite, $period, $date, $segment = false, $_restrictSitesToLogin = false, $enhanced = false)
+ {
+ Piwik::checkUserHasViewAccess($idSite);
+ return $this->buildDataTable(
+ $idSite,
+ $period,
+ $date,
+ $segment,
+ $_restrictSitesToLogin,
+ $enhanced,
+ $multipleWebsitesRequested = false
+ );
+ }
+
+ private function buildDataTable($sites, $period, $date, $segment, $_restrictSitesToLogin, $enhanced, $multipleWebsitesRequested)
+ {
+ $allWebsitesRequested = ($sites == 'all');
+ if ($allWebsitesRequested) {
+ if (Piwik::isUserIsSuperUser()
+ // Hack: when this API function is called as a Scheduled Task, Super User status is enforced.
+ // This means this function would return ALL websites in all cases.
+ // Instead, we make sure that only the right set of data is returned
+ && !Piwik_TaskScheduler::isTaskBeingExecuted()
+ ) {
+ Piwik_Site::setSites(
+ Piwik_SitesManager_API::getInstance()->getAllSites()
+ );
+ } else {
+ Piwik_Site::setSitesFromArray(
+ Piwik_SitesManager_API::getInstance()->getSitesWithAtLeastViewAccess($limit = false, $_restrictSitesToLogin)
+ );
+ }
+ }
+
+ // build the archive type used to query archive data
+ $archive = Piwik_Archive::build(
+ $sites,
+ $period,
+ $date,
+ $segment,
+ $_restrictSitesToLogin
+ );
+
+ // determine what data will be displayed
+ $fieldsToGet = array();
+ $columnNameRewrites = array();
+ $apiECommerceMetrics = array();
+ $apiMetrics = Piwik_MultiSites_API::getApiMetrics($enhanced);
+ foreach ($apiMetrics as $metricName => $metricSettings) {
+ $fieldsToGet[] = $metricSettings[self::METRIC_RECORD_NAME_KEY];
+ $columnNameRewrites[$metricSettings[self::METRIC_RECORD_NAME_KEY]] = $metricName;
+
+ if ($metricSettings[self::METRIC_IS_ECOMMERCE_KEY]) {
+ $apiECommerceMetrics[$metricName] = $metricSettings;
+ }
+ }
+
+ // get the data
+ // $dataTable instanceOf Piwik_DataTable_Array
+ $dataTable = $archive->getDataTableFromNumeric($fieldsToGet);
+
+ // get rid of the DataTable_Array that is created by the IndexedBySite archive type
+ if ($dataTable instanceof Piwik_DataTable_Array
+ && $multipleWebsitesRequested
+ ) {
+ $dataTable = $dataTable->mergeChildren();
+ } else {
+ if (!$dataTable instanceof Piwik_DataTable_Array) {
+ $firstDataTableRow = $dataTable->getFirstRow();
+ $firstDataTableRow->setColumn('label', $sites);
+ }
+ }
+
+ // calculate total visits/actions/revenue
+ $this->setMetricsTotalsMetadata($dataTable, $apiMetrics);
+
+ // if the period isn't a range & a lastN/previousN date isn't used, we get the same
+ // data for the last period to show the evolution of visits/actions/revenue
+ list($strLastDate, $lastPeriod) = Piwik_Period_Range::getLastDate($date, $period);
+ if ($strLastDate !== false) {
+ if ($lastPeriod !== false) {
+ // NOTE: no easy way to set last period date metadata when range of dates is requested.
+ // will be easier if DataTable_Array::metadata is removed, and metadata that is
+ // put there is put directly in Piwik_DataTable::metadata.
+ $dataTable->setMetadata(self::getLastPeriodMetadataName('date'), $lastPeriod);
+ }
+
+ $pastArchive = Piwik_Archive::build('all', $period, $strLastDate, $segment, $_restrictSitesToLogin);
+ $pastData = $pastArchive->getDataTableFromNumeric($fieldsToGet);
+
+ $pastData = $pastData->mergeChildren();
+
+ // use past data to calculate evolution percentages
+ $this->calculateEvolutionPercentages($dataTable, $pastData, $apiMetrics);
+
+ $this->setPastDataMetadata($dataTable, $pastData, $apiMetrics);
+ }
+
+ // remove eCommerce related metrics on non eCommerce Piwik sites
+ // note: this is not optimal in terms of performance: those metrics should not be retrieved in the first place
+ if ($enhanced) {
+ // $dataTableRows instanceOf Piwik_DataTable_Row[]
+ $dataTableRows = $dataTable->getRows();
+
+ foreach ($dataTableRows as $dataTableRow) {
+ $siteId = $dataTableRow->getColumn('label');
+ if (!Piwik_Site::isEcommerceEnabledFor($siteId)) {
+ foreach ($apiECommerceMetrics as $metricSettings) {
+ $dataTableRow->deleteColumn($metricSettings[self::METRIC_RECORD_NAME_KEY]);
+ $dataTableRow->deleteColumn($metricSettings[self::METRIC_EVOLUTION_COL_NAME_KEY]);
+ }
+ }
+ }
+ }
+
+ // move the site id to a metadata column
+ $dataTable->filter('ColumnCallbackAddMetadata', array('label', 'idsite'));
+
+ // set the label of each row to the site name
+ if ($multipleWebsitesRequested) {
+ $getNameFor = array('Piwik_Site', 'getNameFor');
+ $dataTable->filter('ColumnCallbackReplace', array('label', $getNameFor));
+ } else {
+ $dataTable->filter('ColumnDelete', array('label'));
+ }
+
+ // replace record names with user friendly metric names
+ $dataTable->filter('ReplaceColumnNames', array($columnNameRewrites));
+
+ // Ensures data set sorted, for Metadata output
+ $dataTable->filter('Sort', array(self::NB_VISITS_METRIC, 'desc', $naturalSort = false));
+
+ // filter rows without visits
+ // note: if only one website is queried and there are no visits, we can not remove the row otherwise Piwik_API_ResponseBuilder throws 'Call to a member function getColumns() on a non-object'
+ if ($multipleWebsitesRequested) {
+ $dataTable->filter(
+ 'ColumnCallbackDeleteRow',
+ array(
+ self::NB_VISITS_METRIC,
+ create_function('$value', 'return $value != 0;')
+ )
+ );
+ }
+
+ return $dataTable;
+ }
+
+ /**
+ * Performs a binary filter of two
+ * DataTables in order to correctly calculate evolution metrics.
+ *
+ * @param Piwik_DataTable|Piwik_DataTable_Array $currentData
+ * @param Piwik_DataTable|Piwik_DataTable_Array $pastData
+ * @param array $fields The array of string fields to calculate evolution
+ * metrics for.
+ */
+ private function calculateEvolutionPercentages($currentData, $pastData, $apiMetrics)
+ {
+ if ($currentData instanceof Piwik_DataTable_Array) {
+ $pastArray = $pastData->getArray();
+ foreach ($currentData->getArray() as $subTable) {
+ $this->calculateEvolutionPercentages($subTable, current($pastArray), $apiMetrics);
+ next($pastArray);
+ }
+ } else {
+ foreach ($apiMetrics as $metricSettings) {
+ $currentData->filter(
+ 'CalculateEvolutionFilter',
+ array(
+ $pastData,
+ $metricSettings[self::METRIC_EVOLUTION_COL_NAME_KEY],
+ $metricSettings[self::METRIC_RECORD_NAME_KEY],
+ $quotientPrecision = 1)
+ );
+ }
+ }
+ }
+
+ /**
+ * Sets the total visits, actions & revenue for a DataTable returned by
+ * $this->buildDataTable.
+ *
+ * @param Piwik_DataTable $dataTable
+ * @param array $apiMetrics Metrics info.
+ * @return array Array of three values: total visits, total actions, total revenue
+ */
+ private function setMetricsTotalsMetadata($dataTable, $apiMetrics)
+ {
+ if ($dataTable instanceof Piwik_DataTable_Array) {
+ foreach ($dataTable->getArray() as $table) {
+ $this->setMetricsTotalsMetadata($table, $apiMetrics);
+ }
+ } else {
+ $revenueMetric = '';
+ if (Piwik_Common::isGoalPluginEnabled()) {
+ $revenueMetric = Piwik_Goals::getRecordName(self::GOAL_REVENUE_METRIC);
+ }
+
+ $totals = array();
+ foreach ($apiMetrics as $label => $metricInfo) {
+ $totalMetadataName = self::getTotalMetadataName($label);
+ $totals[$totalMetadataName] = 0;
+ }
+
+ foreach ($dataTable->getRows() as $row) {
+ foreach ($apiMetrics as $label => $metricInfo) {
+ $totalMetadataName = self::getTotalMetadataName($label);
+ $totals[$totalMetadataName] += $row->getColumn($metricInfo[self::METRIC_RECORD_NAME_KEY]);
+ }
+ }
+
+ foreach ($totals as $name => $value) {
+ $dataTable->setMetadata($name, $value);
+ }
+ }
+ }
+
+ /**
+ * Sets the total evolution metadata for a datatable returned by $this->buildDataTable
+ * given data for the last period.
+ *
+ * @param Piwik_DataTable $dataTable
+ * @param Piwik_DataTable $pastData
+ * @param array $apiMetrics Metrics info.
+ */
+ private function setPastDataMetadata($dataTable, $pastData, $apiMetrics)
+ {
+ if ($dataTable instanceof Piwik_DataTable_Array) {
+ $pastArray = $pastData->getArray();
+ foreach ($dataTable->getArray() as $subTable) {
+ $this->setPastDataMetadata($subTable, current($pastArray), $apiMetrics);
+ next($pastArray);
+ }
+ } else {
+ // calculate total visits/actions/revenue for past data
+ $this->setMetricsTotalsMetadata($pastData, $apiMetrics);
+
+ foreach ($apiMetrics as $label => $metricInfo) {
+ // get the names of metadata to set
+ $totalMetadataName = self::getTotalMetadataName($label);
+ $lastPeriodTotalMetadataName = self::getLastPeriodMetadataName($totalMetadataName);
+ $totalEvolutionMetadataName =
+ self::getTotalMetadataName($metricInfo[self::METRIC_EVOLUTION_COL_NAME_KEY]);
+
+ // set last period total
+ $pastTotal = $pastData->getMetadata($totalMetadataName);
+ $dataTable->setMetadata($lastPeriodTotalMetadataName, $pastTotal);
+
+ // calculate & set evolution
+ $currentTotal = $dataTable->getMetadata($totalMetadataName);
+ $evolution = Piwik_DataTable_Filter_CalculateEvolutionFilter::calculate($currentTotal, $pastTotal);
+ $dataTable->setMetadata($totalEvolutionMetadataName, $evolution);
+ }
+ }
+ }
+
+ /**
+ * @ignore
+ */
+ public static function getApiMetrics($enhanced)
+ {
+ $metrics = self::$baseMetrics;
+ if (Piwik_Common::isGoalPluginEnabled()) {
+ // goal revenue metric
+ $metrics[self::GOAL_REVENUE_METRIC] = array(
+ self::METRIC_TRANSLATION_KEY => 'Goals_ColumnRevenue',
+ self::METRIC_EVOLUTION_COL_NAME_KEY => self::GOAL_REVENUE_METRIC . '_evolution',
+ self::METRIC_RECORD_NAME_KEY => Piwik_Goals::getRecordName(self::GOAL_REVENUE_METRIC),
+ self::METRIC_IS_ECOMMERCE_KEY => false,
+ );
+
+ if ($enhanced) {
+ // number of goal conversions metric
+ $metrics[self::GOAL_CONVERSION_METRIC] = array(
+ self::METRIC_TRANSLATION_KEY => 'Goals_ColumnConversions',
+ self::METRIC_EVOLUTION_COL_NAME_KEY => self::GOAL_CONVERSION_METRIC . '_evolution',
+ self::METRIC_RECORD_NAME_KEY => Piwik_Goals::getRecordName(self::GOAL_CONVERSION_METRIC),
+ self::METRIC_IS_ECOMMERCE_KEY => false,
+ );
+
+ // number of orders
+ $metrics[self::ECOMMERCE_ORDERS_METRIC] = array(
+ self::METRIC_TRANSLATION_KEY => 'General_EcommerceOrders',
+ self::METRIC_EVOLUTION_COL_NAME_KEY => self::ECOMMERCE_ORDERS_METRIC . '_evolution',
+ self::METRIC_RECORD_NAME_KEY => Piwik_Goals::getRecordName(self::GOAL_CONVERSION_METRIC, 0),
+ self::METRIC_IS_ECOMMERCE_KEY => true,
+ );
+
+ // eCommerce revenue
+ $metrics[self::ECOMMERCE_REVENUE_METRIC] = array(
+ self::METRIC_TRANSLATION_KEY => 'General_ProductRevenue',
+ self::METRIC_EVOLUTION_COL_NAME_KEY => self::ECOMMERCE_REVENUE_METRIC . '_evolution',
+ self::METRIC_RECORD_NAME_KEY => Piwik_Goals::getRecordName(self::GOAL_REVENUE_METRIC, 0),
+ self::METRIC_IS_ECOMMERCE_KEY => true,
+ );
+ }
+ }
+
+ return $metrics;
+ }
+
+ private static function getTotalMetadataName($name)
+ {
+ return 'total_' . $name;
+ }
+
+ private static function getLastPeriodMetadataName($name)
+ {
+ return 'last_period_' . $name;
+ }
}
diff --git a/plugins/MultiSites/Controller.php b/plugins/MultiSites/Controller.php
index 46ae9c73d9..cb63dc5746 100644
--- a/plugins/MultiSites/Controller.php
+++ b/plugins/MultiSites/Controller.php
@@ -1,10 +1,10 @@
<?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 Piwik_MultiSites
*/
@@ -15,227 +15,208 @@
*/
class Piwik_MultiSites_Controller extends Piwik_Controller
{
- protected $orderBy = 'visits';
- protected $order = 'desc';
- protected $evolutionBy = 'visits';
- protected $page = 1;
- protected $limit = 0;
- protected $period;
- protected $date;
-
- function __construct()
- {
- parent::__construct();
-
- $this->limit = Piwik_Config::getInstance()->General['all_websites_website_per_page'];
- }
-
- function index()
- {
- $this->getSitesInfo($isWidgetized = false);
- }
-
- function standalone()
- {
- $this->getSitesInfo($isWidgetized = true);
- }
-
-
- public function getSitesInfo($isWidgetized)
- {
- Piwik::checkUserHasSomeViewAccess();
- $displayRevenueColumn = Piwik_Common::isGoalPluginEnabled();
-
- $date = Piwik_Common::getRequestVar('date', 'today');
- $period = Piwik_Common::getRequestVar('period', 'day');
- $siteIds = Piwik_SitesManager_API::getInstance()->getSitesIdWithAtLeastViewAccess();
- list($minDate, $maxDate) = $this->getMinMaxDateAcrossWebsites($siteIds);
-
- // overwrites the default Date set in the parent controller
- // Instead of the default current website's local date,
- // we set "today" or "yesterday" based on the default Piwik timezone
- $piwikDefaultTimezone = Piwik_SitesManager_API::getInstance()->getDefaultTimezone();
- if($period != 'range')
- {
- $date = $this->getDateParameterInTimezone($date, $piwikDefaultTimezone);
- $this->setDate($date);
- $date = $date->toString();
- }
- $dataTable = Piwik_MultiSites_API::getInstance()->getAll($period, $date, $segment = false);
-
-
- // put data into a form the template will understand better
- $digestableData = array();
- foreach($siteIds as $idSite)
- {
- $isEcommerceEnabled = Piwik_Site::isEcommerceEnabledFor($idSite);
-
- $digestableData[$idSite] = array(
- 'idsite' => $idSite,
- 'main_url' => Piwik_Site::getMainUrlFor($idSite),
- 'name' => Piwik_Site::getNameFor($idSite),
- 'visits' => 0,
- 'pageviews' => 0
- );
-
- if ($period != 'range')
- {
- $digestableData[$idSite]['visits_evolution'] = 0;
- $digestableData[$idSite]['pageviews_evolution'] = 0;
- }
-
- if ($displayRevenueColumn)
- {
- $revenueDefault = $isEcommerceEnabled ? 0 : "'-'";
-
- if ($period != 'range')
- {
- $digestableData[$idSite]['revenue_evolution'] = $revenueDefault;
- }
- }
- }
-
- foreach($dataTable->getRows() as $row)
- {
- $idsite = (int)$row->getMetadata('idsite');
-
- $site = &$digestableData[$idsite];
-
- $site['visits'] = (int)$row->getColumn('nb_visits');
- $site['pageviews'] = (int)$row->getColumn('nb_pageviews');
-
- if ($displayRevenueColumn)
- {
- if ($row->getColumn('revenue') !== false)
- {
- $site['revenue'] = $row->getColumn('revenue');
- }
- }
-
- if ($period != 'range')
- {
- $site['visits_evolution'] = $row->getColumn('visits_evolution');
- $site['pageviews_evolution'] = $row->getColumn('pageviews_evolution');
-
- if ($displayRevenueColumn)
- {
- $site['revenue_evolution'] = $row->getColumn('revenue_evolution');
- }
- }
- }
-
- $this->applyPrettyMoney($digestableData);
-
- $view = new Piwik_View("MultiSites/templates/index.tpl");
- $view->isWidgetized = $isWidgetized;
- $view->sitesData = array_values($digestableData);
- $view->evolutionBy = $this->evolutionBy;
- $view->period = $period;
- $view->page = $this->page;
- $view->limit = $this->limit;
- $view->orderBy = $this->orderBy;
- $view->order = $this->order;
- $view->totalVisits = $dataTable->getMetadata('total_nb_visits');
- $view->totalRevenue = $dataTable->getMetadata('total_revenue');
-
- $view->displayRevenueColumn = $displayRevenueColumn;
- $view->totalPageviews = $dataTable->getMetadata('total_nb_pageviews');
- $view->pastTotalVisits = $dataTable->getMetadata('last_period_total_nb_visits');
- $view->totalVisitsEvolution = $dataTable->getMetadata('total_visits_evolution');
- if ($view->totalVisitsEvolution > 0)
- {
- $view->totalVisitsEvolution = '+'.$view->totalVisitsEvolution;
- }
-
- if ($period != 'range')
- {
- $lastPeriod = Piwik_Period::factory($period, $dataTable->getMetadata('last_period_date'));
- $view->pastPeriodPretty = self::getCalendarPrettyDate($lastPeriod);
- }
-
- $params = $this->getGraphParamsModified();
- $view->dateSparkline = $period == 'range' ? $date : $params['date'];
-
- $view->autoRefreshTodayReport = false;
- // if the current date is today, or yesterday,
- // in case the website is set to UTC-12), or today in UTC+14, we refresh the page every 5min
- if(in_array($date, array( 'today', date('Y-m-d'),
- 'yesterday', Piwik_Date::factory('yesterday')->toString('Y-m-d'),
- Piwik_Date::factory('now', 'UTC+14')->toString('Y-m-d'))))
- {
-
- $view->autoRefreshTodayReport = Piwik_Config::getInstance()->General['multisites_refresh_after_seconds'];
- }
- $this->setGeneralVariablesView($view);
- $this->setMinDateView($minDate, $view);
- $this->setMaxDateView($maxDate, $view);
- $view->show_sparklines = Piwik_Config::getInstance()->General['show_multisites_sparklines'];
-
- echo $view->render();
- }
-
- /**
- * The Multisites reports displays the first calendar date as the earliest day available for all websites.
- * Also, today is the later "today" available across all timezones.
- * @param array $siteIds Array of IDs for each site being displayed.
- * @return array of two Piwik_Date instances. First is the min-date & the second
- * is the max date.
- */
- private function getMinMaxDateAcrossWebsites($siteIds)
- {
- $now = Piwik_Date::now();
-
- $minDate = null;
- $maxDate = $now->subDay(1)->getTimestamp();
- foreach($siteIds as $idsite)
- {
- // look for 'now' in the website's timezone
- $timezone = Piwik_Site::getTimezoneFor($idsite);
- $date = Piwik_Date::adjustForTimezone($now->getTimestamp(), $timezone);
- if($date > $maxDate)
- {
- $maxDate = $date;
- }
-
- // look for the absolute minimum date
- $creationDate = Piwik_Site::getCreationDateFor($idsite);
- $date = Piwik_Date::adjustForTimezone(strtotime($creationDate), $timezone);
- if(is_null($minDate) || $date < $minDate)
- {
- $minDate = $date;
- }
- }
-
- return array(Piwik_Date::factory($minDate), Piwik_Date::factory($maxDate));
- }
-
- protected function applyPrettyMoney(&$sites)
- {
- foreach($sites as $idsite => &$site)
- {
- $revenue = "-";
- if(!empty($site['revenue']))
- {
- $revenue = Piwik::getPrettyMoney($site['revenue'], $site['idsite'], $htmlAllowed = false);
- }
- $site['revenue'] = '"'. $revenue . '"';
- }
- }
-
- public function getEvolutionGraph( $fetch = false, $columns = false)
- {
- if(empty($columns))
- {
- $columns = Piwik_Common::getRequestVar('columns');
- }
- $api = "API.get";
-
- if($columns == 'revenue')
- {
- $api = "Goals.get";
- }
- $view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, $api);
- $view->setColumnsToDisplay($columns);
- return $this->renderView($view, $fetch);
- }
+ protected $orderBy = 'visits';
+ protected $order = 'desc';
+ protected $evolutionBy = 'visits';
+ protected $page = 1;
+ protected $limit = 0;
+ protected $period;
+ protected $date;
+
+ function __construct()
+ {
+ parent::__construct();
+
+ $this->limit = Piwik_Config::getInstance()->General['all_websites_website_per_page'];
+ }
+
+ function index()
+ {
+ $this->getSitesInfo($isWidgetized = false);
+ }
+
+ function standalone()
+ {
+ $this->getSitesInfo($isWidgetized = true);
+ }
+
+
+ public function getSitesInfo($isWidgetized)
+ {
+ Piwik::checkUserHasSomeViewAccess();
+ $displayRevenueColumn = Piwik_Common::isGoalPluginEnabled();
+
+ $date = Piwik_Common::getRequestVar('date', 'today');
+ $period = Piwik_Common::getRequestVar('period', 'day');
+ $siteIds = Piwik_SitesManager_API::getInstance()->getSitesIdWithAtLeastViewAccess();
+ list($minDate, $maxDate) = $this->getMinMaxDateAcrossWebsites($siteIds);
+
+ // overwrites the default Date set in the parent controller
+ // Instead of the default current website's local date,
+ // we set "today" or "yesterday" based on the default Piwik timezone
+ $piwikDefaultTimezone = Piwik_SitesManager_API::getInstance()->getDefaultTimezone();
+ if ($period != 'range') {
+ $date = $this->getDateParameterInTimezone($date, $piwikDefaultTimezone);
+ $this->setDate($date);
+ $date = $date->toString();
+ }
+ $dataTable = Piwik_MultiSites_API::getInstance()->getAll($period, $date, $segment = false);
+
+
+ // put data into a form the template will understand better
+ $digestableData = array();
+ foreach ($siteIds as $idSite) {
+ $isEcommerceEnabled = Piwik_Site::isEcommerceEnabledFor($idSite);
+
+ $digestableData[$idSite] = array(
+ 'idsite' => $idSite,
+ 'main_url' => Piwik_Site::getMainUrlFor($idSite),
+ 'name' => Piwik_Site::getNameFor($idSite),
+ 'visits' => 0,
+ 'pageviews' => 0
+ );
+
+ if ($period != 'range') {
+ $digestableData[$idSite]['visits_evolution'] = 0;
+ $digestableData[$idSite]['pageviews_evolution'] = 0;
+ }
+
+ if ($displayRevenueColumn) {
+ $revenueDefault = $isEcommerceEnabled ? 0 : "'-'";
+
+ if ($period != 'range') {
+ $digestableData[$idSite]['revenue_evolution'] = $revenueDefault;
+ }
+ }
+ }
+
+ foreach ($dataTable->getRows() as $row) {
+ $idsite = (int)$row->getMetadata('idsite');
+
+ $site = & $digestableData[$idsite];
+
+ $site['visits'] = (int)$row->getColumn('nb_visits');
+ $site['pageviews'] = (int)$row->getColumn('nb_pageviews');
+
+ if ($displayRevenueColumn) {
+ if ($row->getColumn('revenue') !== false) {
+ $site['revenue'] = $row->getColumn('revenue');
+ }
+ }
+
+ if ($period != 'range') {
+ $site['visits_evolution'] = $row->getColumn('visits_evolution');
+ $site['pageviews_evolution'] = $row->getColumn('pageviews_evolution');
+
+ if ($displayRevenueColumn) {
+ $site['revenue_evolution'] = $row->getColumn('revenue_evolution');
+ }
+ }
+ }
+
+ $this->applyPrettyMoney($digestableData);
+
+ $view = new Piwik_View("MultiSites/templates/index.tpl");
+ $view->isWidgetized = $isWidgetized;
+ $view->sitesData = array_values($digestableData);
+ $view->evolutionBy = $this->evolutionBy;
+ $view->period = $period;
+ $view->page = $this->page;
+ $view->limit = $this->limit;
+ $view->orderBy = $this->orderBy;
+ $view->order = $this->order;
+ $view->totalVisits = $dataTable->getMetadata('total_nb_visits');
+ $view->totalRevenue = $dataTable->getMetadata('total_revenue');
+
+ $view->displayRevenueColumn = $displayRevenueColumn;
+ $view->totalPageviews = $dataTable->getMetadata('total_nb_pageviews');
+ $view->pastTotalVisits = $dataTable->getMetadata('last_period_total_nb_visits');
+ $view->totalVisitsEvolution = $dataTable->getMetadata('total_visits_evolution');
+ if ($view->totalVisitsEvolution > 0) {
+ $view->totalVisitsEvolution = '+' . $view->totalVisitsEvolution;
+ }
+
+ if ($period != 'range') {
+ $lastPeriod = Piwik_Period::factory($period, $dataTable->getMetadata('last_period_date'));
+ $view->pastPeriodPretty = self::getCalendarPrettyDate($lastPeriod);
+ }
+
+ $params = $this->getGraphParamsModified();
+ $view->dateSparkline = $period == 'range' ? $date : $params['date'];
+
+ $view->autoRefreshTodayReport = false;
+ // if the current date is today, or yesterday,
+ // in case the website is set to UTC-12), or today in UTC+14, we refresh the page every 5min
+ if (in_array($date, array('today', date('Y-m-d'),
+ 'yesterday', Piwik_Date::factory('yesterday')->toString('Y-m-d'),
+ Piwik_Date::factory('now', 'UTC+14')->toString('Y-m-d')))
+ ) {
+
+ $view->autoRefreshTodayReport = Piwik_Config::getInstance()->General['multisites_refresh_after_seconds'];
+ }
+ $this->setGeneralVariablesView($view);
+ $this->setMinDateView($minDate, $view);
+ $this->setMaxDateView($maxDate, $view);
+ $view->show_sparklines = Piwik_Config::getInstance()->General['show_multisites_sparklines'];
+
+ echo $view->render();
+ }
+
+ /**
+ * The Multisites reports displays the first calendar date as the earliest day available for all websites.
+ * Also, today is the later "today" available across all timezones.
+ * @param array $siteIds Array of IDs for each site being displayed.
+ * @return array of two Piwik_Date instances. First is the min-date & the second
+ * is the max date.
+ */
+ private function getMinMaxDateAcrossWebsites($siteIds)
+ {
+ $now = Piwik_Date::now();
+
+ $minDate = null;
+ $maxDate = $now->subDay(1)->getTimestamp();
+ foreach ($siteIds as $idsite) {
+ // look for 'now' in the website's timezone
+ $timezone = Piwik_Site::getTimezoneFor($idsite);
+ $date = Piwik_Date::adjustForTimezone($now->getTimestamp(), $timezone);
+ if ($date > $maxDate) {
+ $maxDate = $date;
+ }
+
+ // look for the absolute minimum date
+ $creationDate = Piwik_Site::getCreationDateFor($idsite);
+ $date = Piwik_Date::adjustForTimezone(strtotime($creationDate), $timezone);
+ if (is_null($minDate) || $date < $minDate) {
+ $minDate = $date;
+ }
+ }
+
+ return array(Piwik_Date::factory($minDate), Piwik_Date::factory($maxDate));
+ }
+
+ protected function applyPrettyMoney(&$sites)
+ {
+ foreach ($sites as $idsite => &$site) {
+ $revenue = "-";
+ if (!empty($site['revenue'])) {
+ $revenue = Piwik::getPrettyMoney($site['revenue'], $site['idsite'], $htmlAllowed = false);
+ }
+ $site['revenue'] = '"' . $revenue . '"';
+ }
+ }
+
+ public function getEvolutionGraph($fetch = false, $columns = false)
+ {
+ if (empty($columns)) {
+ $columns = Piwik_Common::getRequestVar('columns');
+ }
+ $api = "API.get";
+
+ if ($columns == 'revenue') {
+ $api = "Goals.get";
+ }
+ $view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, $api);
+ $view->setColumnsToDisplay($columns);
+ return $this->renderView($view, $fetch);
+ }
}
diff --git a/plugins/MultiSites/MultiSites.php b/plugins/MultiSites/MultiSites.php
index 967300f9a4..43797132c7 100644
--- a/plugins/MultiSites/MultiSites.php
+++ b/plugins/MultiSites/MultiSites.php
@@ -15,91 +15,90 @@
*/
class Piwik_MultiSites extends Piwik_Plugin
{
- public function getInformation()
- {
- return array(
- 'description' => Piwik_Translate('MultiSites_PluginDescription'),
- 'author' => 'ClearCode.cc',
- 'author_homepage' => "http://clearcode.cc/",
- 'version' => Piwik_Version::VERSION,
- );
- }
+ public function getInformation()
+ {
+ return array(
+ 'description' => Piwik_Translate('MultiSites_PluginDescription'),
+ 'author' => 'ClearCode.cc',
+ 'author_homepage' => "http://clearcode.cc/",
+ 'version' => Piwik_Version::VERSION,
+ );
+ }
- public function getListHooksRegistered()
- {
- return array(
- 'AssetManager.getCssFiles' => 'getCssFiles',
- 'AssetManager.getJsFiles' => 'getJsFiles',
- 'TopMenu.add' => 'addTopMenu',
- 'API.getReportMetadata' => 'getReportMetadata',
- );
- }
+ public function getListHooksRegistered()
+ {
+ return array(
+ 'AssetManager.getCssFiles' => 'getCssFiles',
+ 'AssetManager.getJsFiles' => 'getJsFiles',
+ 'TopMenu.add' => 'addTopMenu',
+ 'API.getReportMetadata' => 'getReportMetadata',
+ );
+ }
- /**
- * @param Piwik_Event_Notification $notification notification object
- */
- public function getReportMetadata($notification)
- {
- $metadataMetrics = array();
- foreach(Piwik_MultiSites_API::getApiMetrics($enhanced = true) as $metricName => $metricSettings)
- {
- $metadataMetrics[$metricName] =
- Piwik_Translate($metricSettings[Piwik_MultiSites_API::METRIC_TRANSLATION_KEY]);
- $metadataMetrics[$metricSettings[Piwik_MultiSites_API::METRIC_EVOLUTION_COL_NAME_KEY]] =
- Piwik_Translate($metricSettings[Piwik_MultiSites_API::METRIC_TRANSLATION_KEY]) . " " . Piwik_Translate('MultiSites_Evolution');
- }
+ /**
+ * @param Piwik_Event_Notification $notification notification object
+ */
+ public function getReportMetadata($notification)
+ {
+ $metadataMetrics = array();
+ foreach (Piwik_MultiSites_API::getApiMetrics($enhanced = true) as $metricName => $metricSettings) {
+ $metadataMetrics[$metricName] =
+ Piwik_Translate($metricSettings[Piwik_MultiSites_API::METRIC_TRANSLATION_KEY]);
+ $metadataMetrics[$metricSettings[Piwik_MultiSites_API::METRIC_EVOLUTION_COL_NAME_KEY]] =
+ Piwik_Translate($metricSettings[Piwik_MultiSites_API::METRIC_TRANSLATION_KEY]) . " " . Piwik_Translate('MultiSites_Evolution');
+ }
- $reports = &$notification->getNotificationObject();
+ $reports = & $notification->getNotificationObject();
- $reports[] = array(
- 'category' => Piwik_Translate('General_MultiSitesSummary'),
- 'name' => Piwik_Translate('General_AllWebsitesDashboard'),
- 'module' => 'MultiSites',
- 'action' => 'getAll',
- 'dimension' => Piwik_Translate('General_Website'), // re-using translation
- 'metrics' => $metadataMetrics,
- 'processedMetrics' => false,
- 'constantRowsCount' => false,
- 'order' => 5
- );
+ $reports[] = array(
+ 'category' => Piwik_Translate('General_MultiSitesSummary'),
+ 'name' => Piwik_Translate('General_AllWebsitesDashboard'),
+ 'module' => 'MultiSites',
+ 'action' => 'getAll',
+ 'dimension' => Piwik_Translate('General_Website'), // re-using translation
+ 'metrics' => $metadataMetrics,
+ 'processedMetrics' => false,
+ 'constantRowsCount' => false,
+ 'order' => 5
+ );
- $reports[] = array(
- 'category' => Piwik_Translate('General_MultiSitesSummary'),
- 'name' => Piwik_Translate('General_SingleWebsitesDashboard'),
- 'module' => 'MultiSites',
- 'action' => 'getOne',
- 'dimension' => Piwik_Translate('General_Website'), // re-using translation
- 'metrics' => $metadataMetrics,
- 'processedMetrics' => false,
- 'constantRowsCount' => false,
- 'order' => 5
- );
- }
+ $reports[] = array(
+ 'category' => Piwik_Translate('General_MultiSitesSummary'),
+ 'name' => Piwik_Translate('General_SingleWebsitesDashboard'),
+ 'module' => 'MultiSites',
+ 'action' => 'getOne',
+ 'dimension' => Piwik_Translate('General_Website'), // re-using translation
+ 'metrics' => $metadataMetrics,
+ 'processedMetrics' => false,
+ 'constantRowsCount' => false,
+ 'order' => 5
+ );
+ }
- public function addTopMenu()
- {
- $urlParams = array('module' => 'MultiSites', 'action' => 'index');
- $tooltip = Piwik_Translate('MultiSites_TopLinkTooltip');
- Piwik_AddTopMenu('General_MultiSitesSummary', $urlParams, true, 3, $isHTML = false, $tooltip);
- }
+ public function addTopMenu()
+ {
+ $urlParams = array('module' => 'MultiSites', 'action' => 'index');
+ $tooltip = Piwik_Translate('MultiSites_TopLinkTooltip');
+ Piwik_AddTopMenu('General_MultiSitesSummary', $urlParams, true, 3, $isHTML = false, $tooltip);
+ }
- /**
- * @param Piwik_Event_Notification $notification notification object
- */
- function getJsFiles( $notification )
- {
- $jsFiles = &$notification->getNotificationObject();
-
- $jsFiles[] = "plugins/MultiSites/templates/common.js";
- }
+ /**
+ * @param Piwik_Event_Notification $notification notification object
+ */
+ function getJsFiles($notification)
+ {
+ $jsFiles = & $notification->getNotificationObject();
- /**
- * @param Piwik_Event_Notification $notification notification object
- */
- function getCssFiles( $notification )
- {
- $cssFiles = &$notification->getNotificationObject();
-
- $cssFiles[] = "plugins/MultiSites/templates/styles.css";
- }
+ $jsFiles[] = "plugins/MultiSites/templates/common.js";
+ }
+
+ /**
+ * @param Piwik_Event_Notification $notification notification object
+ */
+ function getCssFiles($notification)
+ {
+ $cssFiles = & $notification->getNotificationObject();
+
+ $cssFiles[] = "plugins/MultiSites/templates/styles.css";
+ }
}
diff --git a/plugins/MultiSites/templates/common.js b/plugins/MultiSites/templates/common.js
index 4ef9c82002..29439401d0 100644
--- a/plugins/MultiSites/templates/common.js
+++ b/plugins/MultiSites/templates/common.js
@@ -5,248 +5,217 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-function setRowData (idsite, visits, pageviews, revenue, name, url, visitsSummaryValue, pageviewsSummaryValue, revenueSummaryValue)
-{
- this.idsite = idsite;
- this.visits = visits;
- this.revenue = revenue;
- this.name = name;
- this.url = url;
- this.pageviews = pageviews;
- this.visitsSummaryValue = parseFloat(visitsSummaryValue);
- this.pageviewsSummaryValue = parseFloat(pageviewsSummaryValue);
- this.revenueSummaryValue = parseFloat(revenueSummaryValue) || 0;
+function setRowData(idsite, visits, pageviews, revenue, name, url, visitsSummaryValue, pageviewsSummaryValue, revenueSummaryValue) {
+ this.idsite = idsite;
+ this.visits = visits;
+ this.revenue = revenue;
+ this.name = name;
+ this.url = url;
+ this.pageviews = pageviews;
+ this.visitsSummaryValue = parseFloat(visitsSummaryValue);
+ this.pageviewsSummaryValue = parseFloat(pageviewsSummaryValue);
+ this.revenueSummaryValue = parseFloat(revenueSummaryValue) || 0;
}
-function setOrderBy(self, allSites, params, mOrderBy)
-{
- if(params['mOrderBy'] == mOrderBy) {
- if(params['order'] == 'desc') {
- params['order'] = 'asc';
- } else {
- params['order'] = 'desc';
- }
- }
- params['mOrderBy'] = mOrderBy;
- prepareRows(allSites, params);
-
- $('.arrow').removeClass('multisites_desc multisites_asc');
- if($(self).attr('class') == 'evolution')
- {
- mOrderBy = 'evolution';
- }
- $('#' + mOrderBy + ' .arrow').addClass('multisites_' + params['order']);
-
- return params;
+function setOrderBy(self, allSites, params, mOrderBy) {
+ if (params['mOrderBy'] == mOrderBy) {
+ if (params['order'] == 'desc') {
+ params['order'] = 'asc';
+ } else {
+ params['order'] = 'desc';
+ }
+ }
+ params['mOrderBy'] = mOrderBy;
+ prepareRows(allSites, params);
+
+ $('.arrow').removeClass('multisites_desc multisites_asc');
+ if ($(self).attr('class') == 'evolution') {
+ mOrderBy = 'evolution';
+ }
+ $('#' + mOrderBy + ' .arrow').addClass('multisites_' + params['order']);
+
+ return params;
}
-function prepareRows(allUnsortedSites, params)
-{
- var allSites;
- $("#tb").find("tr").remove();
- $("#next").html('');
- $("#prev").html('');
- var mOrderBy = params['mOrderBy'];
-
- allSites = orderBy(allUnsortedSites, params);
-
- if(allSites.length > params['limit'])
- {
- allSites = limitBy(allSites, params);
- }
-
- displayRows(allSites, params);
-
- showPagination(allUnsortedSites, params);
- params['sitesVisible'] = allSites;
+function prepareRows(allUnsortedSites, params) {
+ var allSites;
+ $("#tb").find("tr").remove();
+ $("#next").html('');
+ $("#prev").html('');
+ var mOrderBy = params['mOrderBy'];
+
+ allSites = orderBy(allUnsortedSites, params);
+
+ if (allSites.length > params['limit']) {
+ allSites = limitBy(allSites, params);
+ }
+
+ displayRows(allSites, params);
+
+ showPagination(allUnsortedSites, params);
+ params['sitesVisible'] = allSites;
}
-function orderBy(allSites, params)
-{
- if(params['mOrderBy'] == 'names')
- {
- allSites.sort(function(a,b) {
- if (a['name'].toLowerCase() == b['name'].toLowerCase())
- {
- return 0;
- }
- return (a['name'].toLowerCase() < b['name'].toLowerCase()) ? -1 : 1;
- });
- }
- else if(params['mOrderBy'] == 'visits')
- {
- allSites.sort(function(a,b) {
- if (a['visits'] == b['visits']) {
- return 0;
- }
- return (a['visits'] < b['visits']) ? -1 : 1;
- });
- }
- else if(params['mOrderBy'] == 'pageviews')
- {
- allSites.sort(function (a,b) {
- if (a['pageviews'] == b['pageviews']) {
- return 0;
- }
- return (a['pageviews'] < b['pageviews']) ? -1 : 1;
- });
- }
- else if(params['mOrderBy'] == 'revenue')
- {
- allSites.sort(function (a,b) {
- var lhs = parseFloat(a['revenue'].replace(/[^0-9\.]+/g,"")) || 0,
- rhs = parseFloat(b['revenue'].replace(/[^0-9\.]+/g,"")) || 0;
-
- return lhs === rhs ? 0 : ((lhs < rhs) ? -1 : 1);
- });
- }
- else if(params['mOrderBy'] == 'revenueSummary')
- {
- allSites.sort(function (a,b) {
- if (a['revenueSummaryValue'] == b['revenueSummaryValue']) {
- return 0;
- }
- return (a['revenueSummaryValue'] - b['revenueSummaryValue'] <= 0.01) ? -1 : 1;
- });
- }
- else if(params['mOrderBy'] == 'pageviewsSummary')
- {
- allSites.sort(function (a,b) {
- if (a['pageviewsSummaryValue'] == b['pageviewsSummaryValue']) {
- return 0;
- }
- return (a['pageviewsSummaryValue'] - b['pageviewsSummaryValue'] <= 0.01) ? -1 : 1;
- });
- }
- else if(params['mOrderBy'] == 'visitsSummary')
- {
- allSites.sort(function (a,b) {
- if (a['visitsSummaryValue'] == b['visitsSummaryValue']) {
- return 0;
- }
- return (a['visitsSummaryValue'] - b['visitsSummaryValue'] <= 0.01) ? -1 : 1;
- });
- }
-
- if(params['order'] == 'desc')
- {
- allSites.reverse();
- }
- return allSites;
+function orderBy(allSites, params) {
+ if (params['mOrderBy'] == 'names') {
+ allSites.sort(function (a, b) {
+ if (a['name'].toLowerCase() == b['name'].toLowerCase()) {
+ return 0;
+ }
+ return (a['name'].toLowerCase() < b['name'].toLowerCase()) ? -1 : 1;
+ });
+ }
+ else if (params['mOrderBy'] == 'visits') {
+ allSites.sort(function (a, b) {
+ if (a['visits'] == b['visits']) {
+ return 0;
+ }
+ return (a['visits'] < b['visits']) ? -1 : 1;
+ });
+ }
+ else if (params['mOrderBy'] == 'pageviews') {
+ allSites.sort(function (a, b) {
+ if (a['pageviews'] == b['pageviews']) {
+ return 0;
+ }
+ return (a['pageviews'] < b['pageviews']) ? -1 : 1;
+ });
+ }
+ else if (params['mOrderBy'] == 'revenue') {
+ allSites.sort(function (a, b) {
+ var lhs = parseFloat(a['revenue'].replace(/[^0-9\.]+/g, "")) || 0,
+ rhs = parseFloat(b['revenue'].replace(/[^0-9\.]+/g, "")) || 0;
+
+ return lhs === rhs ? 0 : ((lhs < rhs) ? -1 : 1);
+ });
+ }
+ else if (params['mOrderBy'] == 'revenueSummary') {
+ allSites.sort(function (a, b) {
+ if (a['revenueSummaryValue'] == b['revenueSummaryValue']) {
+ return 0;
+ }
+ return (a['revenueSummaryValue'] - b['revenueSummaryValue'] <= 0.01) ? -1 : 1;
+ });
+ }
+ else if (params['mOrderBy'] == 'pageviewsSummary') {
+ allSites.sort(function (a, b) {
+ if (a['pageviewsSummaryValue'] == b['pageviewsSummaryValue']) {
+ return 0;
+ }
+ return (a['pageviewsSummaryValue'] - b['pageviewsSummaryValue'] <= 0.01) ? -1 : 1;
+ });
+ }
+ else if (params['mOrderBy'] == 'visitsSummary') {
+ allSites.sort(function (a, b) {
+ if (a['visitsSummaryValue'] == b['visitsSummaryValue']) {
+ return 0;
+ }
+ return (a['visitsSummaryValue'] - b['visitsSummaryValue'] <= 0.01) ? -1 : 1;
+ });
+ }
+
+ if (params['order'] == 'desc') {
+ allSites.reverse();
+ }
+ return allSites;
}
-function limitBy(allSites, params)
-{
- var begin = (params['page'] - 1) * params['limit'];
- var end = (params['page'] * params['limit']);
- return allSites.slice(begin, end);
+function limitBy(allSites, params) {
+ var begin = (params['page'] - 1) * params['limit'];
+ var end = (params['page'] * params['limit']);
+ return allSites.slice(begin, end);
}
-function switchEvolution(params)
-{
- $('.pageviews').hide();
- $('.revenue').hide();
- $('.visits').hide();
- $('.' + params['evolutionBy']).show();
- sitesVisible = params['sitesVisible'];
- for(i = 0; i < allSites.length; i++)
- {
- $('#sparkline_' + allSites[i].idsite).html(getSparklineImg(allSites[i].idsite, params['evolutionBy'], params));
- }
+function switchEvolution(params) {
+ $('.pageviews').hide();
+ $('.revenue').hide();
+ $('.visits').hide();
+ $('.' + params['evolutionBy']).show();
+ sitesVisible = params['sitesVisible'];
+ for (i = 0; i < allSites.length; i++) {
+ $('#sparkline_' + allSites[i].idsite).html(getSparklineImg(allSites[i].idsite, params['evolutionBy'], params));
+ }
}
-function displayRows(allSites, params)
-{
- for(var i = 0; i < allSites.length; i++)
- {
- var str = params['row'];
- str = str.replace(/%revenueSummary%/g, getImageForSummary(allSites[i].revenueSummaryValue));
- str = str.replace(/%pageviewsSummary%/g, getImageForSummary(allSites[i].pageviewsSummaryValue));
- str = str.replace(/%visitsSummary%/g, getImageForSummary(allSites[i].visitsSummaryValue));
- str = str.replace(/%sparkline%/g, getSparklineImg(allSites[i].idsite, params['evolutionBy'], params));
- str = str.replace(/%pageviews%/g, allSites[i].pageviews);
- str = str.replace(/%idsite%/g, allSites[i].idsite);
- str = str.replace(/%visits%/g, allSites[i].visits);
- str = str.replace(/%name%/g, allSites[i].name);
- str = str.replace(/%revenue%/g, allSites[i].revenue);
- str = str.replace(/%main_url%/g, allSites[i].url);
- str = str.replace(/%date%/g, params['date'] || params['dateSparkline']); // For period=range, dateSparkline only is set
- str = str.replace(/%period%/g, params['period']);
-
- $('#tb').append('<tr class="tables_row" id="row_'+ allSites[i].idsite+'">' + str + '</tr>');
- }
-
- $(".table_row").show();
- $('.pageviews').hide();
- $('.revenue').hide();
- $('.visits').hide();
- $('#main_indicator').hide();
- $('.' + params['evolutionBy']).show();
- $("#main_indicator").hide();
+function displayRows(allSites, params) {
+ for (var i = 0; i < allSites.length; i++) {
+ var str = params['row'];
+ str = str.replace(/%revenueSummary%/g, getImageForSummary(allSites[i].revenueSummaryValue));
+ str = str.replace(/%pageviewsSummary%/g, getImageForSummary(allSites[i].pageviewsSummaryValue));
+ str = str.replace(/%visitsSummary%/g, getImageForSummary(allSites[i].visitsSummaryValue));
+ str = str.replace(/%sparkline%/g, getSparklineImg(allSites[i].idsite, params['evolutionBy'], params));
+ str = str.replace(/%pageviews%/g, allSites[i].pageviews);
+ str = str.replace(/%idsite%/g, allSites[i].idsite);
+ str = str.replace(/%visits%/g, allSites[i].visits);
+ str = str.replace(/%name%/g, allSites[i].name);
+ str = str.replace(/%revenue%/g, allSites[i].revenue);
+ str = str.replace(/%main_url%/g, allSites[i].url);
+ str = str.replace(/%date%/g, params['date'] || params['dateSparkline']); // For period=range, dateSparkline only is set
+ str = str.replace(/%period%/g, params['period']);
+
+ $('#tb').append('<tr class="tables_row" id="row_' + allSites[i].idsite + '">' + str + '</tr>');
+ }
+
+ $(".table_row").show();
+ $('.pageviews').hide();
+ $('.revenue').hide();
+ $('.visits').hide();
+ $('#main_indicator').hide();
+ $('.' + params['evolutionBy']).show();
+ $("#main_indicator").hide();
}
-function getSparklineImg(id, column, params)
-{
- if(column != 'revenue') {
- column = 'nb_' + column;
- }
- var append = '';
- var token_auth = broadcast.getValueFromUrl('token_auth');
- if(token_auth.length) {
- append = '&token_auth=' + token_auth;
- }
- return '<img class="sparkline" alt="" src="?module=MultiSites&action=getEvolutionGraph&period=' + params['period'] + '&date=' + params['dateSparkline'] + '&evolutionBy=' + params['evolutionBy'] + '&columns=' + column + '&idSite=' + id + '&idsite=' + id + '&viewDataTable=sparkline'+ append +'" width="100" height="25" />';
+function getSparklineImg(id, column, params) {
+ if (column != 'revenue') {
+ column = 'nb_' + column;
+ }
+ var append = '';
+ var token_auth = broadcast.getValueFromUrl('token_auth');
+ if (token_auth.length) {
+ append = '&token_auth=' + token_auth;
+ }
+ return '<img class="sparkline" alt="" src="?module=MultiSites&action=getEvolutionGraph&period=' + params['period'] + '&date=' + params['dateSparkline'] + '&evolutionBy=' + params['evolutionBy'] + '&columns=' + column + '&idSite=' + id + '&idsite=' + id + '&viewDataTable=sparkline' + append + '" width="100" height="25" />';
}
-function showPagination(allSites, params)
-{
- if ((params['page'] * params['limit']) < allSites.length)
- {
- var html = '<span style="cursor:pointer;" class="pointer" onClick="changePage(allSites, params, \'next\');">' + params['next'] + ' &#187;</span>';
- $("#next").html(html);
- }
- if(params['page'] > 1)
- {
- html = '<span style="cursor:pointer;" onClick="changePage(allSites, params, \'prev\');">&#171; ' + params['prev'] + '</span>'
- $("#prev").html(html);
- }
- var start = (params['page'] - 1) * params['limit'] + 1;
- var count = allSites.length;
- var end = parseInt(start) + parseInt(params['limit']) - 1;
- if(end > count) end = count;
- html = '<span>' + (start ) + ' - ' + end + ' of ' + count + '</span>';
- $("#counter").html(html);
+function showPagination(allSites, params) {
+ if ((params['page'] * params['limit']) < allSites.length) {
+ var html = '<span style="cursor:pointer;" class="pointer" onClick="changePage(allSites, params, \'next\');">' + params['next'] + ' &#187;</span>';
+ $("#next").html(html);
+ }
+ if (params['page'] > 1) {
+ html = '<span style="cursor:pointer;" onClick="changePage(allSites, params, \'prev\');">&#171; ' + params['prev'] + '</span>'
+ $("#prev").html(html);
+ }
+ var start = (params['page'] - 1) * params['limit'] + 1;
+ var count = allSites.length;
+ var end = parseInt(start) + parseInt(params['limit']) - 1;
+ if (end > count) end = count;
+ html = '<span>' + (start ) + ' - ' + end + ' of ' + count + '</span>';
+ $("#counter").html(html);
}
-function changePage(allSites, params, kind)
-{
- if(kind == 'next')
- {
- params['page']++;
- }
- else
- {
- params['page']--;
- }
- prepareRows(allSites, params);
- return params;
+function changePage(allSites, params, kind) {
+ if (kind == 'next') {
+ params['page']++;
+ }
+ else {
+ params['page']--;
+ }
+ prepareRows(allSites, params);
+ return params;
}
-function getImageForSummary(value)
-{
- if(value > 0)
- {
- return '<img src="plugins/MultiSites/images/arrow_up.png" alt="" /> <b style="color: green;">' + value + '&nbsp;%</b>';
- }
- else if(value == 0)
- {
- return '<img src="plugins/MultiSites/images/stop.png" alt="" /> <b>' + value + '%</b>';
- }
- else
- {
- return '<img src="plugins/MultiSites/images/arrow_down.png" alt="" /> <b style="color: red;">' + value +'&nbsp;%</b>';
- }
+function getImageForSummary(value) {
+ if (value > 0) {
+ return '<img src="plugins/MultiSites/images/arrow_up.png" alt="" /> <b style="color: green;">' + value + '&nbsp;%</b>';
+ }
+ else if (value == 0) {
+ return '<img src="plugins/MultiSites/images/stop.png" alt="" /> <b>' + value + '%</b>';
+ }
+ else {
+ return '<img src="plugins/MultiSites/images/arrow_down.png" alt="" /> <b style="color: red;">' + value + '&nbsp;%</b>';
+ }
}
diff --git a/plugins/MultiSites/templates/index.tpl b/plugins/MultiSites/templates/index.tpl
index 8bb928fabb..f130594d6e 100644
--- a/plugins/MultiSites/templates/index.tpl
+++ b/plugins/MultiSites/templates/index.tpl
@@ -1,114 +1,121 @@
{assign var=showSitesSelection value=false}
{if !$isWidgetized}
-{include file="CoreHome/templates/header.tpl"}
+ {include file="CoreHome/templates/header.tpl"}
{/if}
<div id="multisites">
-<div id="main">
-{include file="MultiSites/templates/row.tpl" assign="row"}
-<script type="text/javascript">
- var allSites = new Array();
- var params = new Array();
- {foreach from=$sitesData key=i item=site}
- allSites[{$i}] = new setRowData({$site.idsite}, {$site.visits}, {$site.pageviews}, {if empty($site.revenue)}0{else}{$site.revenue}{/if}, '{$site.name|escape:"javascript"}', '{$site.main_url|escape:"javascript"}', '{if isset($site.visits_evolution)}{$site.visits_evolution|replace:",":"."}{/if}', '{if isset($site.pageviews_evolution)}{$site.pageviews_evolution|replace:",":"."}{/if}', '{if isset($site.revenue_evolution)}{$site.revenue_evolution|replace:",":"."}{/if}');
- {/foreach}
- params['period'] = '{$period}';
- params['date'] = '{$date}';
- params['evolutionBy'] = '{$evolutionBy}';
- params['mOrderBy'] = '{$orderBy}';
- params['order'] = '{$order}';
- params['limit'] = '{$limit}';
- params['page'] = 1;
- params['prev'] = "{'General_Previous'|translate|escape:"javascript"}";
- params['next'] = "{'General_Next'|translate|escape:"javascript"}";
- params['row'] = '{$row|escape:"javascript"}';
- params['dateSparkline'] = '{$dateSparkline}';
-</script>
+ <div id="main">
+ {include file="MultiSites/templates/row.tpl" assign="row"}
+ <script type="text/javascript">
+ var allSites = new Array();
+ var params = new Array();
+ {foreach from=$sitesData key=i item=site}
+ allSites[{$i}] = new setRowData({$site.idsite}, {$site.visits}, {$site.pageviews}, {if empty($site.revenue)}0{else}{$site.revenue}{/if}, '{$site.name|escape:"javascript"}', '{$site.main_url|escape:"javascript"}', '{if isset($site.visits_evolution)}{$site.visits_evolution|replace:",":"."}{/if}', '{if isset($site.pageviews_evolution)}{$site.pageviews_evolution|replace:",":"."}{/if}', '{if isset($site.revenue_evolution)}{$site.revenue_evolution|replace:",":"."}{/if}');
+ {/foreach}
+ params['period'] = '{$period}';
+ params['date'] = '{$date}';
+ params['evolutionBy'] = '{$evolutionBy}';
+ params['mOrderBy'] = '{$orderBy}';
+ params['order'] = '{$order}';
+ params['limit'] = '{$limit}';
+ params['page'] = 1;
+ params['prev'] = "{'General_Previous'|translate|escape:"javascript"}";
+ params['next'] = "{'General_Next'|translate|escape:"javascript"}";
+ params['row'] = '{$row|escape:"javascript"}';
+ params['dateSparkline'] = '{$dateSparkline}';
+ </script>
-{postEvent name="template_headerMultiSites"}
+ {postEvent name="template_headerMultiSites"}
-{if !$isWidgetized}
-<div class="top_controls_inner">
- {include file="CoreHome/templates/period_select.tpl"}
- {include file="CoreHome/templates/header_message.tpl"}
-</div>
-{/if}
+ {if !$isWidgetized}
+ <div class="top_controls_inner">
+ {include file="CoreHome/templates/period_select.tpl"}
+ {include file="CoreHome/templates/header_message.tpl"}
+ </div>
+ {/if}
-<div class="centerLargeDiv">
+ <div class="centerLargeDiv">
-<h2>{'General_AllWebsitesDashboard'|translate}
- {capture assign=nVisits}{'General_NVisits'|translate:$totalVisits}{/capture}
- {capture assign=nVisitsLast}{'General_NVisits'|translate:$pastTotalVisits}{/capture}
- <span class='smallTitle' {if $totalVisitsEvolution}title="{'General_EvolutionSummaryGeneric'|translate:$nVisits:$prettyDate:$nVisitsLast:$pastPeriodPretty:$totalVisitsEvolution}"{/if}>
+ <h2>{'General_AllWebsitesDashboard'|translate}
+ {capture assign=nVisits}{'General_NVisits'|translate:$totalVisits}{/capture}
+ {capture assign=nVisitsLast}{'General_NVisits'|translate:$pastTotalVisits}{/capture}
+ <span class='smallTitle'
+ {if $totalVisitsEvolution}title="{'General_EvolutionSummaryGeneric'|translate:$nVisits:$prettyDate:$nVisitsLast:$pastPeriodPretty:$totalVisitsEvolution}"{/if}>
{'General_TotalVisitsPageviewsRevenue'|translate:"<strong>$totalVisits</strong>":"<strong>$totalPageviews</strong>":"<strong>$totalRevenue</strong>"}
</span>
-</h2>
+ </h2>
-<table id="mt" class="dataTable" cellspacing="0">
- <thead>
- <tr>
- <th id="names" class="label" onClick="params = setOrderBy(this,allSites, params, 'names');">
- <span>{'General_Website'|translate}</span>
- <span class="arrow {if $evolutionBy=='names'}multisites_{$order}{/if}"></span>
- </th>
- <th id="visits" class="multisites-column" style="width: 100px" onClick="params = setOrderBy(this,allSites, params, 'visits');">
- <span>{'General_ColumnNbVisits'|translate}</span>
- <span class="arrow {if $evolutionBy=='visits'}multisites_{$order}{/if}"></span>
- </th>
- <th id="pageviews" class="multisites-column" style="width: 110px" onClick="params = setOrderBy(this,allSites, params, 'pageviews');">
- <span>{'General_ColumnPageviews'|translate}</span>
- <span class="arrow {if $evolutionBy=='pageviews'}multisites_{$order}{/if}"></span>
- </th>
- {if $displayRevenueColumn}
- <th id="revenue" class="multisites-column" style="width: 110px" onClick="params = setOrderBy(this,allSites, params, 'revenue');">
- <span>{'Goals_ColumnRevenue'|translate}</span>
- <span class="arrow {if $evolutionBy=='revenue'}multisites_{$order}{/if}"></span>
- </th>
- {/if}
- <th id="evolution" style=" width:350px" colspan="{if $show_sparklines}2{else}1{/if}">
- <span class="arrow "></span>
- <span class="evolution" style="cursor:pointer;" onClick="params = setOrderBy(this,allSites, params, $('#evolution_selector').val() + 'Summary');"> {'MultiSites_Evolution'|translate}</span>
- <select class="selector" id="evolution_selector" onchange="params['evolutionBy'] = $('#evolution_selector').val(); switchEvolution(params);">
- <option value="visits" {if $evolutionBy eq 'visits'} selected {/if}>{'General_ColumnNbVisits'|translate}</option>
- <option value="pageviews" {if $evolutionBy eq 'pageviews'} selected {/if}>{'General_ColumnPageviews'|translate}</option>
- {if $displayRevenueColumn}<option value="revenue" {if $evolutionBy eq 'revenue'} selected {/if}>{'Goals_ColumnRevenue'|translate}</option>{/if}
- </select>
- </th>
- </tr>
- </thead>
+ <table id="mt" class="dataTable" cellspacing="0">
+ <thead>
+ <tr>
+ <th id="names" class="label" onClick="params = setOrderBy(this,allSites, params, 'names');">
+ <span>{'General_Website'|translate}</span>
+ <span class="arrow {if $evolutionBy=='names'}multisites_{$order}{/if}"></span>
+ </th>
+ <th id="visits" class="multisites-column" style="width: 100px" onClick="params = setOrderBy(this,allSites, params, 'visits');">
+ <span>{'General_ColumnNbVisits'|translate}</span>
+ <span class="arrow {if $evolutionBy=='visits'}multisites_{$order}{/if}"></span>
+ </th>
+ <th id="pageviews" class="multisites-column" style="width: 110px" onClick="params = setOrderBy(this,allSites, params, 'pageviews');">
+ <span>{'General_ColumnPageviews'|translate}</span>
+ <span class="arrow {if $evolutionBy=='pageviews'}multisites_{$order}{/if}"></span>
+ </th>
+ {if $displayRevenueColumn}
+ <th id="revenue" class="multisites-column" style="width: 110px" onClick="params = setOrderBy(this,allSites, params, 'revenue');">
+ <span>{'Goals_ColumnRevenue'|translate}</span>
+ <span class="arrow {if $evolutionBy=='revenue'}multisites_{$order}{/if}"></span>
+ </th>
+ {/if}
+ <th id="evolution" style=" width:350px" colspan="{if $show_sparklines}2{else}1{/if}">
+ <span class="arrow "></span>
+ <span class="evolution" style="cursor:pointer;"
+ onClick="params = setOrderBy(this,allSites, params, $('#evolution_selector').val() + 'Summary');"> {'MultiSites_Evolution'|translate}</span>
+ <select class="selector" id="evolution_selector"
+ onchange="params['evolutionBy'] = $('#evolution_selector').val(); switchEvolution(params);">
+ <option value="visits" {if $evolutionBy eq 'visits'} selected {/if}>{'General_ColumnNbVisits'|translate}</option>
+ <option value="pageviews" {if $evolutionBy eq 'pageviews'} selected {/if}>{'General_ColumnPageviews'|translate}</option>
+ {if $displayRevenueColumn}
+ <option value="revenue" {if $evolutionBy eq 'revenue'} selected {/if}>{'Goals_ColumnRevenue'|translate}</option>{/if}
+ </select>
+ </th>
+ </tr>
+ </thead>
- <tbody id="tb">
- </tbody>
+ <tbody id="tb">
+ </tbody>
- <tfoot>
- {if $isSuperUser}
- <tr>
- <td colspan="8" class="clean" style="text-align: right; padding-top: 15px;padding-right:10px">
- <a href="{url}&module=SitesManager&action=index&showaddsite=1"><img src='plugins/UsersManager/images/add.png' alt="" style="margin: 0;" /> {'SitesManager_AddSite'|translate}</a>
- </td>
- </tr>
- {/if}
- <tr row_id="last" >
- <td colspan="8" class="clean" style="padding: 20px">
- <span id="prev" class="pager" style="padding-right: 20px;"></span>
+ <tfoot>
+ {if $isSuperUser}
+ <tr>
+ <td colspan="8" class="clean" style="text-align: right; padding-top: 15px;padding-right:10px">
+ <a href="{url}&module=SitesManager&action=index&showaddsite=1"><img src='plugins/UsersManager/images/add.png' alt=""
+ style="margin: 0;"/> {'SitesManager_AddSite'|translate}</a>
+ </td>
+ </tr>
+ {/if}
+ <tr row_id="last">
+ <td colspan="8" class="clean" style="padding: 20px">
+ <span id="prev" class="pager" style="padding-right: 20px;"></span>
<span class="dataTablePages">
<span id="counter">
</span>
</span>
- <span id="next" class="clean" style="padding-left: 20px;"></span>
- </td>
- </tr>
- </tfoot>
-</table>
-</div>
-<script type="text/javascript">
-prepareRows(allSites, params, '{$orderBy}');
+ <span id="next" class="clean" style="padding-left: 20px;"></span>
+ </td>
+ </tr>
+ </tfoot>
+ </table>
+ </div>
+ <script type="text/javascript">
+ prepareRows(allSites, params, '{$orderBy}');
-{if $autoRefreshTodayReport}
-piwikHelper.refreshAfter({$autoRefreshTodayReport} *1000);
-{/if}
-</script>
-</div>
+ {if $autoRefreshTodayReport}
+ piwikHelper.refreshAfter({$autoRefreshTodayReport} * 1000
+ )
+ ;
+ {/if}
+ </script>
+ </div>
</div>
{include file="CoreHome/templates/footer.tpl"}
diff --git a/plugins/MultiSites/templates/row.tpl b/plugins/MultiSites/templates/row.tpl
index f651af317e..b49457a5f7 100644
--- a/plugins/MultiSites/templates/row.tpl
+++ b/plugins/MultiSites/templates/row.tpl
@@ -1,8 +1,8 @@
-<td class="multisites-label label" >
+<td class="multisites-label label">
<a title="View reports" href="index.php?module=CoreHome&action=index&date=%date%&period=%period%&idSite=%idsite%">%name%</a>
<span style="width: 10px; margin-left:3px">
- <a target="_blank" title="{'General_GoTo'|translate:"%main_url%"}" href="%main_url%"><img src="plugins/MultiSites/images/link.gif" /></a>
+ <a target="_blank" title="{'General_GoTo'|translate:"%main_url%"}" href="%main_url%"><img src="plugins/MultiSites/images/link.gif"/></a>
</span>
</td>
<td class="multisites-column">
@@ -12,22 +12,23 @@
%pageviews%
</td>
{if $displayRevenueColumn}
-<td class="multisites-column">
- %revenue%
-</td>
+ <td class="multisites-column">
+ %revenue%
+ </td>
{/if}
{if $period!='range'}
- <td style="width:170px">
- <div class="visits" style="display:none">%visitsSummary%</div>
- <div class="pageviews"style="display:none">%pageviewsSummary%</div>
- {if $displayRevenueColumn}
- <div class="revenue"style="display:none">%revenueSummary%</div>
- {/if}
-{/if}
-{if $show_sparklines}
-<td style="width:180px">
- <div id="sparkline_%idsite%" style="width: 100px; margin: auto">
- <a target="_blank" href="index.php?module=CoreHome&action=index&date=%date%&period=%period%&idSite=%idsite%" title="{capture assign=dashboardName}{'Dashboard_DashboardOf'|translate:'%name%'}{/capture} {'General_GoTo'|translate:$dashboardName}">%sparkline%</a>
- </div>
-</td>
+<td style="width:170px">
+ <div class="visits" style="display:none">%visitsSummary%</div>
+ <div class="pageviews" style="display:none">%pageviewsSummary%</div>
+ {if $displayRevenueColumn}
+ <div class="revenue" style="display:none">%revenueSummary%</div>
+ {/if}
+ {/if}
+ {if $show_sparklines}
+ <td style="width:180px">
+ <div id="sparkline_%idsite%" style="width: 100px; margin: auto">
+ <a target="_blank" href="index.php?module=CoreHome&action=index&date=%date%&period=%period%&idSite=%idsite%"
+ title="{capture assign=dashboardName}{'Dashboard_DashboardOf'|translate:'%name%'}{/capture} {'General_GoTo'|translate:$dashboardName}">%sparkline%</a>
+ </div>
+ </td>
{/if}
diff --git a/plugins/MultiSites/templates/styles.css b/plugins/MultiSites/templates/styles.css
index e217f0b468..796a2b091a 100644
--- a/plugins/MultiSites/templates/styles.css
+++ b/plugins/MultiSites/templates/styles.css
@@ -1,67 +1,77 @@
-#multisites {
- border:0;
- padding:0 15px;
- font-size:14px;
+#multisites {
+ border: 0;
+ padding: 0 15px;
+ font-size: 14px;
}
-#multisites .top_controls_inner {
- height:10px;
+#multisites .top_controls_inner {
+ height: 10px;
}
+
.smallTitle {
- font-size:15px;
+ font-size: 15px;
}
+
.indicator {
- background: url(../images/loading-blue.gif) no-repeat center;
- height: 20px;
- width: 60px;
- margin: auto;
- border: 0 !important;
+ background: url(../images/loading-blue.gif) no-repeat center;
+ height: 20px;
+ width: 60px;
+ margin: auto;
+ border: 0 !important;
}
+
.clean {
border: 0 !important;
}
+
#multisites th {
- cursor:pointer;
+ cursor: pointer;
}
+
#multisites td, #multisites tr, #multisites .sparkline {
text-align: center;
vertical-align: middle;
padding: 1px;
margin: 0;
}
+
#multisites td.multisites-label {
- padding-left: 15px ;
- text-align:left;
+ padding-left: 15px;
+ text-align: left;
width: 250px;
}
+
#multisites td.multisites-label a:hover {
text-decoration: underline;
}
-#multisites td.multisites-column, #multisites th.multisites-column {
- width:70px;
- white-space:nowrap;
+
+#multisites td.multisites-column, #multisites th.multisites-column {
+ width: 70px;
+ white-space: nowrap;
}
-#multisites td.multisites-column-evolution, #multisites th.multisites-column-evolution {
- width:70px;
+
+#multisites td.multisites-column-evolution, #multisites th.multisites-column-evolution {
+ width: 70px;
}
-.multisites_desc
-{
- width: 16px;
- height: 13px;
- display: inline-block;
- background-image: url(../../../themes/default/images/sortdesc.png);
+
+.multisites_desc {
+ width: 16px;
+ height: 13px;
+ display: inline-block;
+ background-image: url(../../../themes/default/images/sortdesc.png);
}
-.multisites_asc
-{
- width: 16px;
- height: 13px;
- display: inline-block;
- background-image: url(../../../themes/default/images/sortasc.png);
+
+.multisites_asc {
+ width: 16px;
+ height: 13px;
+ display: inline-block;
+ background-image: url(../../../themes/default/images/sortasc.png);
}
#mt thead {
- line-height:2.5em;
+ line-height: 2.5em;
}
+
#mt thead :first-child {
-moz-border-radius-topleft: 7px;
-webkit-border-top-left-radius: 7px;