diff options
author | mattab <matthieu.aubry@gmail.com> | 2013-03-28 03:42:39 +0400 |
---|---|---|
committer | mattab <matthieu.aubry@gmail.com> | 2013-03-28 03:42:40 +0400 |
commit | ae4b03163792f0b6e933933e5d37df87dc3fd566 (patch) | |
tree | d1d7510a9728f587d3d63ebd03e4ecf3d904838b /plugins/MultiSites | |
parent | 158c2150f5f2e13ece459b8d131244c11b763997 (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-x | plugins/MultiSites/API.php | 930 | ||||
-rw-r--r-- | plugins/MultiSites/Controller.php | 431 | ||||
-rw-r--r-- | plugins/MultiSites/MultiSites.php | 157 | ||||
-rw-r--r-- | plugins/MultiSites/templates/common.js | 411 | ||||
-rw-r--r-- | plugins/MultiSites/templates/index.tpl | 191 | ||||
-rw-r--r-- | plugins/MultiSites/templates/row.tpl | 37 | ||||
-rw-r--r-- | plugins/MultiSites/templates/styles.css | 76 |
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'] + ' »</span>'; - $("#next").html(html); - } - if(params['page'] > 1) - { - html = '<span style="cursor:pointer;" onClick="changePage(allSites, params, \'prev\');">« ' + 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'] + ' »</span>'; + $("#next").html(html); + } + if (params['page'] > 1) { + html = '<span style="cursor:pointer;" onClick="changePage(allSites, params, \'prev\');">« ' + 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 + ' %</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 +' %</b>'; - } +function getImageForSummary(value) { + if (value > 0) { + return '<img src="plugins/MultiSites/images/arrow_up.png" alt="" /> <b style="color: green;">' + value + ' %</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 + ' %</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; |