.. _le_stampe/stampe_genropy/stampe_risorsa/tipi_stampa/multipagina_con_griglia/doc: Doc === Ci si riferisce con **doc** ad un layout più interno rispetto a :ref:`page` , che contiene la stampa vera e propria che andremo a definire nella risorsa. Il **doc** è in un elemento :ref:`layout` ottenuto come risultato del metodo ``mainLayout``. Se questo metodo non viene ridefinito, questo layout viene poi suddiviso internamente in tre fasce. - Una fascia superiore detta *header* - Una fascia centrale destinata a contenere la griglia delle righe - Una fascia inferiore detta *footer* Sia l'header che il footer solitamente vengono usati per contenere i dati del record primario, in una stampa di tipo riga/fattura. .. note :: L'intera struttura così composta, viene ripetuta su ogni pagina, nel caso la stampa avesse un numero tale di righe da richiedere uno sviluppo su più pagine. mainLayoutParameters ~~~~~~~~~~~~~~~~~~~~ Se lo sviluppatore desidera variare :ref:`i parametri del layout` generale della stampa, in tal caso la soluzione migliore è implementare il metodo ``mainLayoutParameters``, il quale dovrà restituire un dizionario con i parametri desiderati. :: def mainLayoutParameters(self): style = """font-family:"Arial Narrow"; text-align:left; line-height:4mm; font-size:9pt; """ return dict(name='pageLayout', bottom=0, um='mm',top=0, left=0,right=0, border_width=0, lbl_height=4,lbl_class='caption', style=style) doc_header ed il metodo docHeader ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Indichiamo con il termine *doc_header* o *testata del documento* quella parte soprastante la griglia, che di norma ospita i dati del record primario nel caso di una stampa *master/detail*, oppure può mostrare il titolo della stampa o altre informazioni. Nell'esempio dell'estratto conto, mostrerà i dati del cliente e il periodo di riferimento, nel caso di una stampa ordine o fattura, troveremo la data e il numero di protocollo del documento. Tutta la definizione della testata di documento avviene nel metodo di hook: ``docHeader``, il quale riceve la cella contenitore, all'interno della quale lo sviluppatore può definire i *layout* necessari per realizzare la grafica desiderata. Vediamo come viene implementato il metodo ``docHeader`` nella stampa **mia_fattura** del package **fatt** definito nel progetto `Sandbox `_. :: def docHeader(self, header): layout = header.layout(name='doc_header', margin='5mm', border_width=0) row = layout.row() left_cell = row.cell(width=80) center_cell = row.cell() right_cell = row.cell(width=80) #DATI FATTURA fatt_layout = left_cell.layout('dati_fattura', lbl_class='cell_label', border_width=0) r = fatt_layout.row(height=8) r.cell(self.field('data'), lbl='Data') r = fatt_layout.row(height=8) r.cell(self.field('protocollo'), lbl='N.Fattura') #DATI CLIENTE cli_layout = right_cell.layout('dati_cliente', border_width=0) cli_layout.row(height=5).cell('Spett.') cli_layout.row(height=5).cell(self.field('@cliente_id.ragione_sociale')) cli_layout.row(height=5).cell(self.field('@cliente_id.indirizzo')) comune = self.field('@cliente_id.@comune_id.denominazione') provincia = self.field('@cliente_id.provincia') cli_layout.row(height=5).cell('%s (%s)' % (comune, provincia)) Notiamo come facendo uso degli elementi :ref:`layout` , :ref:`row` e :ref:`cell` si sia definita una semplice testata di documento con i dati del cliente e della fattura. .. hint:: Si noti che nel record saranno sempre disponibili solo le colonne "vere" del database, ad esclusione quindi di quelle `virtuali `_ che non siano state staticizzate. Per utilizzare quindi le colonne virtuali nell'header del documento, ad esempio, sarà quindi necessario specificare nel :ref:`Main della risorsa di stampa ` il parametro ``virtual_columns`` con le colonne da caricare per la stampa. Fa eccezione :ref:`la struttura della griglia` , dove invece le colonne virtuali saranno sempre automaticamente disponibili. doc_header_height e calcDocHeaderHeight ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Abbiamo detto che il layout generale della stampa (``mainLayout``) ha una superiore chiamata ``doc_header``. L'altezza del ``doc_header`` **deve essere specificata** affinché l'header venga visualizzato, o tramite l'attributo di classe ``doc_header_height``, o tramite un apposita procedura di calcolo. Nel caso in cui l'altezza dovesse essere calcolata in funzione dei dati, si può implementare nella risorsa il metodo di hook ``calcDocHeaderHeight`` il quale deve ritornare un valore numerico che rappresenterà l'altezza in millimetri. Ecco un esempio molto semplice di come si può far dipendere l'altezza dai dati. :: def calcDocHeaderHeight(self): if self.record['mostra_indirizzo']: return self.doc_header_height + 80 doc_footer ed il metodo docFooter ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Analogamente all'header definire il contenuto della fascia inferiore implementando il metodo ``docFooter``. Vediamo un esempio dell'implementazione del metodo definita nella risorsa **mia_fattura.py** del package **fatt** del progetto `Sandbox `_. :: def docFooter(self, footer, lastPage=None): l = footer.layout('totali_fattura',top=1, lbl_class='cell_label', content_class = 'footer_content') r = l.row(height=12) r.cell() r.cell(self.field('totale_imponibile'),lbl='Imponibile', width=20) r.cell(self.field('totale_iva'),lbl='IVA', width=20) r.cell(self.field('totale_fattura'),lbl='Totale', width=20) Il metodo ``docFooter`` riceve i seguenti parametri - ``footer``: un elemento di tipo **cell** nel quale possiamo definire il layout del piede di stampa - ``lastPage``: un boolean che dice se al momento dell'invocazione del metodo viene processata l'ultima pagina della stampa. Questo serve, se si desidera mostrare il footer solo in ultima pagina ed ometterlo nelle precedenti. .. hint:: Si noti che nel record saranno sempre disponibili solo le colonne "vere" del database, ad esclusione quindi di quelle `virtuali `_ che non siano state staticizzate. Per utilizzare quindi le colonne virtuali nel footer del documento, ad esempio, sarà quindi necessario specificare nel :ref:`Main della risorsa di stampa ` il parametro ``virtual_columns`` con le colonne da caricare per la stampa. Fa eccezione :ref:`la struttura della griglia` , dove invece le colonne virtuali saranno sempre automaticamente disponibili. doc_footer_height e calcDocFooterHeight ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Analogamente al caso del *doc_header*, l'altezza del ``doc_footer`` è data dall'attributo di classe ``doc_header_height``. Nel caso in cui l'altezza dovesse invece essere calcolata in funzione dei dati, si può implementare nella risorsa il metodo di hook ``calcDocFooterHeight``.