Stiamo lavorando da un po’ sulla prossima versione di Sar-At, che probabilmente verrà
chiamata Sar-At 11.0, e siamo in grado di annunciare quale sarà la maggior novità che
verrà introdotta nel software. Poiché si tratta di una modifica che aprirà molte nuovi
possibilità ai webdesigner e agli autori di siti web, abbiamo deciso di comunicare
anticipatamente di cosa si tratterà in modo da lasciare ai lettori di questo documento
tutto il tempo necessario per riflettere, studiare e pianificare.
Sar-At 11 introdurrà un nuovo sistema per la produzione di pagine mastro, molto più
flessibile di quello usato sino ad oggi. I template grafici potranno venire arricchiti con
il sistema Twig.
Approccio a Twig
Il primo approccio a Twig, per chi viene da Sar-At, è tranquillizzante. Ci sono differenze
di sintassi ma la logica che si può applicare è la stessa. Per esempio, considerate la
pagina visibile sul web come
http://www.accomazzi.it/TlibriI121.html
La sua pagina mastro sotto Sar-At 10 è fatta così:
{INCLUDE al-header.ihtml}
<div role="main">
<div class="contenitore">
<div class="boxSx">
{INCLUDE al-boxsx-menu.ihtml}
<div class="box-center-inside">
<ul class='main-ul'>
{BEGIN trova_faq_rilevanti}
<li> » <a href="TfaqI{id}.html">{title}</a></li>
{END trova_faq_rilevanti}
</ul>
</div>
</div>
{INCLUDE al-box-destra.ihtml}
<div class="centrale">
<div class='divider'>
<!-- star cnt -->
<h1>{title}</h1>
<div class="imgCentrale"><img alt="{title}"
src="{copertina}" /></div>
<div>
<p>{testo}</p>
{IF link}<p><a href='{link}'>Sommario dettagliato del
libro</a></p>{ENDIF link}
{IF editore}<p><strong>Casa editrice:</strong>
{editore}.</p>{ENDIF editore}
{IF prezzo}<p><strong>Prezzo e
disponibilità:</strong> {prezzo}.</p>{ENDIF prezzo}
</div>
<!-- end cnt -->
</div>
</div>
<!-- end centrale -->
</div>
<!-- end contenitore -->
</div>
<!-- end main -->
<footer>
<p>Ultima revisione: {lastMod} - © 1984-2014 Luca Accomazzi, tutti i
diritti riservati</p>
</footer>
Ed ecco la sua versione Twig per Sar-At 11:
{{ include('al-header.ihtml') }}
<div role="main">
<div class="contenitore">
<div class="boxSx">
{{ include('al-boxsx-menu.ihtml') }}
<div class="box-center-inside">
<ul class='main-ul'>
{% for faq in trova_faq_rilevanti %}
<li> » <a href="TfaqI{{ faq.id }}.html">{{ faq.title
}}</a></li>
{% endfor %}
</ul>
</div>
</div>
{{ include('al-box-destra.ihtml') }}
<div class="centrale">
<div class='divider'>
<!-- star cnt -->
<h1>{{title}}</h1>
<div class="imgCentrale"><img alt="{{title}}"
src="{{copertina}}" /></div>
<div>
<p>{{testo}}</p>
{% if link %}<p><a href='{{link}}'>Sommario
dettagliato del libro</a></p>{% endif %}
{% if editore %}<p><strong>Casa editrice:</strong>
{{editore}}.</p>{% endif %}
{% if prezzo %}<p><strong>Prezzo e
disponibilità:</strong> {{prezzo}}.</p>{% endif %}
</div>
<!-- end cnt -->
</div>
</div>
<!-- end centrale -->
</div>
<!-- end contenitore -->
</div>
<!-- end main -->
<footer>
<p>Ultima revisione: {{lastMod|date("d/m/Y")}} - © 1984-2014
Luca Accomazzi, tutti i diritti riservati</p>
</footer>
In effetti le somiglianze sono così forti che stiamo lavorando su un sistema di traduzione
automatica dal vecchio formato a quello nuovo. Il quale sarà comunque opzionale: Sar-At 11
continuerà a supportare le pagine mastro vecchio stile e a consentirne la produzione di
nuove.
Una marcia in più
Twig, il cui sito istituzionale si trova all’indirizzo
twig.sensiolabs.org, offre molte
funzionalità che non sono possibili nel contesto delle pagina mastro così come le abbiamo
usate sino ad oggi.
Tanto per cominciare, le pagine mastro vecchio stile di Sar-At dispongono di una
istruzione IF piuttosto minimalista. Possiamo scrivere
{IF stock}
Questo prodotto è disponibile a magazzino
{ELSE stock}
Prodotto esaurito
{ENDIF stock}
Possiamo anche comparare il valore di un campo con una costante, ma solo in uguaglianza.
Per esempio
{IF colore = giallo}
Questo prodotto è offerto in color giallo canarino
{ENDIF colore}
Twig invece offre anche la possibilità di testare anche se un valore sia diverso,
maggiore, minore e di usare gli operatori booleani and, not e or. Per esempio:
{% if stock < 10 %}
Prodotto in esaurimento! Ordinatelo subito prima che le scorte finiscano!
{% endif %}
Quando usiamo una Vista in una pagina mastro, a volte sarebbe bene applicare una classe a
uno degli elementi, o all’ultimo elemento, per motivi di presentazione. Con le pagine
mastro tradizionali questo richiede la scrittura di una Vista ad hoc. Con Twig è possibile
affidarsi al linguaggio.
Possiamo contare quanti elementi sono restituiti da una Vista, per esempio: {{
nomevista|length }}
Trovate un altro esempio in questo stesso documento più sotto, nel paragrafo “maggior
leggibilità e maggior flessibilità”.
In Twig i campi del database possono venire usati nella pagina mastro così come sono, ma
anche dopo un filtraggio che assegna loro un formato.
Per esempio, se volete stampare a video il valore di lastMod, ovvero la data in cui la
pagina è stata aggiornata, nella pagina mastro tradizionale non avete altre scelta che
indicare {lastMod} e vedere la data in forma giorno/mese/anno. Con Twig potete decidere
liberamente il formato. Per esempio: {{ lastMod|date("d/m/Y" )}} oppure
{{lastMod|date("d/m/Y h”:m:i)}} con anche ore minuti e secondi.
Un altro esempio. Nel commercio elettronico il prezzo di un prodotto mostrato con {price}
viene prodotto da Sar-At 10 così come si trova nel database. Milleduecento virgola
cinquanta euro appariranno come 1200.5
In Twig, possiamo usare il filtro number_format, e scrivendo {{ price|number_format(2,
‘,’, ‘.’) }} avremo a video 1.200,50
Un esempio più complesso. La vista “ultime_cinquanta_news” estrae dalla base dati le
notizie più recenti, ma noi vogliamo impaginarle raggruppandole per mese. In una pagina
mastro tradizionale è un bel grattacapo. Twig mette a disposizione variabili e cicli, e la
cosa diventa facilmente realizzabile:
{% set mese_corrente = "Nessuno" %}
{% for faq in ultime_cinquanta_news %}
{% if ((faq.lastMod | date("F")) != mese_corrente) %}
{% set mese_corrente = faq.lastMod | date("F") %}
<h1>{{faq.lastMod | date(“F Y")}}</h1>
{% endif %}
<li>{{faq.lastMod | date("d/m/Y")}}
<em>{{faq.title}}</em></li>
{% endfor %}
Le prestazioni
Abbiamo sempre definito Sar-At “il più veloce dei CMS” e questa è una assoluta verità. Il
principale motivo per cui il vecchio sistema delle pagine mastro ha le limitazioni che
Twig supera è proprio per la ricerca di massime prestazioni che ci ha sempre
contraddistinto.
Dobbiamo ammettere che una pagina mastro realizzata in Twig appare a video più lentamente
di una pagina mastro tradizionale se e solo se voi siete riusciti a sfruttare il
meccanismo della cache di Sar-At. D’altra parte, anche Twig ha qualche buona carta da
giocare. Le mastro create con Twig vengono compilate in linguaggio PHP e dispongono di una
cache propria, meno efficiente di quella di Sar-At ma non drammaticamente tale. Se una
vostra pagina mastro non fa uso della cache Sar-At, allora aggiornarla a Twig produrrà un
aumento e non una perdita di prestazioni. Chi possiede un sito web di prima grandezza e
vuole ottimizzarlo, dunque, potrà decidere di passare a Twig solo le pagine che restano
fuori dalla cache Sar-At (per esempio la componente di commercio elettronico).
Ricette pronte per l’uso
Twig ha una nutrita comunità di sviluppatori a cui ci possiamo rivolgere per cercare
soluzioni e consigli, che saranno tutti automaticamente spendibili in Sar-At. Ecco un
assaggio:
http://stackoverflow.com/questions/tagged/twig?sort=votes&pageSize=15
Una ventata d’aria fresca
Il passaggio a Twig ci dà anche il destro per svecchiare in alcune piccolezze
l’architettura Sar-At, specialmente per quanto riguarda alcune caratteristiche introdotte
con le versioni 5.0 e precedenti che, a oltre dieci anni di distanza, segnano il passo.
Ecco alcuni dettagli da tenere presenti
Maggior leggibilità e maggior flessibilità
Immaginate di avere una sezione “automobili”, dove nel campo “azienda” avete inserito le
marche di auto. Immaginate di avere una sezione “piloti”, dove nel campo “azienda” avete
inserito il nome del team per cui ogni sportivo corre. Se nella pagina mastro della
sezione automobili inserite una vista che recupera i nomi dei piloti, in Sar-At 10 e
precedenti potreste scrivere:
{BEGIN tutti_i_piloti}
{title} {azienda}
{END tutti_i_piloti}
Chi apre la pagina mastro e la legge non vede immediatamente che stiamo recuperando
l’azienda del pilota e non l’azienda dell’automobile che viene mostrata in questa pagina.
Con Twig le cose si fanno più chiare. Nella pagina mastro Twig, {{ azienda }} si riferirà
sempre e comunque all’azienda dell’automobile (l’azienda recuperata dal record corrente
della sezione corrente). All’interno della vista, i campi sono riferiti usando la
notazione vista.nomecampo, nel caso del nostro esempio avremmo:
{% for sportivo in piloti %}
{{ sportivo.title }} {{sportivo.azienda }}<br />
{% endfor %}
Questo tra l’altro significa che, per la prima volta in Sar-At, possiamo usare dentro a
una Vista tutti i campi della sezione principale e anche tutti quelli della sezione
oggetto della Vista. Nel nostro esempio possiamo usare uno di fianco all’altro
{{sportivo.azienda }} e {{ azienda }}
Immaginate una pagina mastro della sezione “film” che mostra la scheda di un film, e in un
box usando una vista mostra tutti i titoli di tutti i film in catalogo, consentendo di
cloccarne uno per andare alla scheda di quel film, ma evidenziando quello che stiamo
guardando nel box principale della pagina (l’id corrente) di modo che non sia possibile
cliccarlo per tornare alla pagina che si sta già guardando. In Twig è banale:
{% for film in catalogo %}
{%if film.id = id %}
<p class=‘corrente’>{{ film.title }}</p>
{% else %}
<a class=‘diverso’ href=‘showTwig.php?template=film&id={{ film.id }}’>{{
film.title }}</a>
{% endif %}
{% endfor %}
Abbiamo i vettori, usiamoli
Come alcuni di voi già sapranno, showPage trasforma automaticamente i vettori in stringhe.
Per esempio se chiamo:
showPage.php?template=x&id=1&v[]=1&v[]=2
…e se la pagina mastro vecchio stile contiene {v}, quel che ottengo a schermo è la scritta
1,2
showTwig fa affidamento sul fatto che il sistema Twig supporta i vettori e quindi avremo
che al richiamo di
showTwig.php?template=x&id=1&v[]=1&v[]=2
{{ v }} è un vettore.
Le Viste e i vettori
Immaginate di aver scritto una Vista che recupera tutti i contenuti della sezione
“categorie”. In Sar-At 10 e precedenti possiamo scrivere
{BEGIN tutte_categorie}
{title}<br />
{END tutte_categorie}
Come abbiamo accennato sopra, questa scrittura ha un perfetto equivalente in Twig e cioè
{% for categoria in tutte_categorie %}
{{ categoria.title }}<br />
{% endfor %}
In Twig però non c’è obbligo di scandire le categorie nell’ordine. La pagina mastro può
contenere:
{{ tutte_categorie[3][‘title'] }}
e questo mostrerà nella vostra pagina mastro il nome della terza categoria.
Variabili get e post
Come alcuni di voi già sapranno, showPage accetta in ingresso informazioni da GET e da
POST. In altre parole, se chiamo
showPage.php?template=x&id=1&masterPage=esempio.html&provincia=Milano
allora all’interno della pagina mastro è possibile scrivere
<p>Hai selezionato la provincia di {provincia}</p>
Inoltre, le Viste che vengono chiamate in quella pagina possono usare la variabile SQL
@provincia per lavorare. Tuttavia questo rende difficile validare la pagina, perché Sar-At
in fase di validazione non vede il valore di “provincia” nella URL. Sino ad oggi abbiamo
risolto il problema con un intervento manuale a linea di comando e cioè
UPDATE sarelmasterpages SET urlParams=‘/provincia/‘;
Ovviamente si tratta di una opzione molto potente, ma tutt’altro che comoda da usare per
il webdesigner. Introduce anche qualche ambiguità perché chi legge la pagina mastro non ha
nessun modo per capire immediatamente che il valore di “provincia” deve venire dalla URL.
Passando a Twig, abbiamo scelto di inserire i valori della URL in un vettore chiamato _GET
(o in alternativa, per le pagine richiamate con un form method=‘post’, nel vettore _POST).
Quindi se venisse chiamata questa URL:
showTwig.php?template=x&id=1&masterPage=esempio.html&provincia=Milano
avremmo che {{ _GET.provincia }} vale “Milano”.
sarel_userlogged e sarel_username
Nelle sezioni riservate agli utenti registrati siamo abituati a infarcire le pagine mastro
di righe come questa:
{IF sarel_userlogged}
<p>Bentornato, {sarel_username}! (Se non sei {sarel_username},
<a href='sarat/cart/forgetBuyer.php'>clicca qui</a>)
{ELSE sarel_userlogged}
…eccetera
Nelle pagine mastro realizzate con Twig useremo in futuro:
{% if saratuser.islogged %}
<p>Bentornato, {{ saratuser.username }}! (Se non sei {{ saratuser.username }},
<a href='sarat/cart/forgetBuyer.php'>clicca qui</a>).
{% else %}
…eccetera
Introduciamo cioè l’oggetto saratuser, che prende il posto della coppia sarel_userlogged e
sarel_username ma aggiunge ulteriori informazioni
saratuser.islogged Utente registrato (vero) o anonimo (falso)
saratuser.username Nome utente
saratuser.provider Metodo utilizzato per fare login (per esempio, Twitter o Facebook o
Sar-At)
saratuser.groupname Gruppo di utenti cui appartiene
saratuser.groupid Identificatore numerico del gruppo di utenti cui appartiene
Alcune accortezze
In Twig maiuscole e minuscole fanno differenza, mentre nelle pagine mastro vecchio stile
di Sar-At questo non è vero. Quindi e per esempio, una pagina mastro vecchio stile che
contiene {ID} funzionerebbe, ma la sua trasformazione automatica a Twig produrrebbe {{ ID
}} che non verrebbe riconosciuto né accettato.
Con il passaggio a Twig, e limitatamente all’ambiente Twig, abbiamo deciso di terminare il
supporto di alcuni plug-in incorporati di Sar-At. Essi continueranno a funzionare nelle
pagine mastro vecchio stile sotto Sar-At 11, ma il loro uso non sarà possibile se la
pagina mastro viene convertita o riscritta per Twig. Ecco un elenco che crediamo esaustivo
nel momento in cui questo documento viene scritto ma che potrà venire rivisto in
prossimità del rilascio di Sar-At 11.
Plug-in
Note
{HEAD}
Non necessario in HTML5. Il programma di trasformazione delle pagine mastro vecchio stile
in formato Twig lo rimpiazzerà con:
<meta charset="utf-8">
<title>{{ title }}</title>
<meta name="description" content="{{ description }}" />
{sarel_username}
{sarel_userlogged}
Sostituiti dall’oggetto saratuser. Il programma di trasformazione delle pagine mastro
vecchio stile in Twig li rimpiazzerà automaticamente.
saratviews_serial
sarelviews_row
Non necessari in ambiente Twig, dove è possibile lavorare sugli indici dei vettori (ogni
Vista è un vettore in Twig).
L.A.
--
Accomazzi.net Srl
Via A. Scarlatti, 3
20015 Parabiago (Mi)
Tel. 02.00615556
Fax 02.700537345
Cell. 349.7680116
VoIP sip:5342716@sip.messagenet.it
Skype misterakko
http://www.accomazzi.net