Banner Shishii
Pagina aggiornata il:  1/01/2007 06:53

Pagina Stampabile     Pagina Stampabile

Barra di Navigazione

Molto spesso, il gestore di un sito web, ha la necessità di rappresentare una serie di records, in genere prelevati da un qualunque tipo di database. Se questi records sono troppi per essere inseriti in un'unica pagina nasce la necessità di suddividerli su più collegate tra loro.

Il sistema più usato poichè considerato semplice ed efficace, è quello della barra di navigazione.

Qui sotto ne abbiamo un esempio:




Se stiamo usando pagine statiche (.html) non abbiamo altra scelta che fare le pagine, la suddivisione dei records nelle stesse, e la barra di navigazione a mano, ma se stiamo usando un sistema di generazione dinamica delle pagine, ad esempio tramite CGI, allora possiamo fare generare il tutto da un nostro script.

In questo tutorial verrà presentato solo un modulo Perl da inserire nei propri scripts (Perl ovviamente) per facilitare notevolmente la generazione dinamica della barra di navigazione.


I moduli Perl

I moduli Perl sono files che hanno come estensione finale ".pm" che consentono di utilizzare del codice che svolge mansioni anche complesse, senza che l'utilizzatore ne debba conoscere il funzionamento. Ciò che il programmatore deve sapere sono quali dati fornire al modulo e quale risultato ottiene.

Una enorme raccolta di questi moduli si trova su CPAN.

Per convenzione i moduli Perl si usano in questo modo:


1  #!/usr/bin/perl
2  
3  use NOME_MODULO;
4  
5  my $obj = NOME_MODULO->new(ATTRIBUTI);
6  
7  $obj->METODO(PARAMETRI); # se il metodo non restituisce nulla
8  $risultato = $obj->METODO(PARAMETRI); # se il metodo restituisce qualcosa
Dove:
Alla riga 3 tramite l'istruzione use invochiamo e carichiamo il modulo;
Alla riga 5 inizializiamo la classe e creiamo il riferimento - $obj - che useremo per interaggire con essa. Alcuni moduli richiedono il passaggio di alcuni attributi in fase di inizializzazione;
Alla riga 7 o 8 utiliziamo le funzionalità del modulo tramite un suo metodo, che può richiedere o meno dei parametri e può o meno restituire qualcosa.

Sia gli "attributi" che i "parametri" non sono altro che dei dati (variabili, array, hash, ecc) che vengono passati al modulo. La differenza è che i primi vengono usati solo in fase di inizializzazione, mentre i secondi ad ogni uso dei vari metodi del modulo.


Modulo BarraNav.pm

Vediamo ora l'uso del modulo che propongo. La cosa migliore è presentare del codice di esempio.


 1  #!/usr/bin/perl -w
 2
 3  use strict;
 4  use CGI;
 5  use CGI::Carp qw(fatalsToBrowser);
 6  use lib ".";
 7  use MyPM::BarraNav;
 8
 9  my $cgi = CGI->new;
10
11  my $bar = BarraNav->new(
12     {
13     'element_tot'     => 698, # totale elementi da paginare
14     'element_x_pag'   => 10,  # numero max di elementi per pagina
15     'pag_vis'         => 7,   # numero di numeri di pagina da visualizzare
16     'url'             => 'http://sito/cgi-bin/barra.pl' # URL di base
17     }
18  );
19
20  my $style = qq(
21  A {color: blue; text-decoration: none;}
22  A:hover {color: red; text-decoration: underline;}
23  );
24
25  # con questo hash si definiscono gli elementi di formattazione
26  # della barra.
27  # per l'elemento della barra dei totali si possono usare gli indici
28  # %p per la pagina
29  # %t per il totale
30  # la place_label definisce dove si vogliono i totali ed 
    # ammette 'before' e 'post'
