|
Una delle tecniche più interessanti usate nella realizzazione di template per Joomla è appunto quella di combinare codice php e codice html per realizzare effetti particolare come, ad esempio, il cosidetto collasso delle colonne in una pagina.
In un template per Joomla le "colonne" altro non sono che box container realizzati con il tag <div>. Quindi il "collasso" altro non è che condizionare la visualizzazione di un box container <div> al verificarsi di determinate condizioni, quali la presenza di moduli pubblicati in una determinata posizione modulo, per dare spazio ai container adiacenti.
Supponiamo di avere un template così disegnato:

in rosso ho segnato i nomi delle posizioni modulo corrispondenti, mentre in nero i nomi delle classi del foglio di stile con cui sono formattati i container <div>. Alcuni nomi di posizioni modulo corrispondono ai nomi delle classi di stile.
Questo è il codice che troveremo nel file index.php
<div class="header">
<jdoc:include type="modules" name="logo" style="xhtml" />
</div>
<div class="breadcrumbs">
<jdoc:include type="modules" name="breadcrumbs" style="xhtml" />
</div>
<div class="main-container">
<div class="side-left">
<jdoc:include type="modules" name="left" style="xhtml" />
</div>
<div class="content">
<jdoc:include type="message" />
<jdoc:include type="component" />
</div>
<div class="side-right">
<jdoc:include type="modules" name="right" style="xhtml" />
</div>
</div>
<div class="footer">
<jdoc:include type="modules" name="footer" style="xhtml" />
</div>
Come vedete la disposizione del codice prevede 6 container <div> disposti in sequenza uno dopo l'altro. La disposizione affiancata dei tre container <div> di classe side-left, content e side-right viene realizzata utilizzando le classi del foglio di stile:
.header{
width: 980px;
height: 70px;
border: 1px solid green;
}
/* ------- zona centrale della pagina --------- */
.main-container{
width: 980px;
height: 200px;
}
.side-left{
width: 190px;
height: 200px;
float: left;
border: 1px solid red;
}
.content{
width: 590px;
height: 200px;
float: left;
border: 1px solid cyan;
}
.side-right{
width: 190px;
height: 200px;
float: left;
border: 1px solid black;
}
/*-----------------------------------------------*/
.footer{
width: 980px;
height: 70px;
float: left;
border: 1px solid green;
}
In questa situazione abbiamo assegnato ai tre box container una larghezza fissa in pixel suddividendo un'area complessiva di 980pixel. Ovviamente ho inserito solo quelle proprietà di stile che mi interessava vedere, in un template vero e proprio potremmo averne altre in più.
Collassare una colonna significa non visualizzare il box container che la crea. Se vogliamo collassare la colonna destra del template non dobbiamo permettere la visualizzazione del tag <div class="side-right"> ... </div> e, ovviamente, di tutto ciò che contiene. Questo è possibile farlo solo a condizione che non vi siano moduli pubblicati nella posizione modulo right.
In Joomla è presente la funzione countModules('nome_posizione') che restituisce il numero di moduli che sono pubblicati nella posizione specificata tra parentesi.
Vediamo come usarla all'interno del codice del nostro template:
<div class="main-container">
<div class="side-left">
<jdoc:include type="modules" name="left" style="xhtml" />
</div>
<div class="content">
<jdoc:include type="message" />
<jdoc:include type="component" />
</div>
<div class="side-right">
<jdoc:include type="modules" name="right" style="xhtml" />
</div>
</div>
Se notate sono state aggiunte due righe di codice, una prima e una dopo il box container <div class="side-right">; questo è codice php. In php l'istruzione if consente di eseguire un blocco di codice al verificarsi di una determinata condizione. La sintassi (il termine è identico a quello che usiamo nella lingua italiana: il modo corretto di scrivere una frase) è la seguente: Le parentesi graffe racchiudono il blocco di istruzioni da eseguire se la condizione è vera. Ovviamente, contenendo il file index.php del codice html non possiamo scriverla così, dobbiamo anteporre e far seguire i due simboli che iniziano ( ) un blocco di codice php all'interno di una pagina html. Se all'interno dell'istruzione if ci sono dei tag html ovviamente la chisura del blocco di codice php va messa prima perchè i tag html devono essere liberi di essere interpretati.
A questo punto, se disattiviamo tutti i moduli presenti nella posizione modulo right e visualizziamo la pagina avremo una sorpresa:

