Guide e tutorial pratici per joomla e le sue estensioni
Guide e tutorial pratici per joomla e le sue estensioni

Oggi in questa guida per chronoconnectivity V5 vedremo come mettere in relazione le tabelle fra loro. Chi ha già lavorato con i database sa quanto è importante che i dati scritti in due o più tabelle siano prelevati ed organizzati secondo quanto ci fa più comodo.

Sarà utile per tutti coloro che sono alle prime armi ripassare almeno il "tutorial chronoconnectivity e chronoforms parte 2", in quanto non entrerò in particolari già trattati.

Vediamo se riesco a farmi capire meglio con un  piccolo esempio basato su una semplice web application per la gestione dei titoli di libri (intendiamoci, possono essere titoli di cd, di figurine, di riviste, di auto e di tanto altro).

Semplificando un pò, non staremo in questo caso ad organizzarci con le tabelle per la gestione completa di permessi di "chi può fare cosa" di cui ho parlato nell'articolo: "capire come progettare la nostra web application" , nel nostro database avremo quattro tabelle;

  1. libri
  2. autori
  3. editori
  4. generi

Quindi in libri avremo questi campi;

  • idLibro
  • nomeLibro
  • ksAutore
  • ksEditore
  • ksGenere
  • descrizioneLibro

mentre in autori avremo;

  • idAutore
  • nomeAutore

 In editori;

  • idEditore
  • nomeEditore

Infine in generi;

  • idGenere
  • nomeGenere

Le quattro tabelle vengono popolate attraverso quattro forms, ed i primi dati ad essere inseriti saranno quelli relativi agli Autori, ai Generi e poi agli Editori.

Procedere con un minimo di ordine per me è imperativo, e a dispetto di tanti colleghi che per pigrizia lasciano i nomi di default come campo1 o anche field1, io desidero sempre al primo sguardo rendermi subito conto di cosa parliamo, usando nomi univoci per campi, model e quant'altro. Quindi consiglio anche a voi di procedere in tal senso, eviterete complicazioni ed avrete una lettura instantanea di ciò che state facendo, senza contare che se avrete bisogno di aiuto in caso qualcosa non funzioni, le istruzioni che saranno leggibili e capibili, aiuteranno a farvi aiutare.

Ricordo anche che chronoconnectivity ha un utilissimo strumento di debug e che questo fornirà una lettura tanto più interpretabile quanto più userete nomi univoci!

Per i nomi delle tabelle e per i nomi dei campi ho adottato uno standard per semplificarmi il lavoro: per i nomi delle tabelle uso sempre dei nomi al plurale, quindi la tabella degli autori sarà "autori" e non "autore" , semplicemente perchè la tabella è un contenitore che contiene uno o più autori, mentre il campo del singolo autore sarà "nomeAutore", inserendo la prima lettera maiuscola sulla seconda parola o dalla "secondaParolaInPoi".

Questa precisione mi ha sempre garantito un risparmio notevole di tempo in caso qualcosa non andasse per il verso giusto, ed io consiglio anche a voi di avere un vostro standard se il mio non dovesse piacere.

Adesso nella form per la gestione dei titoli dei libri (o qualsiasi altra cosa), quando andremo ad inserire l'autore, l'editore e infine il genere, lo faremo andando a selezionare da una dropdownlist l'autore, l'editore ed il genere di quel titolo, andando a scrivere nei campi ksEditore, ksAutore e ksGenere (ks sta per chiave secondaria) l'idEditore di quell'editore e l'idAutore di quell'autore e l'idGenere del titolo in questione, ottenendo una tabella con dei dati non molto leggibili:

idLibro | nomeLibro | ksAutore | ksEditore | ksGenere | descrizioneLibro
1 | Gomorra | 5 | 12 | 8 | la descrizione....

Sapere che l'autore ha un id pari a 5, l'editore pari a 12 ed il genere pari a 8, serve a poco e poi gli unici che potrebbero sapere a cosa corrispondono, sarebbero coloro che si occupano di inserire questi dati. D'altra parte inserire direttamente il nome ad ogni inserimento causerebbe una ingiustificata ridondanza dei dati vanificando anche tutti i vantaggi di avere un database.

 chronoforms relazioni fra tabelle

