Source for file Article.php
Documentation is available at Article.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 per le pagine (Page)
require_once $_SERVER["DOCUMENT_ROOT"]. "/admin/lib/model/Page.php";
* Interfaccia per la gestione degli articoli del sito.
* Permette di utilizzare il database in modo trasparente: creare oggetti
* di questa classe e operare sugli attributi tramite gli appositi metodi
* modificherà automaticamente il database sottostante.
* @author Silvio Moioli <silvio at moioli dot net>
//Attributi ereditati: $ID e $engine
* Costruttore "di lettura" (costruisce un articolo da un record del
* database già esistente).
* Nota: non può essere creata una nuova pagina da qui, ma solo dal Factory
* Method nella classe Site.
* Per i costruttori "di scrittura", quindi, vedere la classe Site
* @param int $ID l'ID del database sottostante
* @param Engine $engine un motore per interagire con il database
* @return mixed l'articolo se la costruzione è andata a buon fine, altrimenti
$this->Page($ID, $engine);
* Getter per la categoria cui l'articolo appartiene.
* Ritorna un oggetto corrispondente alla categoria di appartenenza di
* @return mixed la categoria (Category) se l'operazione è andata a buon fine, altrimenti
$thisDB = $thisEngine->getDB();
$thisID = $thisDB->escapeSimple($this->getID());
$hpID = $thisDB->getOne("SELECT `id categoria` FROM `articoli`".
"WHERE `id pagina` = '$thisID' LIMIT 1;");
return new Category($hpID, $thisEngine);
* Setter per la categoria cui l'articolo appartiene.
* Cambia la categoria cui questo articolo appartiene.
* @param Category $category la nuova categoria
* @return mixed true se l'operazione è andata a buon fine, altrimenti
$thisDB = $thisEngine->getDB();
$thisID = $thisDB->escapeSimple($this->getID());
$newCategoryID = $thisDB->escapeSimple($category->getID());
$thisDB->query("UPDATE `articoli` SET `id categoria`='$newCategoryID'".
"WHERE `id pagina` = '$thisID';");
* Getter per la descrizione dell'articolo appartiene.
* Ritorna la stringa di riassunto di questo articolo.
* @return mixed la descrizione (string) se l'operazione è andata a buon fine, altrimenti
$thisDB = $thisEngine->getDB();
$thisID = $thisDB->escapeSimple($this->getID());
$res = $thisDB->getOne("SELECT `descrizione articolo` FROM `articoli`".
"WHERE `id pagina` = '$thisID' LIMIT 1;");
* Setter per la descrizione dell'articolo appartiene.
* Cambia la stringa di riassunto di questo articolo.
* @param string $description la nuova descrizione
* @return mixed true se l'operazione è andata a buon fine, altrimenti
$thisDB = $thisEngine->getDB();
$thisID = $thisDB->escapeSimple($this->getID());
$description = $thisDB->escapeSimple($thisDB->escapeSimple($description));
$thisDB->query("UPDATE `articoli` SET `descrizione articolo`='$description'".
"WHERE `id pagina` = '$thisID';");
* Getter per gli articoli correlati a questo articolo.
* Ritorna un array contenente gli articoli correlati a questo articolo.
* @return mixed un array di Article se l'operazione è andata a
* buon fine o un DB_ERROR in caso di errore
$thisDB = $thisEngine->getDB();
$articleID = $thisDB->escapeSimple($this->getID());
$sql = "SELECT `id articolo`
FROM `articoli correlati articolo`
WHERE `id articolo correlato` ='$articleID'
SELECT `id articolo correlato`
FROM `articoli correlati articolo`
WHERE `id articolo` ='$articleID';";
$articleIDs = $thisDB->getCol($sql);
//Creo l'array degli oggetti a partire dagli IDs
foreach ($articleIDs as $i) {
$articles[] = new Article($i, $thisEngine);
* Ritorna il numero degli articoli correlati a questo articolo.
* @return mixed un int se l'operazione è andata a
* buon fine o un DB_ERROR in caso di errore
$thisDB = $thisEngine->getDB();
$articleID = $thisDB->escapeSimple($this->getID());
$sql = "SELECT COUNT(`id articolo`) FROM `articoli correlati articolo` WHERE ".
"`id articolo correlato` ='$articleID' OR `id articolo` ='$articleID';";
$result = $thisDB->getOne($sql);
* Correla questo articolo con un altro.
* Aggiunge un nuovo articolo fra quelli correlati a questo articolo.
* @param Article $article l'articolo da aggiungere
* @return mixed true se l'operazione è andata a buon fine o un
* DB_ERROR in caso di errore
$thisDB = $thisEngine->getDB();
$articleID = $thisDB->escapeSimple($article->getID());
$pageID = $thisDB->escapeSimple($this->getID());
$sql = "INSERT INTO `articoli correlati articolo` (`id articolo`,".
"`id articolo correlato` ) VALUES ( '$pageID', '$articleID' );";
* Rimuove la correlazione tra questo e un altro articolo.
* Se tra questo articolo e quello specificato nel parametro c'è
* correlazione (i due articoli sono correlati per il contenuto
* fra loro), essa viene rimossa.
* @param Article $article l'articolo da rimuovere
* @return mixed true se l'operazione è andata a buon fine o un
* DB_ERROR in caso di errore
$thisDB = $thisEngine->getDB();
$articleAID = $thisDB->escapeSimple($this->getID());
$articleBID = $thisDB->escapeSimple($article->getID());
//La relazione potrebbe essere sia da "a" a "b" che
//viceversa, cancello in ogni caso
$sql = "DELETE FROM `articoli correlati articolo` WHERE".
"((`id articolo`='$articleAID') AND ".
" (`id articolo correlato` ='$articleBID')) OR".
"((`id articolo`='$articleBID') AND ".
" (`id articolo correlato` ='$articleAID'));";
* Rimuove tutte le correlazioni che coinvolgono questo articolo.
* Se questo articolo ha articoli correlati (o equivalentemente
* qualsiasi articolo è correlato a questo), le correlazioni
* @return mixed true se l'operazione è andata a buon fine o un
* DB_ERROR in caso di errore
$thisDB = $thisEngine->getDB();
$articleID = $thisDB->escapeSimple($this->getID());
$sql = "DELETE FROM `articoli correlati articolo` WHERE".
"(`id articolo`='$articleID') OR".
"(`id articolo correlato`='$articleID');";
* Setter per gli articoli correlati a questo articolo.
* Cambia gli articoli correlati a questo articolo con un insieme di altri.
* @param array $articles i nuovi articoli correlati
* @return mixed true se l'operazione è andata a buon fine o un DB_ERROR
foreach ($articles as $i){
* Ritorna gli eventuali articoli non correlati ma appartenenti alla
* @return mixed un array di Article se l'operazione è andata a buon fine
* o un DB_ERROR in caso di errore
$categoryID = $category->getID();
$thisDB = $thisEngine->getDB();
$articleID = $thisDB->escapeSimple($this->getID());
$categoryID = $thisDB->escapeSimple($categoryID);
/* $sql = "SELECT DISTINCT `id pagina`
FROM `articoli` JOIN `categorie`
ON `articoli`.`id categoria`=`categorie`.`id categoria`
WHERE `articoli`.`id categoria`='$categoryID'
AND `articoli`.`id pagina`<>'$articleID'
AND `articoli`.`id pagina` NOT IN
FROM `articoli correlati articolo`
WHERE `id articolo correlato` ='$articleID'
SELECT `id articolo correlato`
FROM `articoli correlati articolo`
WHERE `id articolo` ='$articleID');";*/
$sql = "SELECT DISTINCT A1.`id pagina`
FROM `articoli` AS A1 JOIN `categorie`
ON A1.`id categoria`=`categorie`.`id categoria`
LEFT JOIN `articoli correlati articolo` AS A2
ON A2.`id articolo`=A1.`id pagina`
LEFT JOIN `articoli correlati articolo` AS A3
ON A3.`id articolo correlato`=A1.`id pagina`
WHERE A1.`id categoria`='$categoryID'
AND A1.`id pagina`<>'$articleID'
AND COALESCE(A2.`id articolo correlato`,'nessuno')<>'$articleID'
AND COALESCE(A3.`id articolo`,'nessuno')<>'$articleID';";
$articleIDs = $thisDB->getCol($sql);
//Creo l'array degli oggetti a partire dagli IDs
foreach ($articleIDs as $i) {
$articles[] = new Article($i, $thisEngine);
* Ritorna il numero degli articoli non correlati ma appartenenti alla
* @return mixed un array di Article se l'operazione è andata a buon fine
* o un DB_ERROR in caso di errore
$categoryID = $category->getID();
$thisDB = $thisEngine->getDB();
$categoryID = $thisDB->escapeSimple($categoryID);
$articleID = $thisDB->escapeSimple($this->getID());
$sql = "SELECT COUNT(DISTINCT A1.`id pagina`)
FROM `articoli` AS A1 JOIN `categorie`
ON A1.`id categoria`=`categorie`.`id categoria`
LEFT JOIN `articoli correlati articolo` AS A2
ON A2.`id articolo`=A1.`id pagina`
LEFT JOIN `articoli correlati articolo` AS A3
ON A3.`id articolo correlato`=A1.`id pagina`
WHERE A1.`id categoria`='$categoryID'
AND A1.`id pagina`<>'$articleID'
AND COALESCE(A2.`id articolo correlato`,'nessuno')<>'$articleID'
AND COALESCE(A3.`id articolo`,'nessuno')<>'$articleID';";
$result = $thisDB->getOne($sql);
|