La colonna di destra e il suo contenuto spariscono ma il resto non si posta di un pixel, perchè? Semplicemente perchè nel foglio di stile sono stati assegnate a questo box container delle dimensioni fisse espresse in pixel.
Quindi, quando si collassa la colonna destra (il box container non viene visualizzato) è necessario che il container di classe "content" aumenti le sue dimensioni di un valore pari a quello del box container "right"
Nel foglio di stile aggiungiamo una classe che chiameremo content_wide
.content_wide{
width: 785px;
float: left;
}
in cui le dimensioni di larghezza sono 600+190=790px. A questo punto modifichiamo il codice del file index.php come segue:
<div class="main-container">
<div class="side-left">
<jdoc:include type="modules" name="left" style="xhtml" />
</div>
<div class="">
<jdoc:include type="message" />
<jdoc:include type="component" />
</div>
<div class="side-right">
<jdoc:include type="modules" name="right" style="xhtml" />
</div>
</div>
La prima modifica riguarda la creazione di una variabile $classe_contenuti a cui verrà assegnato il nome della classe di stile da utilizzare se sono presenti o meno moduli nella posizione right. Se la leggiamo in linguaggio umano il costrutto php può leggersi così:
SE (ci sono moduli nella posizione right) {
$classe_contenuti contiene 'content';
ALTRIMENTI
$classe_contenuti contiene 'content_wide';
FINE SE
La seconda moficica riguarda il container <div> adibito ai contenuti. In questo caso viene aggiunta una istruzione php che stampa il valore della variabile $classe_contenuti. Quindi avremo:
se ci sono moduli nella posizione right verrà visualizzato
<div class="content">
se non ci sono moduli nella posizione right verrà visualizzato
<div class="content-wide">
Il risultato sarà il seguente:
 E se volessimo aspandere l'area dei contenuti a seconda della presenza della colonna sinistra piuttosto che della destra o addirittura se ambedue vengono collassate?
Il principio è sempre lo stesso: - definire una o più classi di stile per il container "content" con larghezze diverse e nomi di classe diversi - controllare la presenza dei moduli nelle posizioni modulo right e left - in base a quali colonne collassano applicare al container adibito ai contenuti una classe di stile piuttosto che un'altra.
Nel fogli di stile potremmo definire queste due classi di stile per i contenuti:
.content_wide{
width: 785px;
float: left;
height: 200px;
border: 1px solid cyan;
}
.content_extra{
width: 980px;
float: left;
height: 200px;
border: 1px solid cyan;
}
Nel codice del template controlliamo anche la presenza di moduli nella posizione left in questo modo:
<div class="side-left">
<jdoc:include type="modules" name="left" style="xhtml" />
</div>
Per assegnare la classe di stile al container dei contenuti facciamo un ragionamento:
Se (ci sono moduli nella posizione right) e allo stesso tempo (ci sono moduli nella posizione left { $classe_contenuti contiene 'content'; } altrimenti { se (ci sono moduli nella posizione right) oppure (ci sono moduli nella posizione left) { $classe_contenuti contiene 'content_wide'; } altrimenti { $classe_contenuti contiene 'content_extra'; }
Secondo questo ragionamento, se le prime condizioni sono vere vuol dire che in tutte e due le posizioni modulo right e left ci sono moduli, quindi averemo tre colonne, se non è vero può voler dire che o i moduli sono pubblicati in una delle due colonne (quindi allarghiamo l'area dei contenuti di 190 pixel) oppure non ci sono moduli ne nella posizione right ne in quella left, quindi allarghiamo al massimo l'area dei contenuti.
Il tutto si traduce in questo codice php:
<?php
if ($this->countModules('left') && $this->countModules('right')) {
$classe_contenuti = 'content';
} else {
if ($this->countModules('left') || $this->countModules('right')) {
$classe_contenuti = 'content_wide';
} else {
$classe_contenuti = 'content_extra';
}
}
?>
Nel linguaggio php il simbolo && equivale all'operatore di relazione AND mentre il simbolo || all'operatore di relazione OR. Quando una condizione è composta da due o più sottocondizioni esse vengono legate tra loro da operatori di relazione logici o booleani. Affermare che a = b può essere vero o falso, affermare che (a=b AND c=d) può essere vero solo se ambedue le condizioni sono uguali, inqualsiasi altro caso la condizione complessiva è falsa. Usando l'operatore logico OR (a=b OR b=c) è sufficiente che una delle due affermazioni sia vera per rendere vera l'intera condizione.
Se la spiegazione è difficile da comprendere sostituite all'operatore AND la frase "e allo stesso tempo" e all'operatore OR la parola "oppure", vi verrà più semplice dire (a=b e allo stesso tempo c=d) e capirne il significato. Questo è tutto. |