In questa serie di articoli analizzeremo la procedura necessaria per creare un caledario perpetuo che permetta anche la gestione degli appuntamenti, in pratica lโobiettivo del nostro lavoro sarร creare unโagenda con PHP e MySQL.
In pratica avremo un calendario virtuale che potrร essere consultato avanti ed indietro nel tempo (di mese in mese) e un admin per la gestione degli appuntamenti. Quando inseriremo uno o piรน appuntamenti in corrispondenza di una determinata data, questa diventerร cliccabile e ci permetterร di consultarli, modificarli o eventualmente di cancellarli.
La nostra applicazione si appoggerร ad un database, "agenda", in cui sarร sufficiente inserire una sola tabella, "appuntamenti". Allโinterno della tabella avremo 4 campi: un id autoincrementale univoco per ogni appuntamento, un campo per il titolo dellโappuntamento (VARCHAR 255), un campo per il testo che lo descrive (TEXT) e un ultimo campo, di tipo numerico, chiamato str_data destinato ad ospitare la data dellโappuntamento convertita tramite la funzione strtotime() in formato Unix timestamp.
Per maggiore comoditร da parte del lettore, presentiamo di seguito lโSQL relativo alla nostra tabella:
CREATE TABLE appuntamenti (
id int(11) NOT NULL auto_increment,
titolo varchar(255) NOT NULL default '',
testo text NOT NULL,
str_data int(10) NOT NULL default '0',
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Lo script per il funzionamento del nostro calendario/agenda sarร costituito da 6 file:
- config.php: dati di connessione al DBMS e selezione del database.
- index.php: calendario perpetuo con link agli appuntamenti.
- appuntamenti.php: elenco degli appuntamenti per una determinata data selezionata sul calendario.
- form.php: modulo per lโinserimento degli appuntamenti.
- cancella.php: cancellazione degli appuntamenti previsti per una data.
- modifica.php: modifica degli appuntamenti e spostamento a date diverse da quella stabilita.
Il primo file di cui mostreremo il codice sarร quello di configurazione, esso รจ particolarmente importante in quanto verrร incluso in tutti i restanti file dello script:
<?php
$host = 'localhost';
$user = 'user';
$pass = 'password';
$db = 'agenda';
$con = @mysql_connect($host,$user,$pass) or die (mysql_error());
$sel = @mysql_select_db($db) or die (mysql_error());
?>
Il nostro prossimo passaggio sarร relativo alla creazione del calendario.
Il calendario
Presentiamo di seguito il codice necessario alla scrittura di un calendario perpetuo, lโapplicazione non รจ particolarmente complessa, ma il codice รจ abbastanza lungo:
<?php
function ShowCalendar($m,$y)
{
if ((!isset($_GET['d']))||($_GET['d'] == ""))
{
$m = date('n');
$y = date('Y');
}else{
$m = (int)strftime( "%m" ,(int)$_GET['d']);
$y = (int)strftime( "%Y" ,(int)$_GET['d']);
$m = $m;
$y = $y;
}
$precedente = mktime(0, 0, 0, $m -1, 1, $y);
$successivo = mktime(0, 0, 0, $m +1, 1, $y);
$nomi_mesi = array(
"Gen",
"Feb",
"Mar",
"Apr",
"Mag",
"Giu",
"Lug",
"Ago",
"Set",
"Ott",
"Nov",
"Dic"
);
$nomi_giorni = array(
"Lun",
"Mar",
"Mer",
"Gio",
"Ven",
"Sab",
"Dom"
);
$cols = 7;
$days = date("t",mktime(0, 0, 0, $m, 1, $y));
$lunedi= date("w",mktime(0, 0, 0, $m, 1, $y));
if($lunedi==0) $lunedi = 7;
echo "<table>\n";
echo "<tr>\n
<td colspan=\"".$cols."\">
<a href=\"?d=" . $precedente . "\"><<</a>
" . $nomi_mesi[$m-1] . " " . $y . "
<a href=\"?d=" . $successivo . "\">>></a></td></tr>";
foreach($nomi_giorni as $v)
{
echo "<td><b>".$v."</b></td>\n";
}
echo "</tr>";
for($j = 1; $j<$days+$lunedi; $j++)
{
if($j%$cols+1==0)
{
echo "<tr>\n";
}
if($j<$lunedi)
{
echo "<td> </td>\n";
}else{
$day= $j-($lunedi-1);
$data = strtotime(date($y."-".$m."-".$day));
$oggi = strtotime(date("Y-m-d"));
include 'config.php';
$sql = "SELECT str_data FROM appuntamenti";
$result = mysql_query($sql) or die (mysql_error());
if(mysql_num_rows($result) > 0)
{
while($fetch = mysql_fetch_array($result))
{
$str_data = $fetch['str_data'];
if ($str_data == $data)
{
$day = "<a href=\"appuntamenti.php?day=$str_data\">$day</a>";
}
}
}
if($data != $oggi)
{
echo "<td>".$day."</td>";
}else{
echo "<td><b>".$day."</b></td>";
}
}
if($j%$cols==0)
{
echo "</tr>";
}
}
echo "<tr></tr>";
echo "</table>";
}
ShowCalendar(date("m"),date("Y"));
?>
Dato che per utenti italiani sarebbe abbastanza scomodo gestire un calendario con coni nomi di mesi e giorni in Inglese, questi sono stati tradotti nella nostra lingua e abbreviati; inoltre, si รจ fatto in modo che la settimana cominciasse da lunedรฌ e non da domenica come prevede il calendario anglosassone.
Una volta mostrati i diversi giorni del mese allโinterno di una tabella disposta su 7 colonne (una per ogni giorno della settimana) per facilitarne la lettura, si procede ad una serie di controlli: viene calcolata la data odierna in modo da sottolinearla in grassetto, inoltre vengono controllate le corrispondenze tra il contenuto del database e i giorni elencati: quando la data di un appuntamento e un giorno del calendario coincidono, questโultimo diventa un collegamento cliccabile verso la pagina per la lettura.
Il form per gli appuntamenti
La fase relativa alla creazione del calendario รจ sicuramente la piรน impegnativa in tutta la procedura di creazione dello script, i passaggi successivi saranno molto piรน semplici.
Il nostro prossimo compito sarร quello di scrivere il codice necessario per mettere a disposizione dellโutilizzatore un form attraverso il quale inserire il titolo, il testo e la data dei suoi appuntamenti.
Titolo e testo verranno inseriti nei relativi campi di destinazione cosรฌ come saranno digitati dallโutente, mentre la data (da scrivere in formato non anglossasone "gg-mm-aaaa") subirร una conversione grazie allโutilizzo della funzione strtotime().
La conversione nel formato Unix Timestamp ci consentirร di operare piรน facilmente i confronti trร giorni del calendario e scadenze degli appuntamenti; la stringa cosรฌ ottenuta potrร poi essere comodamente riconvertita tramite la funzione date(), per questo non abbiamo avuto la necessitร di inserire in tabella un campo che contenesse la data nel comune formato "gg-mm-aaaa".
Ecco il codice del nostro modulo:
<?php
if (isset($_POST['submit']) && $_POST['submit']=="invia")
{
$titolo = addslashes($_POST['titolo']);
$testo = addslashes($_POST['testo']);
$str_data = strtotime($_POST['data']);
include 'config.php';
$sql = "INSERT INTO appuntamenti (titolo,testo,str_data ) VALUES ('$titolo', '$testo', '$str_data')";
if($result = mysql_query($sql) or die (mysql_error()))
{
echo "Inserimento avvenuto con successo.<br>
Vai al <a href=\"index.php\">Calendario</a>";
}
}else{
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Titolo:<br>
<input name="titolo" type="text"><br>
Testo:<br>
<textarea name="testo" cols="30" rows="8"></textarea><br>
Data:<br>
<input name="data" type="text" value="gg-mm-aaaa"><br>
<input name="submit" type="submit" value="invia">
</form>
<?php
}
?>
Naturalmente esitono altri modi piรน comodi per inserire una data in un campo-form, il piรน avanzato รจ sicuramente quello di utilizzare un caledario concepito in Javascript da cui selezionare il giorno desiderato; per la creazione del Javascript sarebbe stata perรฒ necessaria una trattazione a parte, quindi abbiamo optato per la soluzione piรน veloce, lโinserimento manuale.
La pagina per la lettura degli appuntamenti
Una volta creato il calendario e la pagina per lโinserimento degli appuntamenti, il prossimo passaggio sarร quello di scrivere il codice necessario allโinterfaccia per la lettura della nostra agenda.
Qui il discorso si fร molto semplice, infatti abbiamo detto in precedenza che la corrispondenza tra la data di un appuntamento e un determinato giorno del calendario permetterร di contrassegnare questโultimo con un link.
Il collegamento cosรฌ generato conterrร in querystring una variabile valorizzata con la data convertita tramite la funzione strtotime() che verrร utilizzata per i confronti con i dati presenti in tabella. A questo punto, tutti i records corrispondenti a quella determinata data verranno visualizzati tramite un ciclo.
Ecco il codice della nostra pagina per la lettura degli appuntamenti:
<?php
if(isset($_GET['day']) && is_numeric($_GET['day']))
{
$day = $_GET['day'];
include 'config.php';
$sql = "SELECT * FROM appuntamenti WHERE str_data=$day";
$result = mysql_query($sql) or die (mysql_error());
if(mysql_num_rows($result) > 0)
{
while($fetch = mysql_fetch_array($result))
{
$id = stripslashes($fetch['id']);
$titolo = stripslashes($fetch['titolo']);
$testo = stripslashes($fetch['testo']);
$data = date("d-m-Y", $fetch['str_data']);
echo "Appuntamenti del <b>$data</b><br>" . $titolo . "<br>" . $testo . "<br>
<a href=\"cancella.php?id=$id\">Cancella</a> |
<a href=\"modifica.php?id=$id\">Modifica</a>
<hr>";
}
}
}
?>
Non cโรจ davvero molto da segnalare riguardo al codice appena proposto; si fร semplicemente notare al lettore come la stringa Timestamp, contenuta nei records venga facilmente riconvertita in un regolare formato/data grazie allโutilizzo della funzione date(), ad essa viene passato come parametro il formato che si intende visulizzare in output (gg-mm-aaaa).
Cancellazioni e modifiche
Il nostro sistema di gestione degli appuntamenti non sarebbe completo senza dare allโutente la possbilitร di cancellare dallโagenda le voci non piรน utili e di modificare quelle esistenti.
Di seguito proponiano i codici necessari per la creazione del file per le cancellazioni e di quello per le modifiche. I listati sono molto semplici e non necessitano di particolari commenti.
Codice per il file di cancellazione:
<?php
include 'config.php';
if (isset($_GET['id']) && is_numeric($_GET['id']))
{
$del_id = $_GET['id'];
$query = mysql_query("SELECT titolo, str_data FROM appuntamenti WHERE id ='$del_id'");
$fetch = mysql_fetch_array($query);
$titolo = $fetch['titolo'];
$data = date("d-m-Y", $fetch['str_data']);
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<h1>Attenzione!</h1>
Si sta per eliminare l'appuntamento
<b><?php echo stripslashes($titolo); ?></b>
del <?php echo stripslashes($data); ?>.<br>
Confermare per eseguire l'operazione.<br>
<br>
<input name="del_id" type="hidden" value="<?php echo $del_id; ?>">
<input name="submit" type="submit" value="Cancella">
</form>
<?php
}
elseif(isset($_POST['del_id']) && is_numeric($_POST['del_id']))
{
$del_id2 = $_POST['del_id'];
if (mysql_query("DELETE FROM appuntamenti WHERE id = '$del_id2'")or die(mysql_error()))
{
echo "Cancellazione del servizio avvenuta con successo<br>
<a href=\"index.php\">Torna al calendario</a>";
}
}
?>
Codice per il file di modifica:
<?php
include 'config.php';
if(isset($_POST['mod_id'])&&(is_numeric($_POST['mod_id'])))
{
$id = $_POST['mod_id'];
$titolo = addslashes($_POST['titolo']);
$testo = addslashes($_POST['testo']);
$str_data = strtotime($_POST['data']);
$sql = "UPDATE appuntamenti SET titolo='$titolo', testo='$testo', str_data='$str_data' WHERE id = $id";
if(mysql_query($sql) or die (mysql_error()))
{
echo "Modifica effettuata con successo.<br>
Vai al <a href=\"index.php\">Calendario</a>";
}
}
elseif (isset($_GET['id']) && is_numeric($_GET['id']))
{
$id = $_GET['id'];
$query = mysql_query("SELECT titolo,testo,str_data FROM appuntamenti WHERE id = $id") or die (mysql_error());
$fetch = mysql_fetch_array($query)or die (mysql_error());
$titolo = stripslashes($fetch['titolo']);
$testo = stripslashes($fetch['testo']);
$data = date("d-m-Y", $fetch['str_data']);
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">Titolo:<br>
<input name="titolo" type="text" value="<?php echo $titolo; ?>">
<br>Testo:<br>
<textarea name="testo" cols="30" rows="8">
<?php echo $testo; ?>
</textarea>
<br>Data:<br>
<input name="data" type="text" value="<?php echo $data; ?>">
<br><input name="mod_id" type="hidden" value="<?php echo $id; ?>">
<input name="submit" type="submit" value="modifica">
</form>
<?php
}
?>
Lโunica nota riguarda il file per le cancellazioni: dato che una volta rimosso un record questo non potrร piรน essere recuperato, lโapplicazione chiede allโutente una conferma dellโoperazione prima di procedere con lโeliminazione.
Scarica lo script completo
Se volete potete scaricare lo ZIP contenente tutti i i file del nostro script pronti allโuso cliccando a questa pagina.