Tutorial 3: Gestione Contatti

In questo tutorial espanderemo la semplice agenda in una gestione contatti, aggiungendo la tabella contatti che permette di raggruppare le diverse voci dell’agenda.

Nel nostro caso usiamo una tabella azienda a cui poi si legano, in una relazione molti ad uno, i contatti presenti in agenda.

Scarica i file usati per i tutorial 2 e 3.

Il database

Ecco il codice per la creazione della nuova tabella e la modifica dell’agenda.

CREATE TABLE `azienda` (
`idAzienda` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`ragSoc` VARCHAR( 50 ) NOT NULL ,
INDEX ( `ragSoc` )
) TYPE = MYISAM ;
 
ALTER TABLE `agenda` ADD `idAzienda` INT NOT NULL AFTER `idAgenda` ;

La maschera per l'azienda

Creiamo con il file objects/azienda.php la maschera per gestire le aziende:

class azienda extends P4A_Mask
{
	function azienda()
	{
		parent::P4A_Mask();
 
		// Definisce la sorgente dati usando l'oggetto p4a_db_source
		// ed indicando quali campi usare, la chiave primaria e 
		// l'ordinamento
		$this->build("p4a_db_source", "source");
		$this->source->setFields(array("azienda.*" => "*"));
		$this->source->setTable("azienda");
		$this->source->setPk("idAzienda");
		$this->source->addOrder("ragSoc");
		// massimo numero di righe caricate alla volta
		$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->idAzienda->setSequence("idAzienda");
 
		// associa la sorgente dati alla maschera e si posiziona
		// sulla prima riga
		$this->setSource($this->source);
		$this->source->firstRow();
 
		// 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("ragSoc"));
		
		// Per consentire il cambio pagina nella tabella si
		// utilizza una speciale barra di navizione già preconfigurata
		$table->showNavigationBar();
 
		//Fieldset con l'elenco dei campi
		$fset=& $this->build("p4a_fieldset", "frame");
		$fset->setTitle("Gestione Aziende");
 
 		$fset->anchor($this->fields->idAzienda);
		$fset->anchor($this->fields->ragSoc);
 
		// Frame principale
		$frm=& $this->build("p4a_frame", "frm");
		$frm->setWidth(730);
		$frm->anchor($table);
  		$frm->anchor($fset);
 
		// Visualizzazione
		$this->display("main", $frm);
		
		// Toolbar 
		$this->build("p4a_standard_toolbar", "toolbar");
		$this->toolbar->setMask($this);
		$this->display("top", $this->toolbar);
	}
}

Il menù

Se lanciamo ora l’applicazione verrebbe visualizzata sempre e solo la maschera dell’agenda: infatti definendo l’applicazione abbiamo appunto detto di aprire, al caricamento, la maschera agenda. Per consentire la scelta di quale maschera utilizzare sono disponibili i classici menù.

Ecco la versione modificata dell’applicazione che inserisce un menù Contatti, a cui son associate le sottovoci Aziende ed Agenda:

class contatti extends P4A
{
	// Costruttore della classe
	function contatti()
	{
		
		parent::p4a();
 
		// Definizione del menù contatti
		$this->build("p4a_menu", "menu");
		$this->menu->addItem("contatti", "C&ontatti");
	
		// aggiunge al menù la voce Aziende ed associa all'evento onClick
		// la chiamata alla funzione menuClick
		$this->menu->items->contatti->addItem("azienda","Aziende");
		$this->intercept($this->menu->items->contatti->items->azienda,
						"onClick", "menuClick");
		// procede come sopra per la voce Agenda
		$this->menu->items->contatti->addItem("agenda","Agenda");
		$this->intercept($this->menu->items->contatti->items->agenda,
						"onClick", "menuClick");
 
		$this->openMask("agenda");
		//$this->openMask("azienda");
	}
 
	// Cattura l'evento onClick sul menù aprendo la maschera
	// che porta il nome della voce di menù stessa 
	function menuClick()
	{
		$this->openMask($this->active_object->getName());
	}
 
}

Ora basta aggiungere la visualizzazione del menù in ciascuna maschera, inserendo la seguente riga dopo la visiualizzazione del frame principale:

		$p4a =& p4a::singleton();
		$this->display("menu", $p4a->menu);

Questa visualizza nell’area menu del template il nostro menù definito, per comodità ed univocità, a livello di applicazione.

Uso di controlli avanzati

ComboBox

Un controllo sicuramente interessante è la combobox, che nella gestione dei contatti permette, inserendo un contatto in agenda, di scegliere l’azienda a cui associarlo non con un codice ma dall’elenco dei nomi delle aziende.

Ecco il codice per aggiungere la combobox (aggiungerlo prima della definizione del fieldset):

		// Definisce la sorgente dati per collegare la combo
		// dell'azienda alla corrispondente tabella
		$azienda =& $this->build("P4A_DB_Source","azienda");
		$azienda->setTable("azienda");
		$azienda->setPK("idAzienda");
		$azienda->load();
 
		// definisce la combo, associandone la sorgente dati
		// a quella dell'azienda, specificando quale campo
		// visualizzare al posto dell'idAzienda e personalizzando
		// l'etichetta 
		$this->fields->idAzienda->setLabel("Azienda");
		//$fields->idAzienda->setWidth(200);
		$this->fields->idAzienda->setType("select");
		$this->fields->idAzienda->setSource($azienda);
		$this->fields->idAzienda->setSourceDescriptionField("ragSoc");

Come si vede fondamentale è la definizione di una seconda sorgente dati che viene legata alla combo con la funzione setSource; in questo caso la sorgente è una tabella del database, ma spesso, vedremo, viene utilizzato un array come sorgenge dati.

Viene quindi creata un’associazione tra il valore che la combo box deve registrare/visualizzare, la chiave primaria della nuova sorgente dati, ed il campo di descrizione, che viene definito con la funzione setSourceDescriptionField della combobox: in questo modo noi vediamo sempre il campo descrittivo, ma la combo gestisce la chiave (in questo caso il codice dell’azienda).

Quindi per visualizzare la combo basta aggiungerla nel fieldset con le seguenti righe:

 		$fset->anchor($this->fields->idAzienda);

Autore

AbiBepo

 
it/tutorials/gestione-contatti.txt · Last modified: 2007/01/03 12:56
 
Creative Commons License Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki