','
','
'), '', $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 );
$site = Zend_Registry::get('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');
$result = $db->fetchAll("SELECT url
FROM ".Piwik::prefixTable("site_url"). "
WHERE idsite = ?", $idsite);
$urls = array();
foreach($result as $url)
{
$urls[] = $url['url'];
}
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();
$result = Piwik_FetchAll("SELECT idsite FROM ".Piwik::prefixTable('site'));
$idSites = array();
foreach($result as $idSite)
{
$idSites[] = $idSite['idsite'];
}
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()
{
return Zend_Registry::get('access')->getSitesIdWithViewAccess();
}
/**
* 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()
{
return Zend_Registry::get('access')->getSitesIdWithAtLeastViewAccess();
}
/**
* 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')->reloadAccess();
self::postUpdateWebsite($idSite);
return (int)$idSite;
}
private static function postUpdateWebsite($idSite)
{
Piwik_Common::regenerateCacheWebsiteAttributes($idSite);
}
/**
* Delete a website from the database, given its Id.
*
* Requires Super User access.
*
* @param int $idSite
*/
static public function deleteSite( $idSite )
{
Piwik::checkUserIsSuperUser();
$idSites = Piwik_SitesManager_API::getAllSitesId();
if(!in_array($idSite, $idSites))
{
throw new Exception("website id = $idSite not found");
}
$nbSites = count($idSites);
if($nbSites == 1)
{
throw new Exception(Piwik_TranslateException("SitesManager_ExceptionDeleteSite"));
}
$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);
Piwik_Common::deleteCacheWebsiteAttributes($idSite);
}
/**
* 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(Piwik_TranslateException("SitesManager_ExceptionNoUrl"));
}
}
/**
* 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);
self::postUpdateWebsite($idSite);
return count($toInsert);
}
/**
* 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"
);
// we now update the main + alias URLs
self::deleteSiteAliasUrls($idSite);
if(count($urls) > 1)
{
$insertedUrls = self::addSiteAliasUrls($idSite, array_slice($urls,1));
}
self::postUpdateWebsite($idSite);
}
/**
* 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 Piwik_Common::isLookLikeUrl($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(Piwik_TranslateException("SitesManager_ExceptionEmptyName"));
}
}
/**
* 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(sprintf(Piwik_TranslateException("SitesManager_ExceptionInvalidUrl"),$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;
}
}