ProcessWire
Alcuni trucchi per programmare meglio in ProcessWire

6 cose che non sai su ProcessWire

Frank Vessia
22 ott 2020
Tempo di lettura: 4 minuti, 9 secondi

Un piccolo vademecum di alcune interessanti funzionalità di ProcessWire che non tutti conoscono.


Se sei uno sviluppatore php alle prime armi con ProcessWire o se lo utilizzi da tempo e non ti sei aggiornato sugli ultimi sviluppi, forse questo articolo può esserti molto utile per farti conoscere alcune funzionalità e moduli interessanti.

Ciclo each() integrato

Il WireArray di ProcessWire ottenuto per esempio dopo una query $pages->find() ci permette di ciclare senza usare il foreach del php ma con le API stesse. Ecco un esempio:

$myBooks = $pages->find("template=book,limit=20,sort=-published");
echo $myBooks->each(function($book) {
  return "<li><a href='$book->url'>$book->title</a></li>";
});

Possiamo usare la stessa funzione per ottenere degli array formati da campi, del tipo

// $title diventa un array formato da tutti i titoli delle pagine figlie di $page
$titles = $page->children()->each("title");

Session Handler Database

Questo è modulo che fa parte del core ma che non viene installato in partenza. Lo utilizzo sempre, permette di salvare le sessions nel database senza utilizzare files su disco. Utilissimo sia per questioni di prestazioni, sia perchè ha alcune opzioni incluse, come quella di tracciare l'indirizzo IP del navigatore, tracciare lo user agent oppure di evitare le sessioni in parallelo.

Sanitizzazione dei dati

ProcessWire contiene un potente strumento per sanificare quasi ogni tipo di dato con l'api $sanitizer-> e costantemente vengono introdotti nuovi dati supportati che aiutano lo sviluppatore a gestire in modo sicuro i dati. Vediamo alcune recenti introduzioni:

flatArray(), permette di convertire un array multidimensionale in uno semplice

$array = $sanitizer->flatArray(array $value);

wordsArray(), trasforma una stringa formata da varie parole in un array

$array = $sanitizer->wordsArray($value, array $options = []);

le opzioni passate come secondo parametro servono a definire alcuni comportamenti, per esempio considerare underscore come parte della parola o le punteggiature, ecc...

trunc(), tronca una stringa di testo in base alla lunghezza passata, senza spezzare le parole

$string = $sanitizer->trunc(string $str, $maxLength = 300, array $options = []);

Sempre in tema di sanificazione, esiste un interessante modulo per convertire qualunque stringa in un url slug, chiamato EasySlugger.

Creare classi custom

Nonostante ProcessWire permetta di creare moduli per ogni tipo di esigenza, è anche possibile creare delle classi customizzate per piccole operazioni laddove un modulo può sembrare troppo oneroso o laddove abbiamo bisogno di funzioni speciali solo in determinati templates. Se quindi vogliamo creare una funzionalità per uno specifico template, dobbiamo prima abilitare l'uso di classi custom nel config, semplicemente aggiungendo $config->usePageClasses = true;

Fatto questo, dobbiamo creare un file all'interno di /site/classes/ con lo stesso nome del template trasformato in CamelCase seguito da Page [TemplateName]Page. Se il nostro template si chiama hotel-room.php il file della classe sarà HotelRoomPage.php. All'interno del file potremo scrivere le nostri classi accessibili poi a livello di template con $page->miaclasse, ecco un esempio:

<?php namespace ProcessWire;

class HotelRoomPage extends Page {

    public function lastBooked() {
        $lastBook = wire('pages')->get("template=order,room={$this->id},sort=-created");
        return __("Ultima prenotazione:").' '.date("d-m-Y",$lastBook->created);
    }

}

Nel template hotel-room.php in front end potremo usare la nuova classe creata con $page->lastBooked();

Modulo AllInOneMinify

Questo è un modulo must have, come il nome suggerisce, AllInOneMinify permette di minificare javascript e css multipli in un unico file. Molto semplice da implementare, con questo codice:

<link rel="stylesheet" href="<?php echo AIOM::CSS(array(
    'assets/css/bootstrap.5.0.0.css',
    'assets/css/lineicons.css',
    'assets/css/style.css'
)); ?>"> 

Diverse opzioni disponibili come la modalità development o la possibilità di utilizzare percorsi esterni al dominio principale o file less che vengono tutti uniti in un unico css. Consigliatissimo specie se vuoi implementare un tema grafico che contiene tantissimi files.

Campo immagini con proprietà custom

Devi creare un sito di fotografie e ogni foto deve avere una serie di proprietà, autore, descrizione, licenza, ecc.. ma sai benissimo che in ProcessWire le immagini possono avere solo un campo descrizione ed eventualmente dei tags, niente più. Non tutti sanno che da qualche tempo è stata introdotta la possibilità di avere campi custom per le immagini, vediamo come.

Campi custom per le immaginiLa logica è molto semplice, essenzialmente andremo a creare un template con tutti i campi che ci servono che sarà usato dal nostro campo immagine. La prima cosa da fare è creare il template che deve avere il nome in questo formato field-nomecampo.php. Se il nostro campo immagini si chiama foto, il template dovrà chiamarsi quindi field-foto.php. Questo è tutto, ora come normalmente facciamo con gli altri template, associamo tutti i campi che vogliamo a questo template e magicamente, quando editeremo la nostra immagine, questa avrà tutti i campi presi automaticamente dal nuovo template e potremo usarli in front end come proprietà del tipo $page->foto->nomecampo. Da tenere a mente che non tutte le tipologie di campi sono supportare, per esempio le textarea con CKEditor non lo sono ancora.