ProcessWire
Programmare con mcv in ProcessWire

MVC + ProcessWire per una programmazione pulita

Frank Vessia
09 ott 2020
Tempo di lettura: 3 minuti, 47 secondi

Come espandere le potezialità di ProcessWire per sviluppare in mvc


Che ProcessWire sia versatile oramai lo sanno anche i muri ma poichè è così aperto a volte alcune caretteristiche vengono viste dagli sviluppatori che non lo conoscono bene come delle mancanze, rispetto ad altri framework più blasonati. Con ProcessWire bisogna trovare il giusto workflow per ottenere il massimo in ogni progetto e nel momento in cui dobbiamo sviluppare delle applicazioni complesse che comprendono molti layout grafici e interazioni è bene sviluppare con una logica mvc ovvero model + view + controller, cosa che di base ProcessWire non offre "limitandosi" ad utilizzare il php come motore di templating.

Ma ecco che in aiuto ci viene il modulo TemplateEngineFactory creato da Wanze. Personalmente utlizzo questo modulo da diverso tempo nel 90% dei mie progetti, è uno di quei moduli "must have" che si installano in partenza perchè una volta entrati nella logica mvc non si torna più indietro.

Questo modulo non fa altro che introdurre il sistema mcv potendo scegliere quale sistema di templating utilizzare, dal php a Smarty o anche Twig oppure Mustache. Vediamo cosa ci occorre, come configurare il tutto e poi passiamo ad alcuni esempi pratici.

installazione di un modulo su processwirePer prima cosa scarichiamo il modulo da questo link oppure possiamo installarlo direttamente dall'admin digitando il nome della classe TemplateEngineFactory nel pannello di gestione dei moduli di ProcessWire.

Il modulo installa di base il template engine nativo di php, se vogliamo usare un altro sisema dovemmo installare anche il modulo relativo al template engine che vogliamo adottare, per ora vediamo come sviluppare una pagina di test direttamente in php.

Una volta installato dobbiamo configurare alcune variabili, una tendina nella quale scegliere qualche template engine usare (appunto tra quelli installati), il nome della variabile da usare per riferici alla vista (di default view) e la variabile che restituisce il modulo stesso da usare per blocchi di codice (di defautl factory).

Fatto questo dobbimao configurare altri parametri relativi al template engine (in questo caso php puro), quindi andiamo nel modulo TemplateEngineProcesswire e impostiamo la folder dove metteremo tutti i file delle view (per esempio templates/views/) e l'estensione dei nostri file, per esempio .tpl. Bene, ora siamo pronti per usare l'mvc.

Creiamo un template di esempio mvc.php e mettiamo nella folder delle views anche il file mvc.tpl (templates/views/mvc.tpl). Quindi il file mcv.php agirà da controller mentre il file mvc.tpl sarà la nostra vista in questo modo possiamo separare il codice php che ci serve per eventuali funzioni o per recuperare dati (per esempio selectors) dalla grafica della pagina che metteremo nella vista.

Ma come facciamo a passare i dati dal controller alla vista? Semplicissimo, ricordi la variabile che abbiamo creato prima nelle impostazioni? (view), con una sintassi di questo tipo diciamo al controller cosa passare alla vista:

// con un selector recupero le pagine che mi servono
$articoli = $pages->find("template=post,limit=10,sort=-published");
// passo il pageArray ottenuto alla vista
$view->set('articoli',$articoli); 

e nel file mvc.tpl potrò usare la variabile ricevuta. Poichè in questo caso stiamo usando il template engine di php possiamo scrivere direttamente in php all'interno del file tpl in questo modo:

<div class="articoli">
    <?php foreach($articoli as $a){ ?>
    <div class='title'><?=$a->title?></<div>
    <?php } ?>
</div>

se stessimo usando smarty potremmo fare la stessa cosa in questo modo:

<div class="articoli">
    {foreach $articoli as $a} ?>
    <div class='title'>{$a->title}</<div>
    {/foreach}
</div>

Da questo momento potremmo tranquillamente includere qualsiasi codice php nella view e lavorare in modo pulito lasciando alla vista tutto quello che riguarda i markup del nostro sito.

Includere un file all'inizio di ogni templateLe possibilità sono infinite, io personalmente ho astratto ancora un po questa logica includendo tutte le funzioni globali in un altro file esterno per esempio "init.inc" che includo in ogni file di template in modo da avere un unico file per le funzioni del sito automaticamente incluso in tutti i controllers. Per far questo basta andare nelle impostazioni di ogni template (nel tab files) e aggiungere il file in questione nel campo "prepend" (includi un file prima, in italiano).

Conclusioni


Abbiamo visto come sopperire ad una "mancanza" base del ProcessWire in modo semplice e versatile trasformando un sistema senza mcv ad uno mcv. Questo è solo un esempio di come sia possibile sviluppare qualsiasi applicativo web con ProcessWire sfruttando solo quello di cui abbiamo necessariamente bisogno per ogni singolo progetto, mantenedo i nostri applicativi puliti e funzionali.