Il sistema menù - dall'URI alla pagina web

Stato documento: Beta

Anche se raggruppato sotto il nome "sistema di menù", il sistema si divide in due distinte parti:

  • conversione dell'URI: da /project/drupal in ?q=node/121
  • router: da ?q=node/121 all'esecuzione di codice che gestisce l'URI

Confuso? Vediamo ogni parte un po' più in dettaglio.

Conversione dell'URI.

Ogni pagina del nostro sito ha un URI. Per esempio http://drupal.org/project/drupal[/codefilter_code] che si divide in:

  • protocollo: http
  • server: drupal.org
  • percorso: /project/drupal

Il server (Apache o IIS per il protocollo http nel nostro caso) viene chiamato e prima controlla se il percorso corrisponde ad un file, e se ha i permessi necessari per accederci. Questo, nel caso di Apache, lo fa anche tramite il famoso file .htaccess. [Edit: aggiungi link a "cos'è .htaccess"]

Se tutto va liscio, il web server restituisce il file - un immagine, o file CSS per esempio. Altrimenti, se il file non esiste, il nostro tenace web server continua il suo tentativo di restituire qualcosa di utile, caminando lungo il percorso all'indietro. Se non trova /project/drupal, controlla /project, e poi /. Nel nostro caso, all'indirizzo / (detto anche root del sito) trova il file index.php di Drupal, che il web server può eseguire.
Nel caso che non trovasse nulla di utile, il povero web server è costretto a restituire il codice 404 - che significa "Oops, non c'è", o nel caso che trovi il file ma non ha i permessi giusti, il codice 403 - che significa "Spiacente, ma non posso".

Ora il web server è pronto a chiamare Drupal eseguendo il file index.php. Drupal tecnicamente usa il Front Controller Pattern [Edit: link in italiano?], cioè tutte le richieste passano per un punto centrale - index.php in questo caso. Un pò come un imbuto.

Ma se tutto passa per index.php, che fine fa il percorso /project/drupal? Viene convertito in un parametro di query (con nome q) come il seguente: http://drupal.org/index.php?q=/project/drupal[/codefilter_code]. Quest'operazione viene fatta dal web server ed è conosciuto come "Clean URLs" in Drupal. [Edit: aggiungi link a "come settare Clean URLs"]

A questo punto Drupal viene eseguito e legge il parametro q per capire il percorso. Nel caso dove Drupal non sta nel indirizzario root del sito, per esempio in /drupal, lui toglie quest'informazione utilizzando il valore del variabile $base_url che si trova in settings.php. [Edit: aggiungi link a "come trovare settings.php"] In più, toglie il primo carattere del percorso così diventa project/drupal.

Ora deve trovare il codice che corrisponde a questo percorso "standardizzato". Prima però controlla se è un alias - uno pseudonimo. Abilitando il modulo Path (core - opzionale) possiamo dare un nome alternativo ad un percorso "standard" di Drupal. [Edit: aggiungi link a "come abilitare un modulo"] Per esempio invece di node/121 possiamo specificare project/drupal. Gli alias sono registrati nella tabella url_alias del database di Drupal. Quindi se lui trova project/drupal, lo converte in node/121.

Router.

Stabilito il percorso "standard", questo viene passato al router - lo smistatore. Lui va a guardare quale codice corrisponde al percorso usando un altra tabella chiamata menu_router. La tabella contiene un bel pò d'informazione, incluso il nome della funzione (page_callback) e in quale file sta (file), ma anche quale permessi sono necessari per visualizzare la pagina (access_callback e access_arguments).

Ma il nostro percorso, node/121, non esiste! Esiste invece node/% che viene usato per tutti i nodi (cioè contenuti). Il simbolo % è chiamato wildcard o jolly. Il valore nella posizione corrispondente al jolly (121 in questo caso) viene passato come parametro alla funzione specificata dalla colonna page_callback. Così un record solo nella tabella può gestire tutti i nodi (forse migliaia) del nostro sito.

In fine, possono succedere tre cose; se il percorso non viene trovato, Drupal restituisce il codice 404 "Oops...", se l'utente non ha i permessi necessario viene restituito il codice 403 "Spiacente...", o il router esegue il codice definito in menu_router, e vediamo il nostro bel contenuto.

Un altro percorso da notare è system/files. Drupal permette che i files caricati (uploaded) possono essere pubblici o privati, o con Drupal 7, entrambi. [Edit: aggiungi link a "come rendere pubblico o privato il file system"] Nel caso pubblico Drupal non c'entra - il lavoro viene svolto dal web server, quindi è anche molto veloce. Nel caso privato, Drupal toglie i permessi al web server, e se i link ai files iniziano con /system/files allora è Drupal stesso a controllare permessi e fornire i contenuti dei files. In questo caso dobbiamo perdere un bel pò di velocità ma guadagniamo tutta la flessibilità di Drupal.

Tips: Quando un percorso non va: Controlla la configurazione del web server, poi per Apache .htaccess, poi Drupal.

Tips: Scegli i tuoi alias con cura. Meglio se iniziano con lo stesso percorso tipo: appunti/... foto/... notizie/... ecc., ed evitare nomi già in uso dal sistema, quale admin/... system/... o user/... Quando si è in dubbio, guardare nella tabella menu_router prima:
SELECT * FROM menu_router ORDER BY path ASC [Edit: link a "come leggere il database Drupal"]

Argomenti: