','
','
'), '', $htmlEncoded); return html_entity_decode($htmlEncoded); } /** * Returns the website information : name, main_url * * @exception if the site ID doesn't exist or the user doesn't have access to it * @return array */ static public function getSiteFromId( $idSite ) { Piwik::checkUserHasViewAccess( $idSite ); $db = Zend_Registry::get('db'); $site = $db->fetchRow("SELECT * FROM ".Piwik::prefixTable("site")." WHERE idsite = ?", $idSite); return $site; } /** * Returns the list of alias URLs registered for the given idSite. * The website ID must be valid when calling this method! * * @return array list of alias URLs */ static private function getAliasSiteUrlsFromId( $idsite ) { $db = Zend_Registry::get('db'); $urls = $db->fetchCol("SELECT url FROM ".Piwik::prefixTable("site_url"). " WHERE idsite = ?", $idsite); return $urls; } /** * Returns the list of all URLs registered for the given idSite (main_url + alias URLs). * * @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 ) { Piwik::checkUserHasViewAccess($idSite); $site = self::getSiteFromId($idSite); $urls = self::getAliasSiteUrlsFromId($idSite); return array_merge(array($site['main_url']), $urls); } /** * Returns the list of all the websites ID registered * * @return array the list of websites ID */ static public function getAllSitesId() { Piwik::checkUserIsSuperUser(); $db = Zend_Registry::get('db'); $idSites = $db->fetchCol("SELECT idsite FROM ".Piwik::prefixTable('site')); return $idSites; } /** * Returns the list of websites with the 'admin' access for the current user. * For the superUser it returns all the websites in the database. * * @return array for each site, an array of information (idsite, name, main_url, etc.) */ static public function getSitesWithAdminAccess() { $sitesId = self::getSitesIdWithAdminAccess(); return self::getSitesFromIds($sitesId); } /** * Returns the list of websites with the 'view' access for the current user. * For the superUser it doesn't return any result because the superUser has admin access on all the websites (use getSitesWithAtLeastViewAccess() instead). * * @return array for each site, an array of information (idsite, name, main_url, etc.) */ static public function getSitesWithViewAccess() { $sitesId = self::getSitesIdWithViewAccess(); return self::getSitesFromIds($sitesId); } /** * Returns the list of websites with the 'view' or 'admin' access for the current user. * For the superUser it returns all the websites in the database. * * @return array array for each site, an array of information (idsite, name, main_url, etc.) */ static public function getSitesWithAtLeastViewAccess() { $sitesId = self::getSitesIdWithAtLeastViewAccess(); return self::getSitesFromIds($sitesId); } /** * Returns the list of websites ID with the 'admin' access for the current user. * For the superUser it returns all the websites in the database. * * @return array list of websites ID */ static public function getSitesIdWithAdminAccess() { $sitesId = Zend_Registry::get('access')->getSitesIdWithAdminAccess(); return $sitesId; } /** * Returns the list of websites ID with the 'view' access for the current user. * For the superUser it doesn't return any result because the superUser has admin access on all the websites (use getSitesIdWithAtLeastViewAccess() instead). * * @return array list of websites ID */ static public function getSitesIdWithViewAccess() { $sitesId = Zend_Registry::get('access')->getSitesIdWithViewAccess(); return $sitesId; } /** * Returns the list of websites ID with the 'view' or 'admin' access for the current user. * For the superUser it returns all the websites in the database. * * @return array list of websites ID */ static public function getSitesIdWithAtLeastViewAccess() { $sitesId = Zend_Registry::get('access')->getSitesIdWithAtLeastViewAccess(); return $sitesId; } /** * Returns the list of websites from the ID array in parameters. * The user access is not checked in this method so the ID have to be accessible by the user! * * @param array list of website ID */ static private function getSitesFromIds( $idSites ) { if(count($idSites) === 0) { return array(); } $db = Zend_Registry::get('db'); $sites = $db->fetchAll("SELECT * FROM ".Piwik::prefixTable("site")." WHERE idsite IN (".implode(", ", $idSites).") ORDER BY idsite ASC"); return $sites; } /** * Add a website in the database. * * 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. * * @return int the website ID created */ static public function addSite( $siteName, $urls ) { Piwik::checkUserIsSuperUser(); self::checkName($siteName); $urls = self::cleanParameterUrls($urls); self::checkUrls($urls); self::checkAtLeastOneUrl($urls); $db = Zend_Registry::get('db'); $url = $urls[0]; $urls = array_slice($urls, 1); $db->insert(Piwik::prefixTable("site"), array( 'name' => $siteName, 'main_url' => $url, ) ); $idSite = $db->lastInsertId(); self::insertSiteUrls($idSite, $urls); // we reload the access list which doesn't yet take in consideration this new website Zend_Registry::get('access')->loadAccess(); return (int)$idSite; } /** * Delete a website from the database, given its Id. * * Requires Super User access. * * @param int $idSite */ static public function deleteSite( $idSite ) { Piwik::checkUserIsSuperUser(); $nbSites = count(Piwik_SitesManager_API::getAllSitesId()); if($nbSites == 1) { throw new Exception("It is not possible to delete this website as it is the only registered website. Add a new website first, then delete this one."); } $db = Zend_Registry::get('db'); $db->query("DELETE FROM ".Piwik::prefixTable("site")." WHERE idsite = ?", $idSite); $db->query("DELETE FROM ".Piwik::prefixTable("site_url")." WHERE idsite = ?", $idSite); $db->query("DELETE FROM ".Piwik::prefixTable("access")." WHERE idsite = ?", $idSite); // TODO we should also delete all the data relative to this website... // post an event here that will be catched by the core and plugins to clean the data } /** * Checks that the array has at least one element * * @exception if the parameter is not an array or if array empty */ static private function checkAtLeastOneUrl( $urls ) { if(!is_array($urls) || count($urls) == 0) { throw new Exception("You must specify at least one URL for the site."); } } /** * Add a list of alias Urls to the given idSite * * If some URLs given in parameter are already recorded as alias URLs for this website, * they won't be duplicated. The 'main_url' of the website won't be affected by this method. * * @return int the number of inserted URLs */ static public function addSiteAliasUrls( $idSite, $urls) { Piwik::checkUserHasAdminAccess( $idSite ); $urls = self::cleanParameterUrls($urls); self::checkUrls($urls); $urlsInit = self::getSiteUrlsFromId($idSite); $toInsert = array_diff($urls, $urlsInit); self::insertSiteUrls($idSite, $toInsert); return count($toInsert); } /** * Replaces the list of URLs (main_url and alias URLs) for the given idSite. * * @param int the website ID * @param array the array of URLs; The first URL is the main_url and is mandatory. * * @exception if the website ID doesn't exist or the user doesn't have access to it * @exception if there is no URL * @exception if any of the URLs has not a correct format * * @return int the number of inserted URLs */ static public function replaceSiteUrls( $idSite, $urls) { Piwik::checkUserHasAdminAccess($idSite); $urls = self::cleanParameterUrls($urls); self::checkUrls($urls); self::checkAtLeastOneUrl($urls); $site = self::getSiteFromId($idSite); $site['main_url'] = $urls[0]; self::updateSite($site['idsite'], $site['name'], $site['main_url']); $urls = array_slice($urls,1); self::deleteSiteAliasUrls($idSite); $insertedUrls = self::addSiteAliasUrls($idSite, $urls); // we have updated the main_url at least, and maybe some alias URLs return 1 + $insertedUrls; } /** * 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. * * @param int website ID defining the website to edit * @param string website name * @param string|array the website URLs * * @exception if any of the parameter is not correct * * @return bool true on success */ static public function updateSite( $idSite, $siteName, $urls = null) { Piwik::checkUserHasAdminAccess($idSite); self::checkName($siteName); // SQL fields to update $bind = array(); if(!is_null($urls)) { $urls = self::cleanParameterUrls($urls); self::checkUrls($urls); self::checkAtLeastOneUrl($urls); $url = $urls[0]; $bind['main_url'] = $url; } $bind['name'] = $siteName; $db = Zend_Registry::get('db'); $db->update(Piwik::prefixTable("site"), $bind, "idsite = $idSite" ); // if there are more than 1 url for this website we need to set also the alias URLs // we use the replaceSiteUrls function ; it is not great because it will update the // same row we have just updated... but it is better than duplicating the logic if(count($urls) > 1) { self::replaceSiteUrls($idSite, $urls); } } /** * Insert the list of alias URLs for the website. * The URLs must not exist already for this website! */ static 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( 'idsite' => $idSite, 'url' => $url ) ); } } } /** * Delete all the alias URLs for the given idSite. */ static private function deleteSiteAliasUrls($idsite) { $db = Zend_Registry::get('db'); $db->query("DELETE FROM ".Piwik::prefixTable("site_url") ." WHERE idsite = ?", $idsite); } /** * Remove the final slash in the URLs if found * * @return string the URL without the trailing slash */ static private function removeTrailingSlash($url) { // if there is a final slash, we take the URL without this slash (expected URL format) if(strlen($url) > 5 && $url[strlen($url)-1] == '/') { $url = substr($url,0,strlen($url)-1); } return $url; } /** * Tests if the URL is a valid URL * * @return bool */ static private function isValidUrl( $url ) { return ereg('^http[s]?://([A-Za-z0-9\/_.-])*$', $url); } /** * Check that the website name has a correct format. * * @exception if the website name is empty */ static private function checkName($siteName) { if(empty($siteName)) { throw new Exception("The site name can't be empty."); } } /** * Check that the array of URLs are valid URLs * * @exception if any of the urls is not valid * @param array */ static private function checkUrls($urls) { foreach($urls as $url) { if(!self::isValidUrl($url)) { throw new Exception("The url '$url' is not a valid URL."); } } } /** * Clean the parameter URLs: * - if the parameter is a string make it an array * - remove the trailing slashes if found * * @param string|array urls * @return array the array of cleaned URLs */ static private function cleanParameterUrls( $urls ) { if(!is_array($urls)) { $urls = array($urls); } foreach($urls as &$url) { $url = self::removeTrailingSlash($url); } $urls = array_unique($urls); return $urls; } }