La funzione dettaglio
Il nostro CMS inizia a prendere forma: nella lista dei record, oltre al pulsante iniziale per inserire nuovi elementi, per ciascuna riga abbiamo un pulsante modifica e copia. Dobbiamo occuparci ancora della funzione per visualizzare il dettaglio di un singolo record.
Per la verità la maggior parte dei problemi sono stati già risolti, il meccanismo sarà identico a quello della creazione del form ma semplificato: non ci sarà bisogno di diversificare i campi di input, ma basterà stampare la coppia costituita dal campo label
e dal valore assegnato per poi raccogliere tutto in una variabile $out
che conterrà la stringa HTML da stampare.
Procediamo con la SELECT
sulla tabella dei dati usando l'id passato in querystring, poi preleviamo la lista dei campi dalla tabella struttura
:
$out = '';
$sql = 'SELECT * FROM '.$this->tipo.' WHERE id='.$this->id;
$stmt = $db->prepare($sql);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$sql = 'SELECT * FROM struttura WHERE tabella="'.$this->tipo.'" AND visibile="1" order by ordine';
$dati = $db->prepare($sql);
$dati->execute();
while($array = $dati->fetch(PDO::FETCH_ASSOC)){
..
}
Per ogni riga della tabella struttura
che abbiamo deciso di rendere visibile andremo a chiamare il metodo creaText()
che ci permetterà di creare l'HTML necessario passandogli il valore e l'etichetta da associare:
$out.=$this->creaText($row[$array['nome']],$array['label']);
La stampa della stringa HTML sarà una versione semplificata della creazione dei form:
public function creaText($valore,$label){
$out='<div>';
$out.='<label>'.$label.'</label>';
$out.='<span>'.htmlentities(stripslashes($valore)).'</span>';
$out.='</div>';
return($out);
}
In questo modo riusciamo a costruire la scheda del contenuto che sarà abbastanza spartana, ma è possibile arricchire e personalizzare la presentazione aggiungendo altri parametri e stilizzazioni.
Eliminazione di un record
Anche l'operazione di eliminazione di un record in sé non pone grossi problemi, l'unico aspetto da tenere sotto controllo è quello di evitare le cancellazioni accidentali. Per ovviare a questo problema useremo una funzione Javascript tra il click sul bottone e l'invio della richiesta al server, questa funzione chiederà conferma dell'operazione e solo una volta accettato procederemo con l'eliminazione del record.
Per velocizzare la scrittura del codice useremo jQuery, libreria molto diffusa e di facile utilizzo. Partiamo dal link che sarà creato in questo modo:
<a class="elimina" data-id="'.$row[$key].'"><span class="glyphicon glyphicon-trash"></span></a>
La funzione Javascript sarà inclusa in un file js
esterno in modo da poterla utilizzare in tutte le pagine.
$(document).ready(function(){
$('.elimina').on('click',function(){
var id=$(this).data('id');
var scelta=window.confirm('Sei sicuro di voler eliminare il record?');
if(scelta){location.href='?azione=elimina&id='+id;}
})
});
In pratica agganciamo l'evento click
sui tag con classe elimina
, andiamo a leggere il valore dell'id stampato nell'attributo custom data-id
e mostriamo una finestra di conferma. Se l'utente accetta verrà ricaricata la pagina con azione elimina
e con l'id del record da eliminare.
Nella classe PHP abbiamo un metodo elimina()
che va a cancellare il record. Le due variabili che entrano in gioco, il nome della tabella e il valore dell'id, li abbiamo come proprietà dell'oggetto e quindi le informazioni necessarie sono al completo.
public function elimina(){
global $db;
$sql = 'DELETE FROM '.$this->tipo.' WHERE id='.$this->id.' LIMIT 1';
$stmt3 = $db->prepare($sql);
$stmt3->execute();
}
Questo metodo provvede all'eliminazione fisica del record dal database.
Conclusioni
Con quest'ultimo passaggio abbiamo completato le operazioni CRUD, create-read-update-delete, raggiungendo l'obiettivo di gestire i dati nelle tabelle del nostro database senza dover riscrivere codici tutto sommato molto simili. Creeremo un file per inizializzare la classe settando la proprietà tipo
con il nome della tabella e popoleremo la tabella struttura
con i dati relativi alla nuova tabella, l'unica convenzione richiesta è il campo chiave id
, ma volendo con qualche riga di codice in più anche questa convenzione potrebbe essere eliminata.