31  my %format = (
32     'first'           => 'Start ',
33     'back'            => ' <',
34     'last'            => ' End',
35     'next'            => '>',
36     'delimit_left'    => '[',
37     'delimit_right'   => ']',
38     'label_total'     => 'Pagina %p di %t',
39     'place_label'     => 'post'
40  );
41
42  # il metodo 'barra' ammette due parametri:
43  # $bar->barra($posizione, \%formattazione))
44  # il primo e' la posizione attuale di pagina
45  # il secondo l'hash di formattazione
46  # sono entrambe facoltativi
47  my $barra = $bar->make($cgi->param('pos'), \%format);
48
49  print $cgi->header(),
50        $cgi->start_html(-style=>{-code=>$style}),
51        $cgi->h1({-align=>'center'}, "Elenco Records"),
52        $cgi->p({-align=>'center'}, "<font color='red'>Testo e immagini 
          precedenti la tabella</font>"),
53        $cgi->p({-align=>'center'}, $barra);
54  print qq(<table border=1 align='center' width=500>
55        <tr><td>1</td><td>testo</td></tr>
56        <tr><td>2</td><td>testo</td></tr>
57        <tr><td>3</td><td>testo</td></tr>
58        <tr><td>4</td><td>testo</td></tr>
59        <tr><td>5</td><td>testo</td></tr>
60        <tr><td>6</td><td>testo</td></tr>
61        <tr><td>7</td><td>testo</td></tr>
62        <tr><td>8</td><td>testo</td></tr>
63        <tr><td>9</td><td>testo</td></tr>
64        <tr><td>10</td><td>testo</td></tr>
65        </table>
66        "),
67        $cgi->p({-align=>'center'}, $barra),
68        $cgi->p({-align=>'center'}, "<font color='red'>Testo e immagini 
          finali</font>"),
69        $cgi->end_html();
70
71  exit;

Le linee di maggiore interesse, essenziali per capire l'uso del modulo sono le seguenti:

Righe 6 - 7

tramite use lib "."; si dice all'interprete di Perl di cercare i moduli che seguono anche nella directory ove si trova lo script stesso. Questo si rende necessario perchè staimo usando un modulo personale che non viene istallato in una directory di sistema (l'elenco delle directory di sistema in cui Perl cerca i moduli è contenuto nell'array @INC.

Invece use MyPM::BarraNav; invoca e carica il modulo cercandolo nella directory MyPM contenuta nella directory in cui risiede lo script stesso.

Righe 11 - 18

In questo blocco il modulo viene inizializzato tramite l'istruzione my $bar = BarraNav->new(...);. Gli attributi vengono passati tramite un hash anonimo che prevede i seguenti elementi:

'element_tot' in cui indicare il numero totale degli elementi da paginare. Nell'esempio sopra riportato è stato usato un valore fisso, ma in un caso reale si userà un valore ricavato da un algoritmo che, ad esempio, interroga un database. Questo elemento è necessario e la sua omissione causa un errore.

'element_x_pag' in cui indicare il numero di elementi da inserire in ogni pagina. Se non viene settato nulla si usa il valore di default 10.

'pag_vis' in cui indicare il numero di pagine massimo da visualizzare nella barra di navigazione, se non viene settato nulla il default è 7. Ad esempio: se abbiamo un totale di 110 pagine, abbiamo scelto di visualizzarne 5, e ci troviamo a pagina 32, la barra potrebbe apparire così

               << < [30] [31] [32] [33] [34] > >>

'url' in cui settare l'url dello script stesso. Se non viene settato nulla il modulo cerca di ricavare questo dato dalla variabile d'ambiente SCRIPT_NAME, ma è opportuno inserirlo esplicitamente.

Righe 31 - 40

In questo blocco di righe viene predisposto il meccanismo di formattazione della barra di navigazione. Nel caso in cui non venga indicato nulla la barra apparirà come si vede sopra. Ad ogni modo gli elementi settabili sono:

'first' in cui indicare l'elemento che rappresenterà il ritorno alla prima pagina. Si può usare anche il link ad una immagine, ad esempio: <img src='freccia_sinistra.gif'>.

'back' in cui settare l'elemento che rappresenta l'andata alla pagina precedente alla attuale. Si può usare anche il link ad una immagine.

'last' in cui settare l'elemento che rappresenta l'andata all'ultima pagina. Si può usare anche il link ad una immagine.

'next'in cui settare l'elemento che rappresenta l'andata alla pagina successiva all attuale. Si può usare anche il link ad una immagine.

'delimit_left' in cui settare l'elemento che delimita a sinistra i numeri di pagina della barra. Si può usare anche il link ad una immagine.

'delimit_right'in cui settare l'elemento che delimita a destra i numeri di pagina della barra. Si può usare anche il link ad una immagine.

'label_total' in cui indicare una stringa che serva a rappresentare una descrizione, ad esempio "Pagina x di y". Nella stringa si possono inserire due wildcat "%p" a cui verrà sostituito il numero della pagina attuale e "%t" a cui verrà sostituito il totale delle pagine. Se non viene settato o viene inserita una stringa vuota la barra non viene creata.

'place_label' in cui settare la posizione in cui si desidera inserire la riga suddetta rispetto alla barra di navigazione. Sono ammessi due valori 'before' e 'post'.

Riga 47

In questa riga si vede come invocando il metodo 'make' viene generata il codice html della barra di navigazione. A questo metodo possono essere passati due parametri: il primo è il numro della pagina attuale, il secondo l'hash in cui è stata settata la formattazione della barra. Quest'ultimo parametro se manca è sostituito dagli elementi di formattazione di default. Questo codice viene raccolto nella variabile $barra ed usato dopo per la generazione della pagina web.

Chi è interessato al modulo e al codice di esempio lo può scaricare dalla sezione download di questo sito.


Indice del sito