La soluzione sarebbe quella di mettere in relazione le quattro tabelle tra loro in modo tale che quando andremo a visualizzare la nostra lista su chronoconnectivity non dovremo fare salti mortali per ricordarsi un determinato id a cosa corrisponde. 

 chronoforms relazioni fra tabelle

Vediamo come ottenere una vista completa dei nomi mettendo in relazione le varie tabelle, conseguendo ciò che ci viene mostrato nell'immagine successiva:

chronoforms relazioni fra tabelle

Come primo passo sarà necessario creare tre nuovi MODEL nella nostra connessione in chronoconnectivity. Semplificando, un MODEL è un MODELLO di come verranno rappresentati dei dati, e chronoconnectivity per stampare a video una lista di dati ha bisogno almeno di un MODEL, inoltre nella scheda MODEL di chronoconnectivity V5 si imposta la tabella da dove verranno estratti questi dati.

chronoforms relazioni fra tabelle

Il mio MODEL per la lista in figura 1 si chiama "titoli" ed è collegato alla tabella "libri". Nessun'altra impostazione è necessaria per questo MODEL.

Quindi dobbiamo creare altri tre MODEL, uno per ogni tabella che vogliamo "relazionare" alla tabella "titoli" del database: premiamo sul pulsante "Add new model" e creiamo i tre MODEL necessari nominandoli "AUT" per la tabella autori, "GEN" per la tabella generi e "EDI" per la tabella editori.

Al loro interno configureremo i seguenti box:

  • Model Title: inserite il nome del model associato
  • Table Name: scegliete la tabella relativa al model
  • Relation: BelongsTo
  • Associative Save: NO
  • Associative Delete: NO
  • Foreign Key: inserite la chiave secondaria presente nella tabella libri, quindi ksAutore per il MODEL "AUT", ksGenere per il MODEL "GEN" e ksEditore per il MODEL "EDI"
 chronoforms relazioni fra tabelle

Adesso non rimane altro che editare ciò che abbiamo inserito nei box: "Columns list" e "Sortables" ed eventualmente se ne avete fatto uso nei box "View linkable" e "Edit linkable", andando ad editare le tre voci corrispondenti a ksAutore, ksGenere e ksEditore da così:

titoli.idLibro:id
titoli.titoloLibro:titolo
titoli.ksAutore:Autore
titoli.ksGenere:Genere
titoli.ksEditore:Editore
titoli.created:Inserito
titoli.state:Disponibile

a così

titoli.idLibro:id
titoli.titoloLibro:titolo
AUT.nomeAutore:Autore
GEN.nomeGenere:Genere
EDI.nomeEditore:Editore
titoli.created:Inserito
titoli.state:Disponibile

In pratica abbiamo istruito chronoconnectivity dicendogli di andare a stampare a video il contenuto presente nel campo quando la chiave primaria delle tabelle "editore", "genere" e "autore" (idEditore, idGenere e idAutore) corrisponde alla chiave secondaria della tabella "libri" (ksEditore, ksGenere e ksAutore).

Se aveste utilizzato uno di questi campi (ksEditore, ksGenere e ksAutore) per la modifica (Edit linkable), per la vista del dettaglio (View linkable) e per il riordino (Sortables), dovrete rinominare le stringhe anche nei corrispondenti box.

Questa guida termina qui, se avete dubbi postate sui commenti. Se volete potete offrirmi un caffè cliccando nel pulsante sottostante, oppure cliccate su uno dei banner pubblicitari.

offrimi un caffè

Commenti   

0 # adriano 2016-06-15 01:00
Seguendo l'eccellente tutorial, sono riuscito a programmare um form e una lista dei records con CC e usando la lista scegliere un record per poi editare i campi con una separata copia del form. Fino qui tutto va bene e i campi del "edit-form" vengono "populati" con i dati del record scelto. Pero con eccezione di un campo file field che uso per salvare il nome del file e per copiare il file nel directory /upload. nel form originale tutto funziona, solo non nel "edit-form". Lasciandolo vuoto, mi cancella il campo del database quado salvo il record modificato.
Come posse far populare il file field con i dati originali oppure como posso evitare che mi cancelli il campo se rimane vuoto ?

Grazie per l'aiuto
Adriano

Per pubblicare un commento devi registrarti