mercoledì 7 dicembre 2011

Altervista: crearsi un sistema di gestione di commenti

Conosciamo altervista, la famosa piattaforma italiana che ti permette di creare un sito con un dominio di secondo livello, spazio web e una serie di utili strumenti per creare un sito (tra i più importanti citiamo php5 e mysql lite), il tutto in maniera gratuita.

Tempo fa per un mio sito che elenca una serie di canzoni "storiche", decisi di creare la possibilità di inserire dei commenti sotto ogni canzone. Ho creato tutto con php4  e ultimamente, avendo implementato il SimpleXML, anche php5.

Ovviamente questo sistema va bene per siti "minori" e non quelli con alto traffico (e quindi molti commenti).

Ho deciso di organizzare tutti i commenti (di tutte i post) in un file di nome "commenti.xml". Ipotizzando che ci siano due post con ID "post1" e "post2", ognuno con i relativi commenti, la struttura di questo file sarà:


<ROOT>

<COMMENTO ID="post1">

<NOME>Alberto</NOME>

<SITO>www.miosito.it</SITO>

<DATAORA>29/7/2009 alle 22:59</DATAORA>

<TESTO>
Questo è un commento a post1
</TESTO>
</COMMENTO>

<COMMENTO ID="post2">


<NOME>Alberto</NOME>

<SITO>www.miosito.it</SITO>

<DATAORA>29/7/2010 alle 22:59</DATAORA>

<TESTO>
Questo è un commento a post2
</TESTO>

</COMMENTO>
</ROOT>

Adesso dovremmo creare tre file php:

  1. Una pagina che visualizza il form da dove inserire il commento
  2. Un file php che contiene puro codice per processare il commento
  3. Una pagina che  visualizza i commenti
I suddetti file saranno solamente tre per qualsivoglia numero di post, i commenti verranno memorizzati nello stesso file "commenti.xml" in base al loro ID passato alle pagine con il metodo GET (per chi non mastica molto l'HTML, è un metodo per passare delle informazioni da una pagina a un'altra tramite l'indirizzo).

Iniziamo dunque dal primo file php: il form. 

1)Il Form
Salviamo il seguente codice in un file php, per esempio new.php:


<?
$ref=$_GET['ref'];


echo "<html>";
echo "<body bgcolor='#3366FF'>";
echo "<form method='post' action='post.php?rif=".$ref."'>Nome:<br /><input name='nome' type='text' style='width: 98%' />&nbsp;&nbsp; <br />Indirizzo:<br /><input name='indirizzo' style='width: 98%' type='text' /><br>Commento:<br/><textarea name='commento' style='width: 98%; height: 143px'></textarea><p><input name='Submit1' type='submit' value='Invia commento' /></p></form>";
?>
</body>
</html>

La prima istruzione ottiene il riferimento (ID, qui chiamato ref) col metodo GET e poi tramite il linguaggio php crea un form con i rispettivi campi per inserire un commento. Il form, se viene fatto click sul tasto "Invia commento", apre la pagina "post.php" e passerà col metodo POST (che, a differenza del metodo GET, non lascia trasparire all'utente i dati inviati) i campi del commento.
Esempio di codice HTML per inserire un commento su post1, per esempio:

<a href="/new.php?ref=post1">Invia commento</a>
 Adesso vediamo di creare il file "post.php".

2)Processare il commento: post.php
Salviamo il seguente codice in un file php, per esempio post.php:
<?
$rif=$_GET["rif"];                        //ottiene il riferimento
$xml=fopen("commenti.xml","r+");          //apre "commenti.xml"
$posizione = filesize("commenti.xml")-7;  
fseek($xml,$posizione,SEEK_SET);          //posiziona il puntatore nel file per aggiungere i tag XML alla coda del file, prima di </ROOT>


$nome = $_POST['nome'];                   //ottiene il nome tramite POST
$indirizzo = $_POST['indirizzo'];         //ottiene indirizzo tramite POST  
$arraydata = getdate();                   //ottiene la data corrente
$data = $arraydata['mday'].'/'.$arraydata['mon'].'/'.$arraydata['year'].' alle '.$arraydata['hours'].':'.$arraydata['minutes'];   //formatta la data
$commento = $_POST['commento'];           //ottiene il testo del commento       
fwrite($xml, '<COMMENTO ID="'.$rif.'"><NOME>'.$nome.'</NOME><SITO>'.$indirizzo.'</SITO><DATAORA>'.$data.'</DATAORA><TESTO>'.$commento.'</TESTO></COMMENTO></ROOT>'); //scrive i tag XML sul file  
mail("miamail@mail.com","Notifica commento","Email automatica: hai ricevuto un commento sul tuo sito. Commento ricevuto da $nome:\n$commento");
fclose($xml);                             //chiude il file
?>
<html>
<body>
<div style="border-style: groove; background-color: #3366FF">Commento pubblicato.</div>
</body>
</html>

 Il codice è tutto commentato. In questo modo si avrà la possibilità di ricevere una mail ogni qualvolta qualcuno pubblica un commento sul nostro sito, basta cambiare miamail@mail.com . Da notare che nonostante stia scrivendo su un file XML, non utilizzo alcuna funzione di libreria per gli XML semplicemente perché lo tratto come testo. Nella prossima sezione vedremo come per visualizzare i commenti, devo necessariamente utilizzare qualche funzione che mi faciliti la lettura dei file XML.

