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:
Diffstat (limited to 'plugins/SitesManager/API.php')
-rw-r--r--plugins/SitesManager/API.php567
1 files changed, 488 insertions, 79 deletions
diff --git a/plugins/SitesManager/API.php b/plugins/SitesManager/API.php
index 81c660875f..e00c159a8b 100644
--- a/plugins/SitesManager/API.php
+++ b/plugins/SitesManager/API.php
@@ -17,6 +17,10 @@
class Piwik_SitesManager_API
{
static private $instance = null;
+
+ /**
+ * @return Piwik_SitesManager_API
+ */
static public function getInstance()
{
if (self::$instance == null)
@@ -27,6 +31,11 @@ class Piwik_SitesManager_API
return self::$instance;
}
+ const OPTION_EXCLUDED_IPS_GLOBAL = 'SitesManager_ExcludedIpsGlobal';
+ const OPTION_DEFAULT_TIMEZONE = 'SitesManager_DefaultTimezone';
+ const OPTION_DEFAULT_CURRENCY = 'SitesManager_DefaultCurrency';
+ const OPTION_EXCLUDED_QUERY_PARAMETERS_GLOBAL = 'SitesManager_ExcludedQueryParameters';
+
/**
* Returns the javascript tag for the given idSite.
* This tag must be included on every page to be tracked by Piwik
@@ -34,7 +43,7 @@ class Piwik_SitesManager_API
* @param int $idSite
* @return string The Javascript tag ready to be included on the HTML pages
*/
- static public function getJavascriptTag( $idSite, $piwikUrl = '', $actionName = '')
+ public function getJavascriptTag( $idSite, $piwikUrl = '', $actionName = '')
{
Piwik::checkUserHasViewAccess($idSite);
@@ -56,10 +65,10 @@ class Piwik_SitesManager_API
* @exception if the site ID doesn't exist or the user doesn't have access to it
* @return array
*/
- static public function getSiteFromId( $idSite )
+ public function getSiteFromId( $idSite )
{
Piwik::checkUserHasViewAccess( $idSite );
- $site = Zend_Registry::get('db')->fetchRow("SELECT * FROM ".Piwik::prefixTable("site")." WHERE idsite = ?", $idSite);
+ $site = Zend_Registry::get('db')->fetchRow("SELECT * FROM ".Piwik_Common::prefixTable("site")." WHERE idsite = ?", $idSite);
return $site;
}
@@ -69,11 +78,11 @@ class Piwik_SitesManager_API
*
* @return array list of alias URLs
*/
- static private function getAliasSiteUrlsFromId( $idsite )
+ private function getAliasSiteUrlsFromId( $idsite )
{
$db = Zend_Registry::get('db');
$result = $db->fetchAll("SELECT url
- FROM ".Piwik::prefixTable("site_url"). "
+ FROM ".Piwik_Common::prefixTable("site_url"). "
WHERE idsite = ?", $idsite);
$urls = array();
foreach($result as $url)
@@ -89,11 +98,11 @@ class Piwik_SitesManager_API
* @exception if the website ID doesn't exist or the user doesn't have access to it
* @return array list of URLs
*/
- static public function getSiteUrlsFromId( $idSite )
+ public function getSiteUrlsFromId( $idSite )
{
Piwik::checkUserHasViewAccess($idSite);
- $site = self::getSiteFromId($idSite);
- $urls = self::getAliasSiteUrlsFromId($idSite);
+ $site = $this->getSiteFromId($idSite);
+ $urls = $this->getAliasSiteUrlsFromId($idSite);
return array_merge(array($site['main_url']), $urls);
}
@@ -102,10 +111,10 @@ class Piwik_SitesManager_API
*
* @return array the list of websites ID
*/
- static public function getAllSitesId()
+ public function getAllSitesId()
{
Piwik::checkUserIsSuperUser();
- $result = Piwik_FetchAll("SELECT idsite FROM ".Piwik::prefixTable('site'));
+ $result = Piwik_FetchAll("SELECT idsite FROM ".Piwik_Common::prefixTable('site'));
$idSites = array();
foreach($result as $idSite)
{
@@ -121,10 +130,10 @@ class Piwik_SitesManager_API
*
* @return array for each site, an array of information (idsite, name, main_url, etc.)
*/
- static public function getSitesWithAdminAccess()
+ public function getSitesWithAdminAccess()
{
- $sitesId = self::getSitesIdWithAdminAccess();
- return self::getSitesFromIds($sitesId);
+ $sitesId = $this->getSitesIdWithAdminAccess();
+ return $this->getSitesFromIds($sitesId);
}
/**
@@ -133,10 +142,10 @@ class Piwik_SitesManager_API
*
* @return array for each site, an array of information (idsite, name, main_url, etc.)
*/
- static public function getSitesWithViewAccess()
+ public function getSitesWithViewAccess()
{
- $sitesId = self::getSitesIdWithViewAccess();
- return self::getSitesFromIds($sitesId);
+ $sitesId = $this->getSitesIdWithViewAccess();
+ return $this->getSitesFromIds($sitesId);
}
/**
@@ -145,10 +154,10 @@ class Piwik_SitesManager_API
*
* @return array array for each site, an array of information (idsite, name, main_url, etc.)
*/
- static public function getSitesWithAtLeastViewAccess()
+ public function getSitesWithAtLeastViewAccess()
{
- $sitesId = self::getSitesIdWithAtLeastViewAccess();
- return self::getSitesFromIds($sitesId);
+ $sitesId = $this->getSitesIdWithAtLeastViewAccess();
+ return $this->getSitesFromIds($sitesId);
}
/**
@@ -157,7 +166,7 @@ class Piwik_SitesManager_API
*
* @return array list of websites ID
*/
- static public function getSitesIdWithAdminAccess()
+ public function getSitesIdWithAdminAccess()
{
$sitesId = Zend_Registry::get('access')->getSitesIdWithAdminAccess();
return $sitesId;
@@ -169,7 +178,7 @@ class Piwik_SitesManager_API
*
* @return array list of websites ID
*/
- static public function getSitesIdWithViewAccess()
+ public function getSitesIdWithViewAccess()
{
return Zend_Registry::get('access')->getSitesIdWithViewAccess();
}
@@ -180,7 +189,7 @@ class Piwik_SitesManager_API
*
* @return array list of websites ID
*/
- static public function getSitesIdWithAtLeastViewAccess()
+ public function getSitesIdWithAtLeastViewAccess()
{
return Zend_Registry::get('access')->getSitesIdWithAtLeastViewAccess();
}
@@ -191,7 +200,7 @@ class Piwik_SitesManager_API
*
* @param array list of website ID
*/
- static private function getSitesFromIds( $idSites )
+ private function getSitesFromIds( $idSites )
{
if(count($idSites) === 0)
{
@@ -199,57 +208,105 @@ class Piwik_SitesManager_API
}
$db = Zend_Registry::get('db');
$sites = $db->fetchAll("SELECT *
- FROM ".Piwik::prefixTable("site")."
+ FROM ".Piwik_Common::prefixTable("site")."
WHERE idsite IN (".implode(", ", $idSites).")
ORDER BY idsite ASC");
return $sites;
}
-
+
+ /**
+ * Returns the list of websites ID associated with a URL.
+ *
+ * @param string $url
+ * @return array list of websites ID
+ */
+ public function getSitesIdFromSiteUrl( $url )
+ {
+ $url = $this->removeTrailingSlash($url);
+
+ if(Piwik::isUserIsSuperUser())
+ {
+ $ids = Zend_Registry::get('db')->fetchAll(
+ 'SELECT idsite FROM ' . Piwik_Common::prefixTable('site') . ' WHERE main_url = ? ' .
+ 'UNION SELECT idsite FROM ' . Piwik_Common::prefixTable('site_url') . ' WHERE url = ?', array($url, $url));
+ }
+ else
+ {
+ $login = Piwik::getCurrentUserLogin();
+ $ids = Zend_Registry::get('db')->fetchAll(
+ 'SELECT idsite FROM ' . Piwik_Common::prefixTable('site') . ' WHERE main_url = ? ' .
+ 'AND idsite IN (' . Piwik_Access::getSqlAccessSite('idsite') . ') ' .
+ 'UNION SELECT idsite FROM ' . Piwik_Common::prefixTable('site_url') . ' WHERE url = ? ' .
+ 'AND idsite IN (' . Piwik_Access::getSqlAccessSite('idsite') . ')', array($url, $login, $url, $login));
+ }
+
+ return $ids;
+ }
+
/**
- * Add a website in the database.
+ * Add a website.
+ * Requires Super User access.
*
* The website is defined by a name and an array of URLs.
- * The name must not be empty.
- * The URLs array must contain at least one URL called the 'main_url' ;
- * if several URLs are provided in the array, they will be recorded as Alias URLs for
- * this website.
- *
- * Requires Super User access.
+ * @param string Site name
+ * @param array|string The URLs array must contain at least one URL called the 'main_url' ;
+ * if several URLs are provided in the array, they will be recorded
+ * as Alias URLs for this website.
+ * @param string Comma separated list of IPs to exclude from the reports (allows wildcards)
+ * @param string Timezone string, eg. 'Europe/London'
*
* @return int the website ID created
*/
- static public function addSite( $siteName, $urls )
+ public function addSite( $siteName, $urls, $excludedIps = null, $excludedQueryParameters = null, $timezone = null, $currency = null )
{
Piwik::checkUserIsSuperUser();
- self::checkName($siteName);
- $urls = self::cleanParameterUrls($urls);
- self::checkUrls($urls);
- self::checkAtLeastOneUrl($urls);
+ $this->checkName($siteName);
+ $urls = $this->cleanParameterUrls($urls);
+ $this->checkUrls($urls);
+ $this->checkAtLeastOneUrl($urls);
+ $timezone = trim($timezone);
+
+ if(empty($timezone))
+ {
+ $timezone = $this->getDefaultTimezone();
+ }
+ $this->checkValidTimezone($timezone);
+
+ if(empty($currency))
+ {
+ $currency = $this->getDefaultCurrency();
+ }
+ $this->checkValidCurrency($currency);
$db = Zend_Registry::get('db');
$url = $urls[0];
$urls = array_slice($urls, 1);
- $db->insert(Piwik::prefixTable("site"), array(
- 'name' => $siteName,
- 'main_url' => $url,
- )
- );
+ $bind = array( 'name' => $siteName,
+ 'main_url' => $url,
+ 'ts_created' => Piwik_Date::now()->getDatetime()
+ );
+
+ $bind['excluded_ips'] = $this->checkAndReturnExcludedIps($excludedIps);
+ $bind['excluded_parameters'] = $this->checkAndReturnExcludedQueryParameters($excludedQueryParameters);
+ $bind['timezone'] = $timezone;
+ $bind['currency'] = $currency;
+ $db->insert(Piwik_Common::prefixTable("site"), $bind);
$idSite = $db->lastInsertId();
- self::insertSiteUrls($idSite, $urls);
+ $this->insertSiteUrls($idSite, $urls);
// we reload the access list which doesn't yet take in consideration this new website
Zend_Registry::get('access')->reloadAccess();
- self::postUpdateWebsite($idSite);
+ $this->postUpdateWebsite($idSite);
return (int)$idSite;
}
- private static function postUpdateWebsite($idSite)
+ private function postUpdateWebsite($idSite)
{
Piwik_Common::regenerateCacheWebsiteAttributes($idSite);
}
@@ -261,11 +318,11 @@ class Piwik_SitesManager_API
*
* @param int $idSite
*/
- static public function deleteSite( $idSite )
+ public function deleteSite( $idSite )
{
Piwik::checkUserIsSuperUser();
- $idSites = Piwik_SitesManager_API::getAllSitesId();
+ $idSites = Piwik_SitesManager_API::getInstance()->getAllSitesId();
if(!in_array($idSite, $idSites))
{
throw new Exception("website id = $idSite not found");
@@ -278,13 +335,13 @@ class Piwik_SitesManager_API
$db = Zend_Registry::get('db');
- $db->query("DELETE FROM ".Piwik::prefixTable("site")."
+ $db->query("DELETE FROM ".Piwik_Common::prefixTable("site")."
WHERE idsite = ?", $idSite);
- $db->query("DELETE FROM ".Piwik::prefixTable("site_url")."
+ $db->query("DELETE FROM ".Piwik_Common::prefixTable("site_url")."
WHERE idsite = ?", $idSite);
- $db->query("DELETE FROM ".Piwik::prefixTable("access")."
+ $db->query("DELETE FROM ".Piwik_Common::prefixTable("access")."
WHERE idsite = ?", $idSite);
Piwik_Common::deleteCacheWebsiteAttributes($idSite);
@@ -296,7 +353,7 @@ class Piwik_SitesManager_API
*
* @exception if the parameter is not an array or if array empty
*/
- static private function checkAtLeastOneUrl( $urls )
+ private function checkAtLeastOneUrl( $urls )
{
if(!is_array($urls)
|| count($urls) == 0)
@@ -305,6 +362,52 @@ class Piwik_SitesManager_API
}
}
+ private function checkValidTimezone($timezone)
+ {
+ $timezones = $this->getTimezonesList();
+ foreach($timezones as $continent => $cities)
+ {
+ foreach($cities as $timezoneId => $city)
+ {
+ if($timezoneId == $timezone)
+ {
+ return true;
+ }
+ }
+ }
+ throw new Exception(Piwik_TranslateException('SitesManager_ExceptionInvalidTimezone', array($timezone)));
+ }
+
+ private function checkValidCurrency($currency)
+ {
+ if(!in_array($currency, array_keys($this->getCurrencyList())))
+ {
+ throw new Exception(Piwik_TranslateException('SitesManager_ExceptionInvalidCurrency', array($currency, "USD, EUR, etc.")));
+ }
+ }
+
+ /**
+ * Checks that the submitted IPs (comma separated list) are valid
+ * Returns the cleaned up IPs
+ * @param $excludedIps
+ *
+ * @return array of IPs
+ */
+ private function checkAndReturnExcludedIps($excludedIps)
+ {
+ $ips = explode(',', $excludedIps);
+ $ips = array_map('trim', $ips);
+ $ips = array_filter($ips, 'strlen');
+ foreach($ips as $ip)
+ {
+ if(!$this->isValidIp($ip))
+ {
+ throw new Exception(Piwik_TranslateException('SitesManager_ExceptionInvalidIPFormat', array($ip, "1.2.3.4 or 1.2.3.*")));
+ }
+ }
+ $ips = implode(',', $ips);
+ return $ips;
+ }
/**
* Add a list of alias Urls to the given idSite
*
@@ -313,22 +416,136 @@ class Piwik_SitesManager_API
*
* @return int the number of inserted URLs
*/
- static public function addSiteAliasUrls( $idSite, $urls)
+ public function addSiteAliasUrls( $idSite, $urls)
{
Piwik::checkUserHasAdminAccess( $idSite );
- $urls = self::cleanParameterUrls($urls);
- self::checkUrls($urls);
+ $urls = $this->cleanParameterUrls($urls);
+ $this->checkUrls($urls);
- $urlsInit = self::getSiteUrlsFromId($idSite);
+ $urlsInit = $this->getSiteUrlsFromId($idSite);
$toInsert = array_diff($urls, $urlsInit);
- self::insertSiteUrls($idSite, $toInsert);
- self::postUpdateWebsite($idSite);
+ $this->insertSiteUrls($idSite, $toInsert);
+ $this->postUpdateWebsite($idSite);
return count($toInsert);
}
/**
+ * Sets IPs to be excluded from all websites. IPs can contain wildcards.
+ * Will also apply to websites created in the future.
+ *
+ * @param string Comma separated list of IPs to exclude from being tracked (allows wildcards)
+ * @return bool
+ */
+ public function setGlobalExcludedIps($excludedIps)
+ {
+ Piwik::checkUserIsSuperUser();
+ $excludedIps = $this->checkAndReturnExcludedIps($excludedIps);
+ Piwik_SetOption(self::OPTION_EXCLUDED_IPS_GLOBAL, $excludedIps);
+ Piwik_Common::deleteAllCache();
+ return true;
+ }
+
+ /**
+ * Returns the list of URL query parameters that are excluded from all websites
+ *
+ * @return string Comma separated list of URL parameters
+ */
+ public function getExcludedQueryParametersGlobal()
+ {
+ Piwik::checkUserHasSomeAdminAccess();
+ return Piwik_GetOption(self::OPTION_EXCLUDED_QUERY_PARAMETERS_GLOBAL);
+ }
+
+ /**
+ * Sets list of URL query parameters to be excluded on all websites.
+ * Will also apply to websites created in the future.
+ *
+ * @param string Comma separated list of URL query parameters to exclude from URLs
+ * @return bool
+ */
+ public function setGlobalExcludedQueryParameters($excludedQueryParameters)
+ {
+ Piwik::checkUserIsSuperUser();
+ $excludedQueryParameters = $this->checkAndReturnExcludedQueryParameters($excludedQueryParameters);
+ Piwik_SetOption(self::OPTION_EXCLUDED_QUERY_PARAMETERS_GLOBAL, $excludedQueryParameters);
+ Piwik_Common::deleteAllCache();
+ return true;
+ }
+
+ /**
+ * Returns the list of IPs that are excluded from all websites
+ *
+ * @return string Comma separated list of IPs
+ */
+ public function getExcludedIpsGlobal()
+ {
+ Piwik::checkUserHasSomeAdminAccess();
+ return Piwik_GetOption(self::OPTION_EXCLUDED_IPS_GLOBAL);
+ }
+
+ /**
+ * Returns the default currency that will be set when creating a website through the API.
+ *
+ * @return string Currency ID eg. 'USD'
+ */
+ public function getDefaultCurrency()
+ {
+ Piwik::checkUserHasSomeAdminAccess();
+ $defaultCurrency = Piwik_GetOption(self::OPTION_DEFAULT_CURRENCY);
+ if($defaultCurrency)
+ {
+ return $defaultCurrency;
+ }
+ return 'USD';
+ }
+
+ /**
+ * Sets the default currency that will be used when creating websites
+ *
+ * @param $defaultCurrency string eg. 'USD'
+ * @return bool
+ */
+ public function setDefaultCurrency($defaultCurrency)
+ {
+ Piwik::checkUserIsSuperUser();
+ $this->checkValidCurrency($defaultCurrency);
+ Piwik_SetOption(self::OPTION_DEFAULT_CURRENCY, $defaultCurrency);
+ return true;
+ }
+
+ /**
+ * Returns the default timezone that will be set when creating a website through the API.
+ * Via the UI, if the default timezone is not UTC, it will be pre-selected in the drop down
+ *
+ * @return string Timezone eg. UTC+7 or Europe/Paris
+ */
+ public function getDefaultTimezone()
+ {
+ $defaultTimezone = Piwik_GetOption(self::OPTION_DEFAULT_TIMEZONE);
+ if($defaultTimezone)
+ {
+ return $defaultTimezone;
+ }
+ return 'UTC';
+ }
+
+ /**
+ * Sets the default timezone that will be used when creating websites
+ *
+ * @param $defaultTimezone string eg. Europe/Paris or UTC+8
+ * @return bool
+ */
+ public function setDefaultTimezone($defaultTimezone)
+ {
+ Piwik::checkUserIsSuperUser();
+ $this->checkValidTimezone($defaultTimezone);
+ Piwik_SetOption(self::OPTION_DEFAULT_TIMEZONE, $defaultTimezone);
+ return true;
+ }
+
+ /**
* Update an existing website.
* If only one URL is specified then only the main url will be updated.
* If several URLs are specified, both the main URL and the alias URLs will be updated.
@@ -336,59 +553,234 @@ class Piwik_SitesManager_API
* @param int website ID defining the website to edit
* @param string website name
* @param string|array the website URLs
+ * @param string Comma separated list of IPs to exclude from being tracked (allows wildcards)
+ * @param string Timezone
*
* @exception if any of the parameter is not correct
*
* @return bool true on success
*/
- static public function updateSite( $idSite, $siteName, $urls = null)
+ public function updateSite( $idSite, $siteName, $urls = null, $excludedIps = null, $excludedQueryParameters = null, $timezone = null, $currency = null)
{
Piwik::checkUserHasAdminAccess($idSite);
- self::checkName($siteName);
+ $this->checkName($siteName);
// SQL fields to update
$bind = array();
if(!is_null($urls))
{
- $urls = self::cleanParameterUrls($urls);
- self::checkUrls($urls);
- self::checkAtLeastOneUrl($urls);
+ $urls = $this->cleanParameterUrls($urls);
+ $this->checkUrls($urls);
+ $this->checkAtLeastOneUrl($urls);
$url = $urls[0];
$bind['main_url'] = $url;
}
+
+ if(!is_null($currency))
+ {
+ $currency = trim($currency);
+ $this->checkValidCurrency($currency);
+ $bind['currency'] = $currency;
+ }
+ if(!is_null($timezone))
+ {
+ $timezone = trim($timezone);
+ $this->checkValidTimezone($timezone);
+ $bind['timezone'] = $timezone;
+ }
+ $bind['excluded_ips'] = $this->checkAndReturnExcludedIps($excludedIps);
+ $bind['excluded_parameters'] = $this->checkAndReturnExcludedQueryParameters($excludedQueryParameters);
$bind['name'] = $siteName;
-
$db = Zend_Registry::get('db');
- $db->update(Piwik::prefixTable("site"),
+ $db->update(Piwik_Common::prefixTable("site"),
$bind,
"idsite = $idSite"
);
// we now update the main + alias URLs
- self::deleteSiteAliasUrls($idSite);
+ $this->deleteSiteAliasUrls($idSite);
if(count($urls) > 1)
{
- $insertedUrls = self::addSiteAliasUrls($idSite, array_slice($urls,1));
+ $insertedUrls = $this->addSiteAliasUrls($idSite, array_slice($urls,1));
+ }
+ $this->postUpdateWebsite($idSite);
+ }
+
+ private function checkAndReturnExcludedQueryParameters($parameters)
+ {
+ $parameters = trim($parameters);
+ if(empty($parameters))
+ {
+ return '';
}
- self::postUpdateWebsite($idSite);
+
+ $parameters = explode(',', $parameters);
+ $parameters = array_map('trim', $parameters);
+ $parameters = array_filter($parameters, 'strlen');
+ $parameters = array_unique($parameters);
+ return implode(',', $parameters);
+ }
+
+ /**
+ * Returns the list of supported currencies
+ * @see getCurrencySymbols()
+ * @return array ( currencyId => currencyName)
+ */
+ public function getCurrencyList()
+ {
+ return array(
+ 'USD' => 'US Dollar ($)',
+ 'EUR' => 'Euro (€)',
+ 'JPY' => 'Japanese Yen (¥)',
+ 'GBP' => 'British Pound Sterling (£)',
+ 'AUD' => 'Australian Dollar (A$)',
+ 'KRW' => 'South Korean Won (₩)',
+ 'BRL' => 'Brazilian Real (R$)',
+ 'CNY' => 'Chinese Yuan Renminbi (CN¥)',
+ 'DKK' => 'Danish Krone (Dkr)',
+ 'RUB' => 'Russian Ruble (RUB)',
+ 'SEK' => 'Swedish Krona (Skr)',
+ 'NOK' => 'Norwegian Krone (Nkr)',
+ 'PLN' => 'Polish Zloty (zł)',
+ 'TRY' => 'Turkish Lira (TL)',
+ 'TWD' => 'New Taiwan Dollar (NT$)',
+ 'HKD' => 'Hong Kong Dollar (HK$)',
+ 'THB' => 'Thai Baht (฿)',
+ 'IDR' => 'Indonesian Rupiah (Rp)',
+ 'ARS' => 'Argentine Peso (AR$)',
+ 'MXN' => 'Mexican Peso (MXN)',
+ 'VND' => 'Vietnamese Dong (₫)',
+ 'PHP' => 'Philippine Peso (Php)',
+ 'INR' => 'Indian Rupee (Rs.)',
+ 'VEF' => 'Venezuelan bolívar (Bs. F)',
+ 'CHF' => 'Swiss Franc (Fr.)',
+ );
+ }
+
+ /**
+ * Returns the list of currency symbols
+ * @see getCurrencyList()
+ * @return array( currencyId => currencySymbol )
+ */
+ public function getCurrencySymbols()
+ {
+ return array(
+ 'USD' => '$',
+ 'EUR' => '€',
+ 'JPY' => '¥',
+ 'GBP' => '£',
+ 'AUD' => 'A$',
+ 'KRW' => '₩',
+ 'BRL' => 'R$',
+ 'CNY' => 'CN¥',
+ 'DKK' => 'Dkr',
+ 'RUB' => 'RUB',
+ 'SEK' => 'Skr',
+ 'NOK' => 'Nkr',
+ 'PLN' => 'zł',
+ 'TRY' => 'TL',
+ 'TWD' => 'NT$',
+ 'HKD' => 'HK$',
+ 'THB' => '฿',
+ 'IDR' => 'Rp',
+ 'ARS' => 'AR$',
+ 'MXN' => 'MXN',
+ 'VND' => '₫',
+ 'PHP' => 'Php',
+ 'INR' => 'Rs.',
+ 'VEF' => 'Bs. F',
+ 'CHF' => 'Fr.',
+ );
+ }
+
+
+ /**
+ * Returns the list of timezones supported.
+ * Used for addSite and updateSite
+ *
+ * @TODO NOT COMPATIBLE WITH API RESPONSE AUTO BUILDER
+ *
+ * @return array of timezone strings
+ */
+ public function getTimezonesList()
+ {
+ if(!Piwik::isTimezoneSupportEnabled())
+ {
+ return array('UTC' => $this->getTimezonesListUTCOffsets());
+ }
+
+ $continents = array( 'Africa', 'America', 'Antarctica', 'Arctic', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Indian', 'Pacific');
+ $timezones = timezone_identifiers_list();
+
+ $return = array();
+ foreach($timezones as $timezone)
+ {
+ $timezoneExploded = explode('/', $timezone);
+ $continent = $timezoneExploded[0];
+
+ // only display timezones that are grouped by continent
+ if(!in_array($continent, $continents))
+ {
+ continue;
+ }
+ $city = $timezoneExploded[1];
+ if(!empty($timezoneExploded[2]))
+ {
+ $city .= ' - '.$timezoneExploded[2];
+ }
+ $city = str_replace('_', ' ', $city);
+ $return[$continent][$timezone] = $city;
+ }
+
+ foreach($continents as $continent)
+ {
+ ksort($return[$continent]);
+ }
+
+ $return['UTC'] = $this->getTimezonesListUTCOffsets();
+ return $return;
+ }
+
+ private function getTimezonesListUTCOffsets()
+ {
+ // manually add the UTC offsets
+ $GmtOffsets = array (-12, -11.5, -11, -10.5, -10, -9.5, -9, -8.5, -8, -7.5, -7, -6.5, -6, -5.5, -5, -4.5, -4, -3.5, -3, -2.5, -2, -1.5, -1, -0.5,
+ 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 5.75, 6, 6.5, 7, 7.5, 8, 8.5, 8.75, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.75, 13, 13.75, 14);
+
+ $return = array();
+ foreach($GmtOffsets as $offset)
+ {
+ if($offset > 0)
+ {
+ $offset = '+'.$offset;
+ }
+ elseif($offset == 0)
+ {
+ $offset = '';
+ }
+ $offset = 'UTC' . $offset;
+ $offsetName = str_replace(array('.25','.5','.75'), array(':15',':30',':45'), $offset);
+ $return[$offset] = $offsetName;
+ }
+ return $return;
}
/**
* Insert the list of alias URLs for the website.
* The URLs must not exist already for this website!
*/
- static private function insertSiteUrls($idSite, $urls)
+ private function insertSiteUrls($idSite, $urls)
{
if(count($urls) != 0)
{
$db = Zend_Registry::get('db');
foreach($urls as $url)
{
- $db->insert(Piwik::prefixTable("site_url"), array(
+ $db->insert(Piwik_Common::prefixTable("site_url"), array(
'idsite' => $idSite,
'url' => $url
)
@@ -400,10 +792,10 @@ class Piwik_SitesManager_API
/**
* Delete all the alias URLs for the given idSite.
*/
- static private function deleteSiteAliasUrls($idsite)
+ private function deleteSiteAliasUrls($idsite)
{
$db = Zend_Registry::get('db');
- $db->query("DELETE FROM ".Piwik::prefixTable("site_url") ."
+ $db->query("DELETE FROM ".Piwik_Common::prefixTable("site_url") ."
WHERE idsite = ?", $idsite);
}
@@ -412,7 +804,7 @@ class Piwik_SitesManager_API
*
* @return string the URL without the trailing slash
*/
- static private function removeTrailingSlash($url)
+ private function removeTrailingSlash($url)
{
// if there is a final slash, we take the URL without this slash (expected URL format)
if(strlen($url) > 5
@@ -428,17 +820,33 @@ class Piwik_SitesManager_API
*
* @return bool
*/
- static private function isValidUrl( $url )
+ private function isValidUrl( $url )
{
return Piwik_Common::isLookLikeUrl($url);
}
/**
+ * Tests if the IP is a valid IP, allowing wildcards, except in the first octet.
+ * Wildcards can only be used from right to left, ie. 1.1.*.* is allowed, but 1.1.*.1 is not.
+ *
+ * @param $ip
+ * @return bool
+ */
+ private function isValidIp( $ip )
+ {
+ return preg_match('~^(\d+)\.(\d+)\.(\d+)\.(\d+)$~', $ip, $matches) !== 0
+ || preg_match('~^(\d+)\.(\d+)\.(\d+)\.\*$~', $ip, $matches) !== 0
+ || preg_match('~^(\d+)\.(\d+)\.\*.\*$~', $ip, $matches) !== 0
+ || preg_match('~^(\d+)\.\*\.\*\.\*$~', $ip, $matches) !== 0
+ ;
+ }
+
+ /**
* Check that the website name has a correct format.
*
* @exception if the website name is empty
*/
- static private function checkName($siteName)
+ private function checkName($siteName)
{
if(empty($siteName))
{
@@ -452,11 +860,11 @@ class Piwik_SitesManager_API
* @exception if any of the urls is not valid
* @param array
*/
- static private function checkUrls($urls)
+ private function checkUrls($urls)
{
foreach($urls as $url)
{
- if(!self::isValidUrl($url))
+ if(!$this->isValidUrl($url))
{
throw new Exception(sprintf(Piwik_TranslateException("SitesManager_ExceptionInvalidUrl"),$url));
}
@@ -471,19 +879,20 @@ class Piwik_SitesManager_API
* @param string|array urls
* @return array the array of cleaned URLs
*/
- static private function cleanParameterUrls( $urls )
+ private function cleanParameterUrls( $urls )
{
if(!is_array($urls))
{
$urls = array($urls);
}
+
+ $urls = array_map('urldecode', $urls);
foreach($urls as &$url)
{
- $url = self::removeTrailingSlash($url);
+ $url = $this->removeTrailingSlash($url);
}
$urls = array_unique($urls);
return $urls;
}
}
-