Iniziamo la gestione dei database con un esempio classico, la rubrica:
Scarica i file usati per il tutorial 2 e 3.
Ecco il database di esempio:
# GRANT USAGE ON * . * TO 'database'@'%' # GRANT ALL PRIVILEGES ON `database` . * TO "database"@ "%" WITH GRANT OPTION ; CREATE TABLE `agenda` ( `idAgenda` INT NOT NULL , `cognome` VARCHAR( 40 ) NOT NULL , `nome` VARCHAR( 40 ) NOT NULL , `telefono` VARCHAR( 15 ) NOT NULL , `email` VARCHAR( 40 ) NOT NULL , PRIMARY KEY ( `idAgenda` ) );
Ecco il file index.php usato per avviare l’applicazione:
<?php
// Ridefinisce i parametri della connessione al database per
// questa applicazione
define("P4A_DSN", 'mysql://databaselocalhost/database');
// Carica le librerie del framework
require_once( dirname(__FILE__) . '/../../p4a.php' );
// Istanzia la classe che definisce l'applicazione hello_world.
// La classe si trova nella sottodirectory objects in un file
// con lo stesso nome della classe
// TODO: testare se i nomi di classe/file sono sensibili alle maiuscole
$app =& p4a::singleton("contatti");
// Lancia l'applicazione
$app->main();
?>
Ed ecco invece il file objects/contatti.php che definisce l’applicazione:
<?php class contatti extends P4A { // Costruttore della classe function contatti() { parent::p4a(); $this->openMask("agenda"); } } ?>
Ecco la base di partenza per la nostra mascheda di accesso alla tabella agenda:
<?php class agenda extends P4A_Mask { // costruttore function agenda() { parent::P4A_Mask(); // Definisce la sorgente dati usando l'oggetto p4a_db_source // ed indicando quali campi usare, la chiave primaria e // l'ordinamento e il massimo numero di righe caricate alla volta $this->build("p4a_db_source", "source"); $this->source->setFields(array("agenda.*" => "*")); $this->source->setTable("agenda"); $this->source->setPk("idAgenda"); $this->source->addOrder("cognome"); $this->source->addOrder("nome"); $this->source->setPageLimit(10); $this->source->load(); // indica che nelle nuove righe questo campo utilizza un // autoincremento, secondo le specifiche del tipo di database $this->source->fields->idAgenda->setSequence("idAgenda"); // associa la sorgente dati alla maschera e si posiziona // sulla prima riga $this->setSource($this->source); $this->source->firstRow(); //Fieldset (contenitore) con l'elenco dei campi $fset=& $this->build("p4a_fieldset", "frame"); $fset->setTitle("Agenda Contatti"); $fset->anchor($this->fields->idAgenda); $fset->anchor($this->fields->cognome); $fset->anchorLeft($this->fields->nome); $fset->anchor($this->fields->telefono); $fset->anchor($this->fields->email); // Frame principale che contiene gli altri contenitori $frm=& $this->build("p4a_frame", "frm"); $frm->setWidth(730); $frm->anchor($fset); // Visualizzazione $this->display("main", $frm); } } ?>
Si noti che specificando l’autoincremento si demanda la gestione del progressivo al framework, non al database stesso.
A questo punto veniamo posizionati sul primo record della tabella ma non possiamo ancora eseguire nessuna operazione sul database. Ci viene in soccorso la classica toolbar con gli strumenti classici per la navigazione. E sufficente aggiungere in fondo al costruttore le seguenti righe:
// Toolbar $this->build("p4a_standard_toolbar", "toolbar"); $this->toolbar->setMask($this); $this->display("top", $this->toolbar);
Per visualizzare una maschera con i classici pulsanti di spostamento, inserimento, salvataggio, cancellazione, ....
Un altro utilissimo strumento di navigazione può essere realizzato con una tabella che riepiloga i record presenti in archivio consentendo un rapido scorrimento e poisizionamento.
Ecco il codice da usare al posto del blocco usato prima nella definizione del frame principale:
// Tabella riepilogativa: viene associata la tabella alla // stessa sorgente dati della maschera, quindi si impostano // le colonne, tra i campi della sorgente, da visualizzare $table =& $this->build("p4a_table", "table"); $table->setWidth(700); $table->setSource($this->source); $table->setVisibleCols(array("cognome","nome")); //$table->cols->product_id->setLabel("Cod. Product"); // Per consentire il cambio pagina nella tabella si // utilizza una speciale barra di navizione già preconfigurata $table->showNavigationBar(); // Frame principale $frm=& $this->build("p4a_frame", "frm"); $frm->setWidth(730); //$frm->anchorCenter($message); $frm->anchor($table); $frm->anchor($fset);
AbiBepo