Il principio di un sistema di aggiornamento dei record è lo stesso che abbiamo usato per l'inserimento: bisogna creare un modulo e scrivere il codice CFML per fare l'aggiornamento della tabella del database.
1. Crea un nuovo file aggiornamento.cfm e salvalo nella cartella del sito, dopo aver inserito i due <cfinclude> per l'intestazione e il piede della pagina:
<!--- aggiornamento.cfm: permette di aggiornare gli album --->
<cfinclude template="header.cfm">
<cfinclude template="footer.cfm">
Il modulo di aggiornamento, ovviamente, deve avere i campi già compilati con i valori attualmente presenti nel database. A questo file dovrà essere passato il valore univoco (id) dell'album che vogliamo aggiornare. Questo valore possiamo passarlo via URL come abbiamo fatto nell'index.cfm, per creare il link alla pagina di dettaglio.
2. Aggiungi nella pagina dettaglio.cfm un link a aggiornamento.cfm, che passi via URL l'ID dell'album visualizzato. Possiamo aggiungere il link prima dell'inclusione del footer.cfm
<!--- dettaglio.cfm: mostra il dettaglio dell'album --->
<!--- Esegue una query al datasource "discoteca" chiamata "getdettaglio" --->
<cfquery datasource="discoteca" name="getdettaglio">
SELECT *
FROM ALBUM
WHERE ID_ALBUM = #URL.id#
</cfquery>
<cfoutput query="getdettaglio">
.........
</cfoutput>
<p>
<cfoutput>
<!--- Link alla pagina di aggiornamento dell'album --->
<a href="aggiornamento.cfm?id=#getdettaglio.ID_ALBUM#">Modifica questo album</a>
</cfoutput>
</p>
<!--- Include il piede delle pagine --->
<cfinclude template="footer.cfm">
Come puoi notare, abbiamo inserito il link fuori da <cfoutput query="getdettaglio">...</cfoutput>. Per questo motivo, per poter creare il link con il valore preso dalla query "getdettaglio" hai bisogno di un altro <cfoutput>. Quando il record estratto dalla query è uno solo, come in questo caso, possiamo evitare di inserire l'attributo "query" nel <cfoutput>. Quando vogliamo richiamare un campo del recordset dobbiamo però specificare da quale query esso proviene. Per questo motivo, abbiamo dato alla variabile "ID_ALBUM" lo scope "getdettaglio" (analogamente avevamo fatto nel file index.cfm con la variabile RecordCount).
3. Nella pagina aggiornamento.cfm creiamo la query che interroghi la tabella ALBUM - filtrando i record in base all'id proveniente dall'URL:
<!--- aggiornamento.cfm: permette di aggiornare gli album --->
<cfquery name="getAlbum" datasource="discoteca">
SELECT * FROM ALBUM
WHERE ID_ALBUM = #url.id#
</cfquery>
<cfinclude template="header.cfm">
<cfinclude template="footer.cfm">
4. ora possiamo aggiungere il <cfform> già compilato con i dati provenienti dalla query GetAlbum. Possiamo utilizzare lo stesso che abbiamo scritto per il file inserimento.cfm, aggiungendo il campo "value" per ciascun campo del modulo. Ovviamente, per poter visualizzare il contenuto dei campi del recordset dobbiamo inserire questi all'interno di un <cfoutput>:
<!--- aggiornamento.cfm: permette di aggiornare gli album --->
<cfquery name="getAlbum" datasource="discoteca">
SELECT * FROM ALBUM
WHERE ID_ALBUM = #url.id#
</cfquery>
<cfinclude template="header.cfm">
<p class="titolo">Aggiornamento dell'album</p>
<cfoutput>
<cfform action="aggiornamento.cfm" enctype="multipart/form-data">
<table>
<tr>
<td>
<p>Titolo: </p>
</td>
<td>
<cfinput name="ALBUM_TITOLO" type="text" size="30" maxlength="150" required="yes" message="Inserisci un titolo per questo album." value="#getAlbum.ALBUM_TITOLO#">
</td>
</tr>
<tr>
<td>
<p>Autore: </p>
</td>
<td>
<cfinput name="ALBUM_AUTORE" type="text" size="30" maxlength="150" required="yes" message="Inserisci un autore per questo album." value="#getAlbum.ALBUM_AUTORE#">
</td>
</tr>
<tr>
<td>
<p>Etichetta: </p>
</td>
<td>
<cfinput name="ALBUM_ETICH" type="text" size="30" maxlength="150" required="yes" message="Inserisci l'etichetta di questo album." value="#getAlbum.ALBUM_ETICH#">
</td>
</tr>
<tr>
<td valign="top">
<p>Descrizione:</p>
</td>
<td>
<textarea name="ALBUM_DESCR" cols="30" rows="5">#getAlbum.ALBUM_DESCR#</textarea>
</td>
</tr>
<tr>
<td>
<p>Genere: </p>
</td>
<td>
<cfinput name="ALBUM_GENERE" type="text" size="30" maxlength="150" required="yes" message="Inserisci il genere della musica di questo album." value="#getAlbum.ALBUM_GENERE#">
</td>
</tr>
<tr>
<td>
<p>Immagine: </p>
</td>
<td>
<input name="ALBUM_IMG" type="file" size="30">
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="Aggiorna record">
</td>
</tr>
</table>
</cfform>
</cfoutput>
<cfinclude template="footer.cfm">
Non possiamo però mettere il valore di "ALBUM_IMG" nel campo per l'invio del file. Possiamo però visualizzare la vecchia immagine e fare in modo che se ne possa inserire una nuova.
5. Cambia perciò la riga della tabella con il campo <input name="ALBUM_IMG" type="file" size="30"> così:
........
<tr>
<td>
<p>Nuova immagine: </p>
</td>
<td>
<input name="ALBUM_IMG" type="file" size="30">
</td>
</tr>
<cfif getAlbum.ALBUM_IMG NEQ "">
<tr>
<td valign="top">
<p>Vecchia immagine: </p>
</td>
<td>
<img src="album/#getAlbum.ALBUM_IMG#">
</td>
</tr>
</cfif>
........
Poiché non sempre un album possiede un'immagine, abbiamo dovuto inserire il controllo con <cfif> prima di creare la riga per mostrare la "vecchia" immagine.
Nota che il <cfform>, tramite l'attributo "action", punta al file aggiornamento.cfm. Nello stesso file quindi inseriremo la logica per aggiornare il record. Per sapere però quale è il record da aggiornare, dobbiamo passare insieme al form anche l'ID dell'album. Questo valore non deve essere modificato, né abbiamo interesse che sia visualizzato nel modulo. Possiamo quindi utilizzare un campo <input type="hidden">.
6. Inserisci all'interno del <cfform> il campo hidden che contenga l'ID dell'album:
...........
<p class="titolo">Aggiornamento dell'album</p>
<cfoutput>
<cfform action="aggiornamento.cfm" enctype="multipart/form-data">
<input type="hidden" name="ID_ALBUM" value="#getAlbum.ID_ALBUM#">
<table>
<tr>
<td> ...........
anche il nome di questo campo, come abbiamo fatto per gli altri, deve essere lo stesso del corrispondente nel database.
Sarà utile anche avere il nome del file immagine corrente.
7. Analogamente, inserisci un campo hidden nel form che contenga il vecchio nome del file. In questo caso non ci interessa che il nome del campo sia ALBUM_IMG, che tra l'altro è già assegnato al campo <input type="file">. Chiamiamolo ad esempio "vecchiaImmagine":
...........
<p class="titolo">Aggiornamento dell'album</p>
<cfoutput>
<cfform action="aggiornamento.cfm" enctype="multipart/form-data">
<input type="hidden" name="ID_ALBUM" value="#getAlbum.ID_ALBUM#">
<input type="hidden" name="vecchiaImmagine" value="#getAlbum.ALBUM_IMG#">
<table>
<tr>
<td> ...........
A questo punto il form è completo. Salva i file che hai modificato e prova ad aprire il file aggiornamento.cfm tramite il link che abbiamo messo in fondo a ciascuna scheda dell'album. Nella prossima lezione vedremo come agire sul DataBase.