Source for file Engine.php
Documentation is available at Engine.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 |
// +----------------------------------------------------------------------+
* Interfaccia per la gestione dei dettagli della connessione con il
* @author Silvio Moioli <silvio at moioli dot net>
/* Questo forza l'interprete PHP ad usare l'installazione di PEAR fornita
con MCMS. Non sarà un'idea brillantissima, ma permette al tutto di funzionare
senza complicare il processo di installazione, inoltre funziona con i web
hosting senza servizio di shell remota. */
/** Carica la classe base di PEAR */
require_once $_SERVER["DOCUMENT_ROOT"]. "/admin/include/pear/PEAR.php";
/** Carica la classe PEAR::Date */
require_once $_SERVER["DOCUMENT_ROOT"]. "/admin/include/pear/Date.php";
/** Carica la classe PEAR::DB */
require_once $_SERVER["DOCUMENT_ROOT"]. "/admin/include/pear/DB.php";
/** Carica la classe per gli autori (Author) */
require_once $_SERVER["DOCUMENT_ROOT"]. "/admin/lib/model/Author.php";
/** Carica la classe per le categorie di articoli (Category) */
require_once $_SERVER["DOCUMENT_ROOT"]. "/admin/lib/model/Category.php";
* Setta la gestione degli errori di PEAR. Questo richiamerà
* automaticamente die() senza che debba fare controlli.
PEAR::setErrorHandling(PEAR_ERROR_PRINT);
* Interfaccia per la gestione della connessione con il
* Permette di utilizzare le classi come MCMS_Pagine, MCMS_Sito, ecc. al posto
* di interrogazioni al database in modo trasparente.
* @author Silvio Moioli <silvio at moioli dot net>
* @var string $dataSourceName la stringa che specifica nome, posizione,
* tipo di connessione, nome utente e password per il database.
* @var PEAR::DB $dbConnection la connessione corrente al DB, se è già stata
* Costruisce un motore tramite un DataSourceName che permetta la connessione
* a un DBMS. Se il DBMS non contiene le tabelle necessarie al funzionamento
* di MCMS, esse verranno create (vuote).
* @return mixed true se la connessione è andata a buon fine, altrimenti
//Carica il file con la configurazione per il database
include $_SERVER["DOCUMENT_ROOT"]. "/admin/config.php";
//Salva il DSN localmente
//Controlla se esistono le tabelle di MCMS
$currentTables = $db->getListOf("tables");
if (in_array("siti", $currentTables) == false) {
//Non ci sono tabelle, è ora di crearle
* Ritorna un oggetto DB valido per lavorare sul database
* Ritorna un oggetto DB valido per lavorare sul database
* sottostante MCMS. Dovrebbe essere usato solo dalle classi
* @return mixed un un oggetto DB se l'operazione è andata a buon fine,
'optimize' => 'portability',
* Chiude la connessione con il database sottostante.
* Ritorna i siti memorizzati in questo Database.
* Ritorna un array contenente gli oggetti corrispondenti a tutti i
* siti 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 = $this->getDB();
$ids = $thisDB->getCol("SELECT `id sito` FROM `siti`;");
$sites[] = new Site($i, $this);
* Aggiunge un sito ai siti memorizzati in questo Database
* Crea un nuovo sito e lo memorizza nel Database sottostante, creando
* anche una homepage vuota. Questo è l'unico modo per creare un sito!
* @param string $URL l'indirizzo del sito
* @param string $slogan il motto del sito (es. Clarence: "a wwworld apart")
* @param Author $author l'autore del sito (e dell'homepage)
* @param string $keywords l'elenco separato da virgole e spazi
* (per esempio "case, amici") delle parole chiave della pagina.
* @return mixed il sito se l'operazione è andata a buon fine, altrimenti
function addSite($URL, $slogan, $author, $keywords)
//Crea e immette il nuovo record per il sito
$thisDB = $this->getDB();
$siteID = $thisDB->nextID("id sito");
$URL = $thisDB->escapeSimple($URL);
$slogan = $thisDB->escapeSimple($slogan);
$keywords = $thisDB->escapeSimple($keywords);
$sql = "INSERT INTO `siti` ( `id sito` , `url sito` ) "
. " VALUES ( '$siteID', '$URL');";
//Crea e immette il nuovo record per la pagina
$newSite = new Site($siteID, $this);
$newPage = $newSite->addPage($author, "Questo è il mio nuovo sito!",
$newPageID = $newPage->getID();
//Crea e immette il nuovo record per la homepage
$thisDB = $this->getDB();
$sql = "INSERT INTO `homepages` ( `id pagina` , `motto homepage` ) "
. " VALUES ( '$newPageID', '$slogan' );";
//Crea una categoria vuota
$newSite->addCategory("Varie", "Dentro tutto!");
//Ritorna il nuovo sito felicemente creato
* Cancella un sito ai siti memorizzati in questo Database.
* Cancella un sito memorizzato nel Database sottostante, incluse tutte
* le pagine e tutti i contenuti.
* @param Site $site il sito da cancellare
* @return mixed true se l'operazione è andata a buon fine, altrimenti
//Cancella le pagine del sito
$thisDB = $this->getDB();
$siteID = $thisDB->escapeSimple($site->getID());
//Cancella le relazioni con i componenti
$sql = "DELETE FROM `componenti siti` WHERE `id sito`='$siteID';";
//Cancella il sito stesso
$sql = "DELETE FROM `siti` WHERE `id sito`='$siteID';";
//Cancella le categorie vuote (non è bellissimo ma il manuale di MySQL dice
$ids = $thisDB->getCol("SELECT `categorie`.`id categoria` ".
"FROM `categorie` LEFT JOIN `articoli` ON `categorie`.`id categoria`".
"=`articoli`.`id categoria` WHERE `articoli`.`id categoria` IS NULL;");
$thisDB->query("DELETE FROM `categorie` WHERE `id categoria`='$i'");
* Ritorna gli autori memorizzati in questo Database.
* Ritorna un array contenente gli autori di tutti i
* siti 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 = $this->getDB();
$ids = $thisDB->getCol("SELECT `id autore` FROM `autori`;");
$authors[] = new Author($i, $this);
* Aggiunge un autore a quelli memorizzati in questo Database
* Crea un nuovo autore e lo memorizza nel Database sottostante.
* Questo è l'unico modo per creare un nuovo autore!
* @param string $name il nome di battesimo dell'autore da aggiungere
* @param string $surname il congnome (da nubile) dell'autore
* @param string $nick il nome internet dell'autore o ""
* @param string $email il recapito email dell'autore
* @return mixed l'autore se l'operazione è andata a buon fine, altrimenti
function addAuthor($name, $surname, $nick, $email)
$thisDB = $this->getDB();
$authorID = $thisDB->escapeSimple($thisDB->nextID("id autore"));
$name = $thisDB->escapeSimple($name);
$surname = $thisDB->escapeSimple($surname);
$nick = $thisDB->escapeSimple($nick);
$email = $thisDB->escapeSimple($email);
$sql = "INSERT INTO `autori` ( `id autore` , `nome autore` , `cognome autore` ,".
"`nick autore` , `email autore` ) ".
"VALUES ( '$authorID', '$name', '$surname', '$nick', '$email' );";
return new Author($authorID, $this);
* Cancella un autore tra quelli memorizzati in questo Database.
* Cancella un autore memorizzato nel Database sottostante, incluse tutti i
* dati personali. Questa operazione è possibile SOLO se non esistono pagine
* o siti creati da questo autore.
* @param Author $author l'autore da cancellare
* @return mixed true se l'operazione è andata a buon fine, false se l'autore
* ha pagine, articoli o siti, altrimenti un DB_ERROR;
$thisDB = $this->getDB();
$authorID = $thisDB->escapeSimple($author->getID());
$sql = "SELECT COUNT(`id pagina`) FROM `pagine`".
"WHERE `id autore` = '$authorID'";
$result = $thisDB->getOne($sql);
//Se l'autore ha pagine sue...
//...altrimenti si può cancellare
$sql = "DELETE FROM `autori` WHERE `id autore` = '$authorID'";
* Determina se è possibile cancellare un autore o meno.
* Determina se è possibile cancellare un autore o meno (un autore
* è cancellabile se non ha pagine o siti propri).
* @param Author $author l'autore da cancellare
* @return true se è possibile, false se l'autore
* ha pagine, articoli o siti
$thisDB = $this->getDB();
$authorID = $thisDB->escapeSimple($author->getID());
$sql = "SELECT COUNT(`id pagina`) FROM `pagine`".
"WHERE `id autore` = '$authorID'";
$result = $thisDB->getOne($sql);
* Ritorna tutti i componenti utilizzabili (non necessariamente già in
* uso) dai siti gestiti con MCMS.
* Ritorna un array contenente tutti i componenti opzionali per i siti
* (ossia le classi nei file della cartella Components).
* @return array un array contenente i componenti in questa implementazione
if ($dir = @opendir($_SERVER["DOCUMENT_ROOT"]. "/admin/lib/plugins/")) {
if (substr($file,- 4) == ".php"){
require_once $_SERVER["DOCUMENT_ROOT"]. "/admin/lib/plugins/". $file;
//Costruisco il componente
$result[] = new $className();
* Crea le tabelle per MCMS.
* Crea le tabelle (vuote) necessarie per il funzionamento di MCMS. Necessita dei
* privilegi necesssari alla creazione delle tabelle.
* @return mixed true se l'operazione è andata a buon fine, altrimenti
`id sito` int(11) NOT NULL default '0',
`url sito` text NOT NULL,
INDEX `indice siti` (`id sito`)
`id autore` int(11) NOT NULL default '0',
`nome autore` char(255) NOT NULL default '',
`cognome autore` char(255) NOT NULL default '',
`nick autore` char(255) default NULL,
`email autore` char(255) default NULL,
PRIMARY KEY (`id autore`),
INDEX `indice autori` (`id autore`)
`id pagina` int(11) NOT NULL default '0',
`id sito` int(11) NOT NULL default '0',
`id autore` int(11) NOT NULL default '0',
`contenuto pagina` text NOT NULL,
`data pagina` date NOT NULL default '0000-00-00',
`titolo pagina` varchar(100) NOT NULL default 'Senza titolo',
`parole chiave pagina` text NOT NULL,
PRIMARY KEY (`id pagina`),
FOREIGN KEY (`id sito`) REFERENCES `siti` (`id sito`),
FOREIGN KEY (`id autore`) REFERENCES `autori` (`id autore`),
INDEX `indice pagine 1` (`id pagina`),
INDEX `indice pagine 2` (`id sito`),
INDEX `indice pagine 3` (`data pagina`)
"CREATE TABLE `notizie` (
`id pagina` int(11) NOT NULL default '0',
`url fonte notizia` text,
PRIMARY KEY (`id pagina`),
FOREIGN KEY (`id pagina`) REFERENCES `pagine` (`id pagina`),
INDEX `indice notizie` (`id pagina`)
"CREATE TABLE `homepages` (
`id pagina` int(11) NOT NULL default '0',
`motto homepage` char(255) NOT NULL default '',
PRIMARY KEY (`id pagina`),
FOREIGN KEY (`id pagina`) REFERENCES `pagine` (`id pagina`),
INDEX `indice homepages` (`id pagina`)
"CREATE TABLE `categorie` (
`id categoria` int(11) NOT NULL default '0',
`nome categoria` char(255) NOT NULL default '',
`descrizione categoria` text NOT NULL,
`id sito` int(11) NOT NULL default '0',
PRIMARY KEY (`id categoria`),
INDEX `indice categorie 1` (`id categoria`),
INDEX `indice categorie 2` (`id sito`)
"CREATE TABLE `articoli` (
`id pagina` int(11) NOT NULL default '0',
`id categoria` int(11) NOT NULL default '0',
`descrizione articolo` text NOT NULL,
PRIMARY KEY (`id pagina`),
FOREIGN KEY (`id pagina`) REFERENCES `pagine` (`id pagina`),
FOREIGN KEY (`id categoria`) REFERENCES `categoria` (`id categoria`),
INDEX `indice articoli 1` (`id pagina`),
INDEX `indice articoli 2` (`id categoria`)
/*"CREATE TABLE `componenti` (
`id componente` int(11) NOT NULL default '0',
`nome componente` char(255) NOT NULL default '',
`descrizione componente` text NOT NULL,
PRIMARY KEY (`id componente`)
"CREATE TABLE `articoli correlati articolo` (
`id articolo` int(11) NOT NULL default '0',
`id articolo correlato` int(11) NOT NULL default '0',
PRIMARY KEY (`id articolo`,`id articolo correlato`),
FOREIGN KEY (`id articolo`) REFERENCES `articoli` (`id pagina`),
FOREIGN KEY (`id articolo correlato`) REFERENCES `articoli` (`id pagina`),
INDEX `indice articoli correlati articolo 1` (`id articolo`),
INDEX `indice articoli correlati articolo 2` (`id articolo correlato`)
"CREATE TABLE `articoli correlati notizia` (
`id notizia` int(11) NOT NULL default '0',
`id articolo` int(11) NOT NULL default '0',
PRIMARY KEY (`id notizia`,`id articolo`),
FOREIGN KEY (`id notizia`) REFERENCES `notizie` (`id pagina`),
FOREIGN KEY (`id articolo`) REFERENCES `siti` (`id pagina`),
INDEX `indice articoli correlati notizia 1` (`id notizia`),
INDEX `indice articoli correlati notizia 2` (`id articolo`)
"CREATE TABLE `componenti siti` (
`id sito` int(11) NOT NULL default '0',
`nome componente` char(255) NOT NULL default '',
PRIMARY KEY (`id sito`,`nome componente`),
FOREIGN KEY (`id sito`) REFERENCES `siti` (`id sito`),
INDEX `indice componenti siti` (`id sito`)
//Tabella per l'autenticazione degli utenti
username VARCHAR(50) default '' NOT NULL,
password VARCHAR(32) default '' NOT NULL,
$thisDB = $this->getDB();
$thisDB->createSequence("id sito");
$thisDB->createSequence("id autore");
$thisDB->createSequence("id pagina");
$thisDB->createSequence("id componente");
$thisDB->createSequence("id categoria");
|