getName(); * * **Without allocation** * * $name = Site::getNameFor($idSite); * * @api */ class Site { const DEFAULT_SITE_TYPE = "website"; private static $intProperties = [ 'idsite', 'ecommerce', 'sitesearch', 'exclude_unknown_urls', 'keep_url_fragment', ]; /** * @var int|null */ protected $id = null; /** * @var array */ protected static $infoSites = array(); private $site = array(); /** * Constructor. * * @param int $idsite The ID of the site we want data for. * @throws UnexpectedWebsiteFoundException */ public function __construct($idsite) { $this->id = (int) $idsite; if (!empty(self::$infoSites[$this->id])) { $site = self::$infoSites[$this->id]; } else { $site = API::getInstance()->getSiteFromId($this->id); if (empty($site)) { throw new UnexpectedWebsiteFoundException('The requested website id = ' . (int)$this->id . ' couldn\'t be found'); } } $sites = array(&$site); self::triggerSetSitesEvent($sites); self::setSiteFromArray($this->id, $site); $this->site = $site; // for serialized format to be predictable across php/mysql/pdo/mysqli versions, make sure the int props stay ints foreach (self::$intProperties as $propertyName) { $this->site[$propertyName] = (int)$this->site[$propertyName]; } } /** * Sets the cached site data with an array that associates site IDs with * individual site data. * * @param array $sites The array of sites data. Indexed by site ID. eg, * * array('1' => array('name' => 'Site 1', ...), * '2' => array('name' => 'Site 2', ...))` */ public static function setSites($sites) { self::triggerSetSitesEvent($sites); foreach ($sites as $idsite => $site) { self::setSiteFromArray($idsite, $site); } } private static function triggerSetSitesEvent(&$sites) { /** * Triggered so plugins can modify website entities without modifying the database. * * This event should **not** be used to add data that is expensive to compute. If you * need to make HTTP requests or query the database for more information, this is not * the place to do it. * * **Example** * * Piwik::addAction('Site.setSites', function (&$sites) { * foreach ($sites as &$site) { * $site['name'] .= " (original)"; * } * }); * * @param array $sites An array of website entities. [Learn more.](/guides/persistence-and-the-mysql-backend#websites-aka-sites) * * This is not yet public as it doesn't work 100% accurately. Eg if `setSiteFromArray()` is called directly this event will not be triggered. * @ignore */ Piwik::postEvent('Site.setSites', array(&$sites)); } /** * Sets a site information in memory (statically cached). * * Plugins can filter the website attributes before it is cached, eg. to change the website name, * creation date, etc. * * @param $idSite * @param $infoSite * @throws Exception if website or idsite is invalid * @internal */ public static function setSiteFromArray($idSite, $infoSite) { if (empty($idSite) || empty($infoSite)) { throw new UnexpectedWebsiteFoundException("An unexpected website was found in the request: website id was set to '$idSite' ."); } self::$infoSites[$idSite] = $infoSite; } /** * Sets the cached Site data with a non-associated array of site data. * * This method will trigger the `Sites.setSites` event modifying `$sites` before setting cached * site data. In other words, this method will change the site data before it is cached and then * return the modified array. * * @param array $sites The array of sites data. eg, * * array( * array('idsite' => '1', 'name' => 'Site 1', ...), * array('idsite' => '2', 'name' => 'Site 2', ...), * ) * @return array The modified array. * @deprecated * @internal */ public static function setSitesFromArray($sites) { self::triggerSetSitesEvent($sites); foreach ($sites as $site) { $idSite = null; if (!empty($site['idsite'])) { $idSite = $site['idsite']; } self::setSiteFromArray($idSite, $site); } return $sites; } /** * 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 Date[] of two Date instances. First is the min-date & the second * is the max date. * @ignore */ public static function getMinMaxDateAcrossWebsites($siteIds) { $siteIds = self::getIdSitesFromIdSitesString($siteIds); $now = Date::now(); $minDate = null; $maxDate = $now->subDay(1)->getTimestamp(); foreach ($siteIds as $idsite) { // look for 'now' in the website's timezone $timezone = Site::getTimezoneFor($idsite); $date = Date::adjustForTimezone($now->getTimestamp(), $timezone); if ($date > $maxDate) { $maxDate = $date; } // look for the absolute minimum date $creationDate = Site::getCreationDateFor($idsite); $date = Date::adjustForTimezone(strtotime($creationDate), $timezone); if (is_null($minDate) || $date < $minDate) { $minDate = $date; } } return array(Date::factory($minDate), Date::factory($maxDate)); } /** * Returns a string representation of the site this instance references. * * Useful for debugging. * * @return string */ public function __toString() { return "site id=" . $this->getId() . ", name=" . $this->getName() . ", url = " . $this->getMainUrl() . ", IPs excluded = " . $this->getExcludedIps() . ", timezone = " . $this->getTimezone() . ", currency = " . $this->getCurrency() . ", creation date = " . $this->getCreationDate(); } /** * Returns the name of the site. * * @return string * @throws Exception if data for the site cannot be found. */ public function getName() { return $this->get('name'); } /** * Returns the main url of the site. * * @return string * @throws Exception if data for the site cannot be found. */ public function getMainUrl() { return $this->get('main_url'); } /** * Returns the id of the site. * * @return int * @throws Exception if data for the site cannot be found. */ public function getId() { return $this->id; } /** * Returns a site property by name. * * @param string $name Name of the property to return (eg, `'main_url'` or `'name'`). * @return mixed * @throws Exception */ protected function get($name) { if (isset($this->site[$name])) { return $this->site[$name]; } throw new Exception("The property $name could not be found on the website ID " . (int)$this->id); } /** * Returns the website type (by default `"website"`, which means it is a single website). * * @return string */ public function getType() { $type = $this->get('type'); return $type; } /** * Returns the creation date of the site. * * @return Date * @throws Exception if data for the site cannot be found. */ public function getCreationDate() { $date = $this->get('ts_created'); return Date::factory($date); } /** * Returns the timezone of the size. * * @return string * @throws Exception if data for the site cannot be found. */ public function getTimezone() { return $this->get('timezone'); } /** * Returns the currency of the site. * * @return string * @throws Exception if data for the site cannot be found. */ public function getCurrency() { return $this->get('currency'); } /** * Returns the excluded ips of the site. * * @return string * @throws Exception if data for the site cannot be found. */ public function getExcludedIps() { return $this->get('excluded_ips'); } /** * Returns the excluded query parameters of the site. * * @return string * @throws Exception if data for the site cannot be found. */ public function getExcludedQueryParameters() { return $this->get('excluded_parameters'); } /** * Returns whether ecommerce is enabled for the site. * * @return bool * @throws Exception if data for the site cannot be found. */ public function isEcommerceEnabled() { return $this->get('ecommerce') == 1; } /** * Returns the site search keyword query parameters for the site. * * @return string * @throws Exception if data for the site cannot be found. */ public function getSearchKeywordParameters() { return $this->get('sitesearch_keyword_parameters'); } /** * Returns the site search category query parameters for the site. * * @return string * @throws Exception if data for the site cannot be found. */ public function getSearchCategoryParameters() { return $this->get('sitesearch_category_parameters'); } /** * Returns whether Site Search Tracking is enabled for the site. * * @return bool * @throws Exception if data for the site cannot be found. */ public function isSiteSearchEnabled() { return $this->get('sitesearch') == 1; } /** * Returns the user that created this site. * * @return string|null If null, the site was created before the creation user was tracked. */ public function getCreatorLogin() { return $this->get('creator_login'); } /** * Checks the given string for valid site IDs and returns them as an array. * * @param string|array $ids Comma separated idSite list, eg, `'1,2,3,4'` or an array of IDs, eg, * `array(1, 2, 3, 4)`. * @param bool|string $_restrictSitesToLogin Implementation detail. Used only when running as a scheduled task. * @return array An array of valid, unique integers. */ public static function getIdSitesFromIdSitesString($ids, $_restrictSitesToLogin = false) { if ($ids === 'all') { return API::getInstance()->getSitesIdWithAtLeastViewAccess($_restrictSitesToLogin); } if (is_bool($ids)) { return array(); } if (!is_array($ids)) { $ids = explode(',', $ids); } $validIds = array(); foreach ($ids as $id) { $id = trim($id); if (!empty($id) && is_numeric($id) && $id > 0) { $validIds[] = $id; } } $validIds = array_filter($validIds); $validIds = array_unique($validIds); return $validIds; } /** * Clears the site data cache. * * See also {@link setSites()} and {@link setSitesFromArray()}. */ public static function clearCache() { self::$infoSites = array(); } /** * Clears the site data cache. * * See also {@link setSites()} and {@link setSitesFromArray()}. */ public static function clearCacheForSite($idSite) { $idSite = (int)$idSite; unset(self::$infoSites[$idSite]); } /** * Utility function. Returns the value of the specified field for the * site with the specified ID. * * @param int $idsite The ID of the site whose data is being accessed. * @param string $field The name of the field to get. * @return string */ protected static function getFor($idsite, $field) { if (!isset(self::$infoSites[$idsite])) { $site = API::getInstance()->getSiteFromId($idsite); self::setSiteFromArray($idsite, $site); } return self::$infoSites[$idsite][$field]; } /** * Returns all websites pre-cached * * @ignore */ public static function getSites() { return self::$infoSites; } /** * @ignore */ public static function getSite($idsite) { $idsite = (int)$idsite; if (!isset(self::$infoSites[$idsite])) { $site = API::getInstance()->getSiteFromId($idsite); self::setSiteFromArray($idsite, $site); } return self::$infoSites[$idsite]; } /** * Returns the name of the site with the specified ID. * * @param int $idsite The site ID. * @return string */ public static function getNameFor($idsite) { return self::getFor($idsite, 'name'); } /** * Returns the group of the site with the specified ID. * * @param int $idsite The site ID. * @return string */ public static function getGroupFor($idsite) { return self::getFor($idsite, 'group'); } /** * Returns the timezone of the site with the specified ID. * * @param int $idsite The site ID. * @return string */ public static function getTimezoneFor($idsite) { return self::getFor($idsite, 'timezone'); } /** * Returns the type of the site with the specified ID. * * @param $idsite * @return string */ public static function getTypeFor($idsite) { return self::getFor($idsite, 'type'); } /** * Returns the creation date of the site with the specified ID. * * @param int $idsite The site ID. * @return string */ public static function getCreationDateFor($idsite) { return self::getFor($idsite, 'ts_created'); } /** * Returns the url for the site with the specified ID. * * @param int $idsite The site ID. * @return string */ public static function getMainUrlFor($idsite) { return self::getFor($idsite, 'main_url'); } /** * Returns whether the site with the specified ID is ecommerce enabled or not. * * @param int $idsite The site ID. * @return string */ public static function isEcommerceEnabledFor($idsite) { return self::getFor($idsite, 'ecommerce') == 1; } /** * Returns whether the site with the specified ID is Site Search enabled. * * @param int $idsite The site ID. * @return string */ public static function isSiteSearchEnabledFor($idsite) { return self::getFor($idsite, 'sitesearch') == 1; } /** * Returns the currency of the site with the specified ID. * * @param int $idsite The site ID. * @return string */ public static function getCurrencyFor($idsite) { return self::getFor($idsite, 'currency'); } /** * Returns the currency of the site with the specified ID. * * @param int $idsite The site ID. * @return string */ public static function getCurrencySymbolFor($idsite) { $currencyCode = self::getCurrencyFor($idsite); $key = 'Intl_CurrencySymbol_' . $currencyCode; $symbol = Piwik::translate($key); if ($key === $symbol) { return $currencyCode; } return $symbol; } /** * Returns the excluded IP addresses of the site with the specified ID. * * @param int $idsite The site ID. * @return string */ public static function getExcludedIpsFor($idsite) { return self::getFor($idsite, 'excluded_ips'); } /** * Returns the excluded query parameters for the site with the specified ID. * * @param int $idsite The site ID. * @return string */ public static function getExcludedQueryParametersFor($idsite) { return self::getFor($idsite, 'excluded_parameters'); } /** * Returns the user that created this site. * * @param int $idsite The site ID. * @return string|null If null, the site was created before the creation user was tracked. */ public static function getCreatorLoginFor($idsite) { return self::getFor($idsite, 'creator_login'); } }