PhpVorrei affrontare un tema che a suo tempo – quando iniziai ad avvicinarmi al Php senza nessuna base di programmazione – mi fece arrovellare e non poco: come strutturare un sito dinamico pensato “a moduli”.

Ad oggi utilizzo dei meccanismi molto complessi, dove la complessità è anche e soprattutto proporzionata alla grandezza del progetto che devo realizzare, ma in linea di principio l’idea alla base è sempre la stessa, quella stessa che vi presenterò in questo esempio che ha invece delle pretese molto più limitate ed è da intendersi al solo scopo didattico.

Questo sta a significare che l’esempio riportato, oltre ad essere validissimo nella sua semplicità, può essere ed è a tutti gli effetti un’ottima base di partenza. Buona parte delle applicazioni web-based (soprattutto quelle sviluppate dal sottoscritto :-)) non sono altro che un’estensione (seppur, a volte, di gran lunga superiore) di questo modello.

Si cominci a ragionare partendo dal template. Si immagini che tutte le pagine siano sempre composte da 4 parti:

  1. un header, che probabilmente conterrà il logo e volendo un menù di navigazione orizzontale (header);
  2. una sidebar, ovvero un menù verticale laterale (menu);
  3. il corpo principale della pagina, di fianco alla sidebar (content);
  4. un footer (footer).

Il primo, il secondo e il quarto sono grosso modo statici: pur potendo presentare delle piccole eccezioni (ad esempio lo sfondo dell’header potrebbe cambiare ogni volta in un diverso colore; oppure nella sidebar potrebbero essere mostrati o nascosti determinati menù a seconda della pagina in cui ci si trova), generalmente restano invariati, soprattutto nella struttura, tra una pagina e l’altra. Solo il contenuto del terzo, il corpo principale (content), può variare notevolmente. Segue un piccolo schema:

Layout pagina

Supponiamo che le pagine che vogliamo “servire” all’utente e che verranno mostrate in content siano, nel nostro caso, queste tre: home (pagina di default, intesa come home page), login e contatti. La struttura dei file potrebbe quindi essere questa:

pages/
pages/contatti.php
pages/home.php
pages/login.php
template/footer.php
template/header.php
template/sidebar.php
index.php

Tralasciando volutamente qualsiasi riferimento a html e css, come avrete probabilmente capito i tre file in template/ conterranno le parti statiche delle pagine, mentre in pages/ avremo le parti dinamiche che poi verranno mostrate nella parte che abbiamo definito come content.

Il compito di index.php è quello di assemblare il tutto, di fare da collante tra le 3 parti statiche e quella dinamica:

<?php

//Include l'header
include("template/header.php");

//Include la sidebar
include("template/sidebar.php");

/* Verifica se l'utente ha richiesto una pagina in particolare e se quella pagina esiste. In caso affermativo, salva il nome della pagina nella variabile $pageToShow. Altrimenti, se l'utente non ha richiesto una pagina in particolare, $pageToShow verrà impostata col nome della pagina di default (nel nostro caso è template/home.php, quindi sarà semplicemente "home" */
if(isSet($_GET['page']) && file_exists("pages/".$_GET['page'].".php"))
    $pageToShow = $_GET['page'];
else
    $pageToShow = "home";

//Include la pagina stabilita col precedente controllo
include("pages/".$pageToShow.".php");

//Include il footer
include("template/footer.php");

?>

I commenti al codice dovrebbero essere sufficientemente esplicativi. Di conseguenza, i link alla tre pagine che abbiamo stabilito (home, login e contatti) dovranno essere così impostati:

index.php?page=home
index.php?page=login
index.php?page=contatti

In questo modo, verrà sempre chiamata index.php, che riceverà il nome della pagina da “servire” nella variabile superglobale $_GET (e precisamente in $_GET[‘page’]): verificherà se quella pagina esiste e poi la includerà nello spazio definito come content.

È, ripeto, un ottimo punto di partenza. Valido, ma estendibile e da estendere.

Espandi/comprimi Commenti
spinmind
(21/11/2013, 11:12)

include(“template/”.$pageToShow.”.php”)
dovresti sotituire template con pages.
Cmq ne approfitto per chiedere consiglio: tra questo metodo e avere invece home.php, login.php, … richiamate da un link tipo home.php, login.php classico modo, che differenza c’è? quale dei due è più efficiente?

Mirko Pagliai
(21/11/2013, 11:24)

Ti ringrazio per la segnalazione, ho corretto il refuso.

Venendo alla tua domanda e sperando di aver capito correttamente, questo è il metodo più efficiente, perché diversamente dovresti ripetere buona parte del codice su tutti i singoli file. In questo esempio e immaginando di utilizzare un template, dovresti in particolare ripetere l’inclusione dei vari pezzi del template.

Questo è sconveniente sia per la mole di codice da scrivere, sia per la mole di codice da manutenere (se devi modificare il template, dovrei modificare tutti questi file), sia perché nella realtà è attendibile che nel file index.php vengano compiute anche altre operazioni comuni a tutte le pagine richieste.

Se l’obiettivo è quello di avere un url breve (es. http://www.miosito.it/login.php) allora si può tranquillamente ricorrere all’url rewriting, mantenendo comunque questo codice. Molto semplicemente, sarà il web server (es. Apache) a “tradurre” le richieste (www.miosito.it/login.php richiamerà http://www.miosito.it/index.php?page=login).

Spero di essere stato esauriente, ciao.

ddi
(01/02/2014, 01:14)

Ciao Mirko e complimenti per l’articolo. Secondo te avendo la necessità di avere un template come nel tuo caso, ma per diversi utenti in base di dati, utilizzeresti la stessa struttura aggiungendo un parametro all’url e facendo un url rewriting successivo?

Ad esempio un index.php?page=home&id_utente=Pippo

Da tradurre in

/Pippo/home.html

Potrebbe funzionare ed è conveniente?

Come reagirebbe il seo davanti a queste pagine le interpreterebbe come pagine singole? E verranno indicizzate?

Ciao e grazie,
D.

alala
(16/09/2014, 19:42)

scusa ma non ho ben capito come funziona..
pageToShow è una variabile uguale ad home. Quindi
include(“pages/”.$pageToShow.”.php”);
è come se fosse
include(“pages/home.php”);
come vengono richiamate le altre pagine ?

XHTML - Puoi usare questi tag: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>