Utente: Anonymous

Decodifica URL

Drupal è un sistema in cui le pagine richieste sono quasi sempre costruite dinamicamente.
Il testo della pagina è archiviato in un database e quando viene richiesto, Drupal deve leggerlo e trasformarlo in codice HTML per essere visualizzato sul browser.
Drupal è quindi un sistema che genera pagine dinamiche.
Quando un browser invia un URL per richiedere una pagina del sito ,il sistema deve individuare dall' URL quale funzioni attivare per generare e visualizzare la pagina richiesta.
Il meccanismo che individua le funzioni da richiamare è descritto qui di seguito.

Impostazione della variabile $_GET['q']

La variabile $_GET['q'] , e il suo valore , è resa disponibile dal server web.
Il server web imposta il valore di $_GET['q'] al percorso richiesto interno al sito, in seguito indicato con il termine path. E' dal valore di questa variabile che Drupal parte per determinare quale funzione attivare per visualizzare il contenuto richiesto.

Ad esempio:
se l' URL=http://miosito.com allora $_GET['q'] = ''
se l' URL=http://miosito.com/node/345 allora $_GET['q'] = node/345
se l' URL=http://miosito.com/contabilita/elenco-fatture/attive allora $_GET['q'] = contabilita/elenco-fatture/attive

Conversione Url alias

Richiesta della home page

Se l' URL inviato contiene il solo nome del sito www.miosito.com e quindi $_GET['q'] = "", Drupal non effettua alcuna conversione riconoscendo nell' URL la richiesta della home page del sito.
In questo caso Drupal forza $_GET['q'] = "node".

Richiesta di una pagina generica

L'URL inviato al sistema, può contenere un alias dell'URL, come nell'esempio di "miosito.com/contabilita/elenco-fatture/attive". Il path contenuto nella variabile $_GET['q'] in questo caso sarà uguale a "contabilita/elenco-fatture/attive".
Il sistema per prima cosa converte il path ricevuto in un indirizzo interno e successivamente individua la funzione da attivare per estrarre dal database il contenuto richiesto.
La conversione viene eseguita nella fase di bootstrap, a cui si rimanda , ed in particolare nella fase di BOOTSTRAP_PATH.
In questa fase Drupal cerca nella tabella URL_ALIAS il path "contabilita/elenco-fatture/attive" e se esiste imposta la variabile $_GET['q'] al valore del corrispondente path di sistema.
Esempio: contabilita/elenco-fatture/attive => node/345
A conversione avvenuta avremo $_GET['q'] = node/345 e quindi il sistema saprà quale nodo deve essere visualizzato.
Evidentemente se non si trova una corrispondenza nella tabella indicata, significa che l'URL non contiene un alias e quindi la variabile $_GET['q'] non sarà alterata.

Individuazione della page_callback

Dopo l'eventuale conversione dell' URL , in $_GET['q'] si trova l'indirizzo reale della pagina da visualizzare.
Drupal deve ora individuare la page_callback, per estrarre e visualizzare il contenuto richiesto.

Abbiamo visto in Avvio di Drupal che all'interno del file index.php la lettura del contenuto viene eseguito dalla funzione menu_execute_active_handler(), il cui codice è parzialmente riportato a fondo pagina.
Questa , al suo interno, chiama la funzione menu_get_item() che individuerà la page_callback, e se specificato, caricherà anche il nodo o l'oggetto richiesto.
In che modo viene individuata la page callback?
La page_callback è individuata grazie alla tabella MENU_ROUTER. In questa tabella sono contenute le informazioni necessarie per individuare la page_callback, il cui nome è indicato nel campo <page_callback>. In particolare la colonna <path> contiene i possibili path parametrizzati che possono essere richiesti.
La tabella MENU_ROUTER è caricata da Drupal, quando si entra nel menu Amministrazione->Elenco moduli e si salva la pagina. Drupal chiamerà tutte le funzioni implementate nei moduli che hanno nome: nomemodulo_menu(). In queste funzioni sono definite le page_callback e tutte le infornazioni necessarie per eseguire le funzione richieste che saranno archiviate nella tabella MENU_ROUTER.Di tutto questo si parlerà nello parte dedicata all sviluppo dei moduli. Ad esempio, volendo modificare il nodo 12345 , potrebbe essere inviato a Drupal il path node/12345/edit.
In questo caso, il sistema cercherebbe nella colonna <path> uno dei seguenti path:

7 node/12345/edit
6 node/12345/%
5 node/%/edit
4 node/%/%
3 node/12345
2 node/%
1 node

Potrebbero non essere tutti presenti, ma tra quelli presenti, l'ordine di selezione è dato dal valore del campo <fit> della tabella.
Il path node/%/edit indica che il record della tabella contiene il nome della page_callback per tutti i path costituiti da 'node', un numero identificativo del nodo , e 'edit' come per 'node/12345/edit'
Individuato il path, il corrispondente record viene posto in un array e tornato alla funzione menu_execute_active_handler() che chiamerà la page_callback.
Oltre a tutti i campi della tabella menu_router, l'array conterrà anche:
$router_item[access] = che indica se si può accede al percorso.
$router_item[href] = equivalente al campo <path>
$router_item[localized_options] per ulteriori opzioni sul path inseribili da altre funzioni.

Gli argomenti della page callback e la lettura dell'oggetto

La funzione menu_get_item() è in grado di leggere l'oggetto richiesto (ad esempio un nodo) se nella tabella MENU_ROUTER è specificata una funzione di caricamento.

argomenti per la homepage

La page_callback chiamata è la node_page_default() a cui non vengono passati argomenti. Il valore $router_item[page_arguments] è nullo.

argomenti per un nodo generico

Abbiamo visto ad esempio che per la richiesta node/12345, il sistema trova nella tabella MENU_ROUTER il path 'node/%' e a questo corrispondono i due campi:
<page_callback> : node_page:view()
<load_function>: node_load() (serializzata in tabella)
Essendo presente il nome di una funzione di caricamento, la menu_get_item() sarà in grado di leggere l'oggetto, utilizzando la funzione indicata, e inserirlo in
$router_item[page_arguments] come argomento della funzione di page_callback.

Di seguito un frammento del codice che :

  • chiama la menu_get_item() per riempire l'array $router_item con le informazione sulla page_callback da chiamare;
  • lancia la page_callback tramite la funzione PHP call_user_func_array();
<?php

function menu_execute_active_handler($path = NULL) {
         
// altro codice ...
 
if ($router_item = menu_get_item($path)) {
    if (
$router_item['access']) {
           if (
$router_item['file']) {
              require_once(
$router_item['file']);
           }
           return 
call_user_func_array(
                                   
$router_item['page_callback'],
                                   
$router_item['page_arguments']
                                    );
    }
    else {
        
// altro codice ...
  
}
}

?>

All'avvio di Drupal, il valore di $path è NULL e la funzione menu_get_item() leggerà il path dalla variabile globale $_GET['q'].
La page_callback a questo punto leggerà il contenuto e tornerà una stringa contenente il corrispondente codice HTML.