Blog

Tipi di TableHandler: una panoramica

Tipi di TableHandler: una panoramica

Come abbiamo visto nelle nostre Genropill Dal database alla web app in meno di 2 minuti, Da file excel al web app in meno di 3 minuti, Come creare un applicativo web da zero in pochi minuti con il Package Editor, grazie al Package Editor siamo riusciti a creare in pochissimo tempo lo scheletro di un mini-applicativo web: questo è stato reso possibile sfruttando un component di Genropy chiamato TableHandler.

In particolare il TableHandler si occupa della renderizzazione visuale dei contenuti della tabella che il modello (ovvero lo “scheletro”) rappresenta, operando su due fronti (che si presentano sotto forma di “classi” della risorsa):

  • una “View“, ovvero la griglia dei dati (record) della tabella
  • una “Form” per la visualizzazione e la gestione del singolo record

Nel momento in cui con il Package Editor importiamo un database o un file Excel, o generiamo il progetto da zero, ne definiamo innanzitutto il model, e secondariamente generiamo automaticamente le risorse, ovvero il complesso di view e form delle tabelle, tramite clic sul pulsante “Make resources“.

Si noti che ovviamente non è necessario partire dal Package Editor, ma il ragionamento è del tutto equivalente nel caso in cui si stesse definendo manualmente una tabella e le sue colonne e si generasse poi le risorse tramite l’apposito script gnrmkthresource

Quale che sia la strada intrapresa, sarà evidente sin da subito che Genropy elabora la complessa rete di relazioni tra le tabelle innestando dei TableHandler all’interno di altri TableHandler: se abbiamo una tabella albums, infatti, la Form automaticamente generata ci offrirà subito un dialogTableHandler con le tracks in relazione con l’album, stesso discorso vale per la tabella genres, dove avremo sempre le tracks di quel genere musicale.

È quindi possibile utilizzare i TableHandler all’interno di altri TableHandler, oppure nelle webpages.

Il risultato (non solo dal punto di vista estetico) può essere diverso a seconda del “tipo” di TableHandler che si desidera utilizzare, in particolare:

TipoForm
stackTableHandleral clic sul record, la Form si aprirà nella stessa finestra
dialogTableHandleral clic sul record, la Form si aprirà in una nuova finestra “dialog”
borderTableHandleral clic sul record, la Form si aprirà nella stessa finestra, sotto o a destra della view
plainTableHandlerLa Form è assente
inlineTableHandlerLa Form è integrata alla view (inline)
paletteTableHandleral clic sul record, la Form si aprirà in una nuova finestra “palette”

A seconda del caso d’uso può essere utile utilizzare un TableHandler piuttosto che un altro. Vogliamo solo visualizzare una lista dei record senza offrire un dettaglio dei singoli record? Allora opteremo per un plainTableHandler! Abbiamo poco spazio e pochi campi che però vogliamo far modificare all’utente? Allora lo scenario più plausibile è quello di un inlineTableHandler… Dobbiamo far compilare molti campi? Probabilmente la scelta migliore è lo stackTableHandler!

Inoltre indipendentemente dal tipo utilizzato è possibile utilizzare una serie di parametri per personalizzare ulteriormente il TableHandler e abilitare/disabilitare una serie di feature addizionali, per i quali si rimanda alla documentazione dedicata.

Si noti che i parametri che possiamo passare a ogni TableHandler sono quelli che usiamo nel metodo th_options della nostra risorsa!

Ad esempio, nel video prendiamo a titolo di esempio il nostro progetto musicproject, creato da un database di album, tracce musicali e relative fatture di acquisto, e vediamo l’utilizzo dei differenti TableHandler nella tabella albums, per visualizzare le varie tracce contenute in ciascun album:

center.dialogTableHandler(relation='@mu_tracks_albumid')

Sarà la relation specificata nel model della tabella tracks a individuare le tracce da visualizzare nella griglia del nostro TableHandler:

tbl.column('albumid',dtype='I',name_long='albumid'
     ).relation('albums.albumid',onDelete='raise')

In questo caso la relation viene individuata da un’implicita relation_name ‘@package_tabella_campoinrelazione’, alternativamente è possibile impostare un relation_name a piacere direttamente nella relation e richiamare quella nel TableHandler.

Vuoi vedere i vari tipi di TableHandler all’opera?


Il relatedTableHandler

Oltre a questi tipi di tablehandler, in caso di tabelle gerarchiche, è inoltre possibile utilizzare il relatedTableHandler, che si appoggia a un altro TableHandler per sfruttare a pieno le potenzialità delle tabelle gerarchiche, e quindi non mettere semplicemente insieme la view l’elenco gerarchico, la form della tabella principale e la griglia dei record in relazione, ma permettere anche l’interazione tra questi diversi componenti, rendendo possibile per esempio il trascinamento delle tracce da un genere a un altro.

Questo effetto può essere ottenuto con due semplicissime righe di codice:

th = center.plainTableHandler(relation='@tracks_by_genre')
form.htree.relatedTableHandler(th)

Con la prima riga mostriamo nella table gerarchica un plainTableHandler con tutte le tracce appartenenti al genere musicale “genitore”, con la seconda attiviamo su questo TableHandler anche il component speciale.

relatedTableHandler

Il thFormHandler

Infine, nel caso in cui sia necessario implementare la sola Form (escludendo quindi la griglia dei dati), per esempio su una pagina pubblica per l’inserimento di dati, è possibile utilizzare il thFormHandler. Anche in questo caso, con una sola riga di codice è possibile visualizzare in una webpage dedicata tutto ciò che abbiamo definito nella classe Form della nostra tabella:

th = root.thFormHandler(table='mu.genres', datapath='main.genres')

Nel nostro esempio essendo una tabella gerarchica il risultato comprenderà in realtà anche l’albero della gerarchia dei generi nonché le tracce per genere, incluso peraltro il relatedTableHandler che abbiamo definito precedentemente.

thFormHandler

Si noti che il thFormHandler ha un parametro particolare, startKey, che permette di aprire la Form direttamente su un record specifico o su un nuovo record.


Come abbiamo visto in un precedente tutorial, ricordiamo inoltre che ogni TableHandler può essere corredato di più classi View e Form, così da offrire differenti visualizzazioni a seconda dello scenario di utilizzo. Per richiamare una classe piuttosto che un’altra all’interno dei TableHandler invocati è sufficiente utilizzare i parametri:

viewResource='ViewDaUtilizzare'
formResource='FormDaUtilizzare'

Abbiamo insomma visto alcune casistiche molto semplici, ma abbiamo fornito una panoramica esaustiva di quante possibilità ci offre questo component di Genropy con pochissime righe di codice.

Ti interessa saperne di più? Il TableHandler ha una sua Documentazione dedicata:


Ti stai avvicinando al mondo Genropy e desideri saperne di più? Seguici sui social per tenerti in contatto con le ultime novità che Genropy ha da offrire:

Genropy Seguici su Facebook
Pagina Facebook

 

Genropy Seguici Gruppo Facebook
Gruppo Facebook

 

Genropy Gruppo Telegram
Gruppo Telegram