Source for file Site.php
Documentation is available at Site.php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | MCMS: a PHP Content Management System for creating accessible sites. |
// | Copyright (C) 2005 Silvio Moioli |
// | This program is free software; you can redistribute it and/or modify |
// | it under the terms of the GNU General Public License as published by |
// | the Free Software Foundation; either version 2 of the License, or |
// | (at your option) any later version. |
// | This program is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// | GNU General Public License for more details. |
// | You should have received a copy of the GNU General Public License |
// | along with this program; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
// +----------------------------------------------------------------------+
// | Authors: Silvio Moioli <silvio at moioli dot net> www.moioli.net |
// +----------------------------------------------------------------------+
/** Carica la classe base di MCMS per l'interfacciamento al Database */
require_once $_SERVER["DOCUMENT_ROOT"]. "/admin/lib/model/Engine.php";
* Carica la classe per le notizie (News)
require_once $_SERVER["DOCUMENT_ROOT"]. "/admin/lib/model/News.php";
* Carica la classe per gli autori (Author)
require_once $_SERVER["DOCUMENT_ROOT"]. "/admin/lib/model/Author.php";
* Carica la classe per gli articoli (Article)
require_once $_SERVER["DOCUMENT_ROOT"]. "/admin/lib/model/Article.php";
* Carica la classe per le categorie di articoli (Category)
require_once $_SERVER["DOCUMENT_ROOT"]. "/admin/lib/model/Category.php";
* Carica la classe per i componenti (Component)
require_once $_SERVER["DOCUMENT_ROOT"]. "/admin/lib/model/Component.php";
* Carica la classe per le homepages (Homepages)
require_once $_SERVER["DOCUMENT_ROOT"]. "/admin/lib/model/Homepage.php";
* Interfaccia per la gestione dei siti gestiti da MCMS.
* Permette di gestire un sito con tutto il suo contenuto
* informativo in maniera trasparente rispetto al Database
* @author Silvio Moioli <silvio at moioli dot net>
* @var int $ID ID del database sottostante per questo sito.
* @var Engine il motore del database sottostante per questo sito.
* Costruttore "di lettura" (costruisce un sito da un record del
* database già esistente).
* Nota: non può essere creato una nuovo sito da qui, ma solo dal Factory
* Method nella classe Engine.
* Per i costruttori "di scrittura", quindi, vedere la classe Engine
* @param int $ID l'ID del database sottostante
* @param Engine $engine un motore per interagire con il database
* @return mixed la pagina se la costruzione è andata a buon fine, altrimenti
function Site($ID, $engine)
if (settype($ID, "integer") && $ID> 0){
* Ritorna l'ID di questo sito.
* Solo le classi del package MCMS potrebbero avere bisogno di
* questo parametro, per le interrogazioni al Database.
* @return int l'ID del database sottostante
* Ritorna il motore sottostante a questo sito.
* Solo le classi del package MCMS potrebbero avere bisogno di
* questo parametro, per le interrogazioni al Database.
* @return int l'ID del database sottostante
* Ritorna le notizie memorizzate in questo Database.
* Ritorna un array contenente gli oggetti corrispondenti a tutte le
* notizie contenute in questo Database per questo sito.
* @param Category la categoria delle notizie da ritornare o NULL
* per tutte indistintamente.
* @return mixed un array contenente le notizie in questo Database se
* l'operazione è andata a buon fine, altrimenti un DB_ERROR.
$thisDB = $thisEngine->getDB();
$siteID = $thisDB->escapeSimple($this->getID());
//Versione con subqueries (mysql 4.1)
/*$ids = $thisDB->getCol(
"SELECT `id pagina` FROM `pagine` WHERE `id pagina` IN (SELECT ".
"`id pagina` FROM `notizie`) AND `id sito`='$siteID' ORDER BY ".
"`data pagina` DESC;");*/
//Versione compatibile Mysql 3
"SELECT `pagine`.`id pagina` FROM `pagine`,`notizie`".
"WHERE `pagine`.`id pagina`=`notizie`.`id pagina` AND".
"`pagine`.`id sito`='$siteID' ORDER BY ".
"`pagine`.`data pagina` DESC;");
$news[] = new News($i, $thisEngine);
* Aggiunge una notizia alle notizie memorizzate in questo Database
* Crea una nuova notizia e la memorizza nel Database sottostante.
* Questo è l'unico modo per creare un notizia!
* @param Author $author l'autore della notizia (di questo sito)
* @param string $contents il contenuto HTML di questa pagina.
* @param string $title il titolo di questa pagina.
* @param string $keywords l'elenco separato da virgole e spazi
* (per esempio "case, amici") delle parole chiave della pagina.
* @param string $source l'URL della fonte principale di questa notizia o NULL
* @param array $correlatedArticles un array di Article correlati a
* @return mixed la notizia se l'operazione è andata a buon fine, altrimenti
function addNews($author, $contents, $title, $keywords, $source,
//Creo la pagina associata
$newPage = $this->addPage($author, $contents, $title,
$thisDB = $thisEngine->getDB();
$source = $thisDB->escapeSimple($source);
$pageID = $thisDB->escapeSimple($newPage->getID());
//Crea e immette il nuovo record per la notizia
$sql = "INSERT INTO `notizie` ( `id pagina` , `url fonte notizia` ) ".
" VALUES ( '$pageID', '$source' );";
$newNotizia = new News($pageID, $thisEngine);
//Crea e immette i nuovi record per gli articoli correlati
foreach ($correlatedArticles as $i) {
$newNotizia->addCorrelatedArticle($i);
* Cancella una delle notizie tra quelle memorizzate in questo Database.
* Cancella una notizia memorizzata nel Database sottostante, incluso tutto
* @param News $news la notizia da cancellare.
* @return mixed true se l'operazione è andata a buon fine, altrimenti
//Cancella le correlazioni che coinvolgono questa
$news->dropCorrelatedArticles();
$thisDB = $thisEngine->getDB();
$pageID = $thisDB->escapeSimple($news->getID());
//Cancella la notizia stessa
$sql = "DELETE FROM `notizie` WHERE `id pagina` ='$pageID';";
//Cancella la pagina associata
$page = new Page($pageID, $thisEngine);
* Cancella tutte le notizie di questo sito.
* Cancella tutte le notizie memorizzate nel Database sottostante,
* per questo sito, incluso tutto il suo contenuto.
* @return mixed true se l'operazione è andata a buon fine, altrimenti
/* $thisEngine = $this->getEngine();
$thisDB = $thisEngine->getDB();
$thisEngine = $this->getEngine();
$siteID = $this->getID();
$thisDB = $thisEngine->getDB();
$newsID = $news->getID();
//Cancella le correlazioni fra notizie e articoli
$sql = "DELETE FROM `articoli correlati notizia` WHERE `id notizia`".
"IN (SELECT `id pagina` FROM `pagine` WHERE".
//Cancella i record delle notizie
$sql = "DELETE FROM `notizie` WHERE `id pagina` IN ".
"(SELECT `id pagina` FROM `pagine` WHERE `id sito`='$siteID');";
foreach ($notizie as $i) {
//#$thisDB->disconnect();
* Ritorna gli articoli memorizzati in questo Database.
* Ritorna un array contenente gli oggetti corrispondenti a tutti gli
* articoli contenuti in questo Database per questo sito.
* @return mixed un array contenente gli articoli in questo Database se
* l'operazione è andata a buon fine, altrimenti un DB_ERROR
$thisDB = $thisEngine->getDB();
$siteID = $thisDB->escapeSimple($this->getID());
//Versione con subqueries (Mysql 4.1)
/*$ids = $thisDB->getCol(
"SELECT `id pagina` FROM `pagine` WHERE `id pagina` IN (SELECT ".
"`id pagina` FROM `articoli`) AND `id sito`='$siteID' ORDER BY ".
"`data pagina` DESC;");*/
//Versione compatibile Mysql 3
"SELECT `pagine`.`id pagina` FROM `pagine`,`articoli`".
"WHERE `pagine`.`id pagina`=`articoli`.`id pagina` AND ".
"`pagine`.`id sito`='$siteID' ORDER BY ".
"`pagine`.`data pagina` DESC;");
$articles[] = new Article($i, $thisEngine);
* Aggiunge un articolo agli articoli memorizzati in questo Database
* Crea un nuovo articolo e lo memorizza nel Database sottostante.
* Questo è l'unico modo per creare un articolo!
* @param Author $author l'autore dell'articolo.
* @param string $contents il contenuto HTML di questa pagina.
* @param string $title il titolo di questa pagina.
* @param string $keywords l'elenco separato da virgole e spazi
* (per esempio "case, amici") delle parole chiave della pagina.
* @param Category $category la categoria di appartenenza di questo
* @param string $description una breve descrizione dei contenuti
* @param array $correlatedArticles un array di Article correlati a
* @return mixed l'articolo se l'operazione è andata a buon fine,
function addArticle($author, $contents, $title, $keywords, $category,
$description, $correlatedArticles)
//Creo la pagina associata
$newPage = $this->addPage($author, $contents, $title,
$thisDB = $thisEngine->getDB();
$description = $thisDB->escapeSimple($description);
$pageID = $thisDB->escapeSimple($newPage->getID());
$categoryID = $thisDB->escapeSimple($category->getID());
//Crea e immette il nuovo record per l'articolo
$sql = "INSERT INTO `articoli` ( `id pagina` , `id categoria` ,".
"`descrizione articolo` )".
"VALUES ( '$pageID', '$categoryID', '$description' );";
//Crea il nuovo oggetto corrispondente a questo articolo
$newArticle = new Article($pageID, $thisEngine);
//Lo correlo agli articoli specificati
foreach ($correlatedArticles as $i) {
$newArticle->addCorrelatedArticle($i);
* Cancella uno degli articoli tra quelli memorizzati in questo Database.
* Cancella un articolo memorizzato nel Database sottostante, incluso tutto
* @param Article $article l'articolo da cancellare.
* @return mixed true se l'operazione è andata a buon fine, altrimenti
//Cancella le correlazioni che coinvolgono questo
$article->dropCorrelatedArticles();
$category = $article->getCategory();
//Cancella l'articolo stesso
$thisDB = $thisEngine->getDB();
$pageID = $thisDB->escapeSimple($article->getID());
$categoryID = $thisDB->escapeSimple($category->getID());
$sql = "DELETE FROM `articoli` WHERE `id pagina` ='$pageID';";
//Cancella la pagina associata
$page = new Page($pageID, $thisEngine);
* Cancella tutti gli articoli di questo sito.
* Cancella tutti gli articoli memorizzati nel Database sottostante
* per questo sito, incluso tutto il loro contenuto.
* @return mixed true se l'operazione è andata a buon fine, altrimenti
/* $thisEngine = $this->getEngine();
$thisDB = $thisEngine->getDB();
$thisEngine = $this->getEngine();
$siteID = $this->getID();
$thisDB = $thisEngine->getDB();
//Cancella le correlazioni con altri articoli
$sql = "DELETE FROM `articoli correlati articolo` WHERE `id articolo`".
"IN (SELECT `id pagina` FROM `pagine` WHERE".
$sql = "DELETE FROM `articoli correlati articolo` WHERE `id articolo ".
"correlato` IN (SELECT `id pagina` FROM `pagine` WHERE".
//Cancella le correlazioni fra notizie e articoli
$sql = "DELETE FROM `articoli correlati notizia` WHERE `id articolo`".
"IN (SELECT `id pagina` FROM `pagine` WHERE".
//Cancella i record degli articoli
$sql = "DELETE FROM `articoli` WHERE `id pagina` IN ".
"(SELECT `id pagina` FROM `pagine` WHERE `id sito`='$siteID');";
foreach ($articles as $i) {
// #$thisDB->disconnect();
* Ritorna tutte le categorie di questo sito.
* Ritorna un array contenente tutte le categorie del sito.
* @return mixed un array contenente le categorie (Category) se
* l'operazione è andata a buon fine, altrimenti un DB_ERROR
$thisDB = $thisEngine->getDB();
$siteID = $thisDB->escapeSimple($this->getID());
$ids = $thisDB->getCol("SELECT `id categoria` FROM `categorie`".
" WHERE (`id sito`='$siteID');");
$categories[] = new Category($i, $thisEngine);
* Ritorna il numero di categorie di questo sito.
* @return int il numero di categorie
$thisDB = $thisEngine->getDB();
$siteID = $thisDB->escapeSimple($this->getID());
$result = $thisDB->getOne("SELECT COUNT(`id categoria`) FROM `categorie`".
" WHERE (`id sito`='$siteID');");
* Aggiunge una categoria alle categorie memorizzate in questo Database
* Crea una nuova categoria e la memorizza nel Database sottostante.
* Questo è l'unico modo per creare un categoria!
* @param string $name il nome della categoria
* @param string $description breve descrizione del tipo di articoli
* @return mixed la categoria se l'operazione è andata a buon fine,
$thisDB = $thisEngine->getDB();
$name = $thisDB->escapeSimple($name);
$description = $thisDB->escapeSimple($description);
$siteID = $thisDB->escapeSimple($this->getID());
$newCategoryID = $thisDB->nextID("ID categoria");
$sql = "INSERT INTO `categorie` ( `id categoria` , `nome categoria`,".
"`descrizione categoria`, `id sito` ) VALUES ".
"('$newCategoryID', '$name', '$description','$siteID');";
return new Category($newCategoryID, $thisEngine);
* Cancella una delle categorie tra quelle memorizzate in questo Database.
* Cancella una categoria memorizzata nel Database sottostante, inclusi tutti
* gli articoli in essa contenuti.
* @param Category $category la categoria da cancellare.
* @return mixed true se l'operazione è andata a buon fine, altrimenti
$thisDB = $thisEngine->getDB();
$categoryID = $thisDB->escapeSimple($category->getID());
$sql = "DELETE FROM `categorie` WHERE `id categoria` ='$categoryID'".
* Ritorna i componenti utilizzati in questo sito.
* Ritorna un array contenente gli oggetti corrispondenti a tutti i
* componenti utilizzati in questo sito.
* @return mixed un array contenente gli componenti idi questo sito se
* l'operazione è andata a buon fine, altrimenti un DB_ERROR
$thisDB = $thisEngine->getDB();
$siteID = $thisDB->escapeSimple($this->getID());
$names = $thisDB->getCol("SELECT `nome componente` FROM `componenti siti`".
" WHERE `id sito` = '$siteID';");
require_once $_SERVER["DOCUMENT_ROOT"]. "/admin/lib/plugins/$i.php";
//Costruisco il componente
$components[] = new $i();
* Sostituisce i componenti attivati in questo sito con quelli
* specificati nell'array passato.
* @param array $components i componenti aggiuntivi.
* @return mixed true se l'operazione è andata a buon fine,
$thisDB = $thisEngine->getDB();
$siteID = $thisDB->escapeSimple($this->getID());
//Cancella i componenti preesistenti
$thisDB->query("DELETE FROM `componenti siti` WHERE ".
"`id sito` = '$siteID';");
//Immette i nuovi componenti
foreach ($components as $i) {
$componentName = $thisDB->escapeSimple(get_class($i));
$thisDB->query("INSERT INTO `componenti siti` (`nome componente`,".
"`id sito`) VALUES ('$componentName', '$siteID');");
* Getter per il campo URL dalla tabella Sito.
* Ritorna l'URL di accesso alla homepage del sito.
* @return mixed l'URL del sito (string) se l'operazione è andata a
* buon fine, altrimenti un DB_ERROR
$thisDB = $thisEngine->getDB();
$siteID = $thisDB->escapeSimple($this->getID());
$url = $thisDB->getOne("SELECT `url sito` FROM `siti` WHERE ".
"`id sito` = '$siteID' LIMIT 1;");
* Ritorna una versione "corta" dell'URL del sito.
* Ritorna una versione "corta" dell'URL del sito, rimuovendo il protocollo
* ("http://"), l'host www se presente e tutto ciò che segue la prima barra
* rovesciata, se presente. Ad esempio dall'URL
* "http://www.moioli.net/index.html" si ottiene "moioli.net".
* @return mixed l'URL corta del sito (string) se l'operazione è andata a
* buon fine, un DB_ERROR se c'è un problema nel DB o l'URL completo se è
* impossibile accorciarlo ulteriormente
preg_match("#http(?:s)?://(?:www\.)?([^/]+)#", $longURL, $matches);
//Errore in agguato qui, ma stiamo sulla difensiva
if ($matches[1]== null || $matches[1]== "") {
print "Site name invalid: $longURL";
* Setter per il campo URL dalla tabella Sito.
* Cambia l'URL di accesso alla homepage del sito.
* @param string $URL il nuovo URL del sito
* @return mixed true se l'operazione è andata a buon fine, altrimenti
$thisDB = $thisEngine->getDB();
$siteID = $thisDB->escapeSimple($this->getID());
$URL = $thisDB->escapeSimple($URL);
$thisDB->query("UPDATE `siti` SET `url sito` = '$URL'".
"WHERE `id sito` = '$siteID';");
* Getter per il campo Homepage dalla tabella Sito.
* Ritorna l'homepage del sito.
* @return mixed l'homepage del sito (Homepage) se l'operazione è andata
* a buon fine, altrimenti un DB_ERROR
$thisDB = $thisEngine->getDB();
$siteID = $thisDB->escapeSimple($this->getID());
//Versione con subqueries (Mysql 4.1)
/*$sql = "SELECT `id pagina` FROM `homepages` WHERE `id pagina` IN (".
"SELECT `id pagina` FROM `pagine` WHERE `id sito` = '$siteID');";*/
//Versione compatibile Mysql 3
$sql = "SELECT `pagine`.`id pagina` FROM `pagine`,`homepages`".
"WHERE `pagine`.`id pagina`=`homepages`.`id pagina` AND".
"`pagine`.`id sito`='$siteID' LIMIT 1";
$hpID = $thisDB->getOne($sql);
return new Homepage($hpID, $thisEngine);
* Setter per il campo Homepage dalla tabella Sito.
* Cambia l'homepage del sito.
* @param Homepage $homepage la nuova homepage del sito
* @return mixed true se l'operazione è andata a buon fine, altrimenti
// function setHomepage($homepage)
* Aggiunge una pagina alle quelle memorizzate in questo Database
* Crea una nuova pagina e la memorizza nel Database sottostante.
* Questo è l'unico modo per creare un pagina!
* Questo metodo dovrebbe essere invocato SOLO dalle classi interne
* di MCMS, per la costruzione di Articoli, Notizie e Homepages.
* @param Author $author l'autore della nuova pagina
* @param string $contents il contenuto HTML della pagina
* @param string $title il titolo della pagina
* @param string $keywords l'elenco separato da virgole e spazi
* (per esempio "case, amici") delle parole chiave della pagina.
* @return mixed la pagina se l'operazione è andata a buon fine,
function addPage($author, $contents, $title, $keywords)
$thisDB = $thisEngine->getDB();
$pageID = $thisDB->nextID("id pagina");
$siteID = $thisDB->escapeSimple($this->getID());
$authorID = $thisDB->escapeSimple($author->getID());
$contents = $thisDB->escapeSimple($contents);
$title = $thisDB->escapeSimple($title);
$keywords = $thisDB->escapeSimple($keywords);
//Inserisce la nuova pagina
$sql = "INSERT INTO `pagine` ( `id pagina` , `id sito` , `id autore`,".
"`contenuto pagina` , `data pagina` , `titolo pagina` ,".
"`parole chiave pagina` )".
"VALUES ( '$pageID', '$siteID', '$authorID', '$contents',".
"'$today', '$title', '$keywords');";
return new Page($pageID, $thisEngine);
* Cancella una delle pagine memorizzate in questo Database.
* Cancella una pagina memorizzata nel Database sottostante, con tutto il
* suo contenuto informativo. ATTENZIONE: questo NON elimina l'articolo,
* la notizia o l'homepage associata!
* @param Page $page la pagina da cancellare.
* @return mixed true se l'operazione è andata a buon fine, altrimenti
$thisDB = $thisEngine->getDB();
$pageID = $thisDB->escapeSimple($page->getID());
$sql = "DELETE FROM `pagine` WHERE `id pagina` ='$pageID';";
* Cancella le pagine di questo sito.
* Cancella tutte le pagine memorizzate per questo sito, inclusi articoli,
* notizie e homepage. Questo metodo dovrebbe essere chiamato solo da
* un metodo che cancella anche questo sito.
* @return mixed true se l'operazione è andata a buon fine, altrimenti
//Cancella articoli e notizie
$thisDB = $thisEngine->getDB();
$siteID = $thisDB->escapeSimple($this->getID());
//$sql = "DELETE FROM `homepages` WHERE `id pagina` IN ".
// "(SELECT `id pagina` FROM `pagine` WHERE `id sito`='$siteID');";
//$sql = "DELETE `homepages` FROM `homepages`,`pagine` WHERE ".
// "`homepages`.`id pagina`=`pagine`.`id pagina` AND ".
// "`pagine`.`id sito`='$siteID';";
$homeID = $thisDB->getOne("SELECT `homepages`.`id pagina` ".
"FROM `homepages`, `pagine`".
"WHERE `homepages`.`id pagina`=`pagine`.`id pagina` AND".
"`pagine`.`id sito`='$siteID' LIMIT 1");
$thisDB->query("DELETE FROM `homepages` WHERE `id pagina`='$homeID'");
//Cancella le pagine associate
$sql = "DELETE FROM `pagine` WHERE `id sito`='$siteID';";
* Ritorna l'autore fondatore di questo sito.
* Ritorna un oggetto corrispondente all'autore principale di questo sito
* Permette di utilizzare il database in modo trasparente (è come se si
* usassero normali attributi di una classe).
* @return Author l'autore a cui questa pagina appartiene.
$thisDB = $thisEngine->getDB();
$thisID = $thisDB->escapeSimple($this->getID());
JOIN `pagine` ON `siti`.`id sito`=`pagine`.`id sito`
JOIN `homepages` ON `homepages`.`id pagina`=`pagine`.`id pagina`
WHERE `siti`.`id sito`='$thisID' LIMIT 1;");
return new Author($hpID, $thisEngine);
* Ritorna gli autori di questo sito.
* Ritorna un array contenente gli autori di questo
* sito contenuti in questo Database.
* @return mixed un array contenente i siti in questo Database se
* l'operazione è andata a buon fine, altrimenti un DB_ERROR
$thisDB = $thisEngine->getDB();
$siteID = $thisDB->escapeSimple($this->getID());
//Versione con subqueries (Mysql 4.1)
/*$ids = $thisDB->getCol("SELECT `id autore` FROM `autori` WHERE `id autore` ".
"IN (SELECT `id autore` FROM `pagine` WHERE ".
"`id sito`='$siteID');");*/
//Versione compatibile Mysql 3
"SELECT DISTINCT `autori`.`id autore` FROM `pagine`,`autori`".
"WHERE `pagine`.`id autore`=`autori`.`id autore` AND".
"`pagine`.`id sito`='$siteID'");
$authors[] = new Author($i, $thisEngine);
|