3)Visualizzare i commenti: view.php
Salviamo il seguente codice in un file php, per esempio view.php:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//IT" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Visualizza commenti</title>
<meta charset="utf-8" />
</head>
<body link="#FFFF00" bgcolor="#3366FF">
<?php
$commentata=false;         //Una variabile per controllare se ci sono commenti così visualizza "nessun commento"
$ref=$_GET["ref"];                          //ottengo il riferimento
$xml = simplexml_load_file('commenti.xml'); //carico il file con SimpleXML(php5)
foreach($xml->COMMENTO as $commento)        //scansiono ogni commento
if ($commento['ID']==$ref)                  //se il commento appartiene al post che mi interessa... 
{
    $indirizzoenome=$commento->NOME;        //ottengo i vari campi...
    if (($commento->SITO!='')&($commento->SITO!=' '))  $indirizzoenome = '<b>'.$commento->NOME.'</b> da <b>'.$commento->SITO.'</b>';
    if (strstr($commento->SITO,'@')) $indirizzoenome='<a href="mailto:'.$commento->SITO.'">'.$commento->NOME.'</a>';
    if (strstr($commento->SITO,'.')) $indirizzoenome='<a href="'.$commento->SITO.'">'.$commento->NOME.'</a>';
    
    echo '<div style="background-color: #00BFFF; border-style: ridge; padding: 5px; margin: 5px 0px 5px 0px; width: 400px; " >';   //..e li stampo a schermo
    echo $indirizzoenome.' ha scritto: <br>';
    echo '<i>'.$commento->TESTO.'</i><br>';
    echo '<font size="2">'.$commento->DATAORA.'</font><br>';
    echo '</div>';   
    $commentata=true;                      //c'è almeno un commento.
}
if ($commentata==false) echo '<div style="background-color: #00BFFF; border-style: ridge; padding: 5px; margin: 5px 0px 5px 0px; width: 400px; " >Nessun commento</div>';                          


?>
</body>
</html>

Anche questo codice è commentato e non aggiungo altro. Visualizzerà ogni commeno in un blocco "div" e se non c'è alcun commento visualizza "Nessun commento". Anche qui è necessario il riferimento. Se voglio leggere tutti i commenti di "post1" utilizzo questo link:

<a href="/view.php?ref=post1">Visualizza commenti</a>


Tutto ciò è abbastanza semplice. Se volete chiarimenti, delucidazioni o volete far notare errori o inconvenienze, commentate :D

Alberto

4 commenti:

  1. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  2. ciao, ho provato ad inserire facendo il copia e incolla tranne per queste due righe:
    a href="/new.php?ref=post1"
    a href="/view.php?ref=post1"
    non ho capito bene dove li dovrei inserire.

    Oltre a questo, non inserendo quei codici sto avendo problemi nella visualizzazione dei commenti. Nel file commenti.xml compaiono, ma su view no. Ho notato che sul file commenti.xml nella voce COMMENTO ID non compare niente.

    RispondiElimina
  3. a href="/new.php?ref=post1"
    a href="/view.php?ref=post1"



    Quel codice

    a href="/new.php?ref=post1"
    a href="/view.php?ref=post1"

    lo devi inserire nella pagina che contiene la sezione di cui vuoi far inserire/visualizzare i commenti.
    Su commento id non ti compare nulla perché il file new.php si aspetta il riferimento della sezione, stessa cosa view.php, che si aspetta il riferimento della sezione di cui vuoi far visualizzare i commenti.

    Quindi per esempio nella pagina delle tue creazioni natalizie, puoi mettere a fine pagina il codice

    a href="/new.php?ref=creazioni_natalizie"
    a href="/view.php?ref=creazioni_natalizie"

    per far inserire/visualizzare commenti relativi alle tue creazioni natalizie.

    RispondiElimina