Come funziona Drupal? [chiuso]


151

Qualcuno potrebbe fornire una panoramica architetturale del flusso di controllo di Drupal 7? Forse nel senso di un diagramma di flusso su come viene generata una pagina. Quali risorse aggiuntive suggeriresti di consultare riguardo al funzionamento di Drupal?


1
Domanda? Allora perché non l'hai chiesto tu stesso :-)
liori

Non credo che ci fosse un overflow dello stack a quei tempi. :)
Jeremy French,

2
La comunità di Drupal è sempre alla ricerca di persone che aiutino con la documentazione. Perché non dare una mano se la documentazione è maldestra o i tutorial sono zoppi? :)
Rimian,

4
documentare richiede comprensione .. che richiede documentazione o molta esperienza
Damon,

Risposte:


160

Drupal può essere fonte di confusione su questo fronte, in parte perché ha uno stack di funzioni relativamente profondo. Sebbene sia un PHP procedurale, è puramente un evento / ascoltatore guidato nella sua architettura, e non c'è un semplice "flusso" nello script PHP principale che tu possa guardare. Di recente ho fatto una presentazione su questo argomento e le diapositive sono pubblicate su slideideshare, ma può essere utile un breve riepilogo di alto livello.

  • Il file index.php di Drupal funziona come controller frontale. Tutta la pagina viene reindirizzata attraverso di essa e l'URL / percorso "effettivi" richiesti dall'utente viene passato a index.php come parametro.
  • Il sistema di router di percorsi di Drupal (MenuAPI) viene utilizzato per abbinare il percorso richiesto a un determinato modulo plug-in. Quel modulo plugin è responsabile della creazione del "contenuto principale" della pagina.
  • Una volta creato il contenuto della pagina principale, index.php chiama theme ('page', $ content), che passa il contenuto al sistema di temi / skin di Drupal. Lì, è racchiuso in barre laterali / intestazioni / widget / ecc.
  • La pagina renderizzata viene quindi restituita ad apache e viene restituita al browser dell'utente.

Durante l'intero processo, i moduli di plug-in Drupal e di terze parti generano eventi e ascoltano la loro risposta. Drupal lo chiama il sistema 'hook', ed è implementato usando convenzioni di denominazione delle funzioni. Il modulo "blog", ad esempio, può intercettare "user" correlato implementando una funzione chiamata blog_user (). Nel linguaggio Drupal, si chiama hook_user () .

È un po 'goffo, ma a causa di una stranezza di PHP (mantiene un hashtable interno di tutte le funzioni caricate), consente a Drupal di verificare rapidamente gli ascoltatori semplicemente scorrendo su un elenco di plugin installati. Per ogni plug-in può chiamare function_exists () sul modello con nome appropriato e chiamare la funzione se esiste. ("Sto lanciando l'evento 'login'. Esiste la funzione 'mymodule_login'? Lo chiamerò. Esiste 'yourmodule_login'? No? Che ne dici di 'nextmodule_login'?" Ecc.) Ancora una volta, un tocco goffo ma funziona abbastanza bene.

Tutto ciò che accade in Drupal accade a causa di uno di quegli eventi sparati. MenuAPI sa solo quali URL / percorsi sono gestiti da diversi moduli plug-in perché genera l'evento 'menu' (hook_menu) e raccoglie tutti i moduli plug-in dei metadati con cui rispondono. ("Mi prenderò cura dell'URL 'news / recent', ed ecco la funzione da chiamare quando quella pagina deve essere costruita ...") Il contenuto viene salvato solo perché FormAPI di Drupal è responsabile della costruzione di una pagina e si attiva l'evento "è stato inviato un modulo" per la risposta di un modulo. La manutenzione oraria avviene perché hook_cron () viene attivato e qualsiasi modulo con mymodulename_cron () come nome di funzione avrà la sua funzione chiamata.

Alla fine tutto il resto sono solo dettagli: dettagli importanti, ma variazioni su quel tema. index.php è il controller, il sistema di menu determina quale sia la "pagina corrente" e molti eventi vengono generati nel processo di creazione di quella pagina. I moduli plug-in possono agganciarsi a quegli eventi e cambiare il flusso di lavoro / fornire informazioni aggiuntive / ecc. Questo è anche uno dei motivi per cui molte risorse Drupal si concentrano sulla creazione di moduli. Senza moduli, Drupal in realtà non fa altro che dire: "Qualcuno ha chiesto una pagina! Esiste? No? OK, servirò un 404. '


1
FWIW, è un po 'diverso in D7 (il tema (' pagina ') è sparito e i simboli sono ora memorizzati nella cache del registro del codice), ma il processo generale rimane lo stesso.
MGF

2
Grande spiegazione Eaton, grazie per essere uscito qui. La mia domanda per te è: come fai a eseguire il debug di tutto questo, oltre a mettere var_dump in ciascun modulo per scoprire cosa è successo?
Brian G,

3
Buona domanda. Dipende da cosa stai eseguendo il debug. L'installazione del modulo di sviluppo può aiutarti dandoti alcuni strumenti utili. Il passaggio (nella maggior parte dei casi) è identificare quale modulo è responsabile della costruzione di una determinata pagina. hook_menu () mappa gli URL / percorsi ai moduli, in modo che possa essere d'aiuto. Quindi identificando cosa sta facendo il callback del suo menu - chiamando drupal_get_form () per creare un modulo o un tema ('some_custom_thing') per costruire HTML, ecc. Guarda per l'uso di funzioni come drupal_alter () o module_invoke_all () che attivano eventi per altri anche i moduli ...
Eaton,

Ho trovato questo super utile. Sai come differisce Drupal 7?
Hortitude,

Aggiornamento D7: (vedi anche) drupal.org/node/350780
dreftymac,

63

Meccanismo di servizio della pagina Drupal

Per capire come funziona Drupal, devi comprendere il meccanismo di pubblicazione delle pagine di Drupal.

In breve, tutte le chiamate / urls / richieste sono servite da index.php che carica Drupal includendo vari file / moduli include e quindi chiamando la funzione appropriata, definita nel modulo, per servire la richiesta / url.

Ecco l'estratto del libro, Pro Drupal Development, che spiega il processo di bootstrap di Drupal,

Il processo Bootstrap

Drupal si avvia automaticamente su ogni richiesta attraversando una serie di fasi bootstrap. Queste fasi sono definite in bootstrap.inc e procedono come descritto nelle sezioni seguenti.

Inizializza configurazione

Questa fase popola l'array di configurazione interno di Drupal e stabilisce l'URL di base ($ base_url) del sito. Il file settings.php viene analizzato tramite include_once () e vengono applicate tutte le sostituzioni di variabili o stringhe ivi stabilite. Per i dettagli, consultare le sezioni "Sostituzioni variabili" e "Sostituzioni stringa" dei siti di file / all / default / default.settings.php.

Cache della pagina iniziale

In situazioni che richiedono un alto livello di scalabilità, potrebbe essere necessario invocare un sistema di memorizzazione nella cache prima ancora di tentare una connessione al database. La fase iniziale della cache della pagina consente di includere (con include ()) un file PHP contenente una funzione chiamata page_cache_ fastpath (), che prende il controllo e restituisce il contenuto al browser. La cache della pagina iniziale viene abilitata impostando la variabile page_cache_fastpath su TRUE e il file da includere viene definito impostando la variabile cache_inc sul percorso del file. Vedere il capitolo sulla memorizzazione nella cache per un esempio.

Inizializza database

Durante la fase del database, viene determinato il tipo di database e viene stabilita una connessione iniziale che verrà utilizzata per le query del database.

Nome host / controllo di accesso basato su IP

Drupal consente di vietare gli host in base al nome host / indirizzo IP. Nella fase di controllo degli accessi viene effettuato un rapido controllo per verificare se la richiesta proviene da un host vietato; in tal caso, l'accesso viene negato.

Inizializza gestione sessioni

Drupal sfrutta la gestione delle sessioni integrata di PHP ma sostituisce alcuni dei gestori con i propri per implementare la gestione delle sessioni supportata dal database. Le sessioni vengono inizializzate o ristabilite nella fase della sessione. Qui viene anche inizializzato l'oggetto $ user globale che rappresenta l'utente corrente, anche se per efficienza non tutte le proprietà sono disponibili (vengono aggiunte da una chiamata esplicita alla funzione user_load () quando necessario).

Cache della pagina tardiva

Nella fase avanzata della cache delle pagine, Drupal carica abbastanza codice di supporto per determinare se pubblicare o meno una pagina dalla cache delle pagine. Ciò include l'unione delle impostazioni dal database nell'array creato durante la fase di configurazione dell'inizializzazione e il caricamento o l'analisi del codice del modulo. Se la sessione indica che la richiesta è stata emessa da un utente anonimo e la memorizzazione nella cache della pagina è abilitata, la pagina viene restituita dalla cache e l'esecuzione si interrompe.

Determinazione della lingua

Nella fase di determinazione della lingua, viene inizializzato il supporto multilingue di Drupal e viene presa la decisione su quale lingua verrà utilizzata per servire la pagina corrente in base alle impostazioni del sito e dell'utente. Drupal supporta diverse alternative per determinare il supporto linguistico, come il prefisso del percorso e la negoziazione della lingua a livello di dominio.

Sentiero

Nella fase del percorso, viene caricato il codice che gestisce i percorsi e l'aliasing del percorso. Questa fase consente di risolvere URL leggibili e gestisce la cache e le ricerche del percorso Drupal interne.

Pieno

Questa fase completa il processo di bootstrap caricando una libreria di funzioni comuni, supporto per temi e supporto per mappatura di callback, gestione dei file, Unicode, toolkit immagine PHP, creazione ed elaborazione di moduli, gestione della posta, tabelle ordinabili automaticamente e paging del set di risultati. Il gestore errori personalizzato di Drupal è impostato e tutti i moduli abilitati vengono caricati. Infine, Drupal attiva il hook di init, in modo che i moduli abbiano l'opportunità di essere avvisati prima che inizi l'elaborazione ufficiale della richiesta.

Una volta che Drupal ha completato il bootstrap, sono disponibili tutti i componenti del framework. È tempo di prendere la richiesta del browser e consegnarla alla funzione PHP che la gestirà. Il mapping tra URL e funzioni che li gestiscono viene realizzato utilizzando un registro di callback che si occupa sia del mapping degli URL che del controllo degli accessi. I moduli registrano i loro callback usando l'hook del menu (per maggiori dettagli, vedere il Capitolo 4).

Quando Drupal ha stabilito che esiste un callback a cui l'URL della richiesta del browser è mappato correttamente e che l'utente ha l'autorizzazione ad accedere a quel callback, il controllo viene passato alla funzione di callback.

Elaborazione di una richiesta

La funzione di callback fa tutto il lavoro necessario per elaborare e accumulare i dati necessari per soddisfare la richiesta. Ad esempio, se viene ricevuta una richiesta di contenuto come http://example.com/ q = node / 3, l'URL viene mappato sulla funzione node_page_view () in node.module. L'ulteriore elaborazione recupererà i dati per quel nodo dal database e li inserirà in una struttura di dati. Quindi, è tempo per i temi.

Temi sui dati

Il tema implica la trasformazione dei dati che sono stati recuperati, manipolati o creati in HTML (o XML o altro formato di output). Drupal utilizzerà il tema selezionato dall'amministratore per dare alla pagina Web l'aspetto corretto. L'output risultante viene quindi inviato al browser Web (o altro client HTTP).


20

La risposta di Eaton offre una buona panoramica. (Sono nuovo qui, quindi non posso modificarlo, quindi il commento.)

Il brutale momento "aha" per me è stato realizzare tutto ciò che accade attraverso index.php, e poi attraverso la cascata di moduli (core prima, poi per sito). Per estendere le funzionalità di base non riscriverle. Invece copia il modulo in / siti / tutti / moduli / o / siti / [tuo] / moduli ed estendi QUELLO, oppure crea un nuovo modulo in quei luoghi. Lo stesso per i temi. Le directory dei moduli possono contenere anche codice di visualizzazione, sotto forma di tpl, css ecc.

Se sei abituato a framework di tipo MVC più rigorosi come Rails, Django ecc., Tutto ciò diventa un po 'confuso. I moduli possono mescolare molto codice di visualizzazione e se stai guardando i moduli o i modelli di qualcun altro finirai per camminare indietro nello stack. Questa è la bellezza / il dolore di lavorare in PHP.

Ironia della sorte, "basta creare un'app" potrebbe essere il modo peggiore per imparare questo. Drupal fa così tanto fuori dalla scatola che è semplicemente oscuro fino a quando non capisci il flusso di controllo. Non c'è nulla in un file tpl che ti dice da dove viene una funzione con un nome divertente come l (), per esempio.


7

Dipende dalla profondità della comprensione che stai cercando; se hai una buona conoscenza di php, ti suggerirei di leggere il codice stesso, iniziando con index.php, e poi andando su include / bootstrap.inc, e poi alcuni degli altri script in quella directory.

La chiave include file:

  • menu.inc è molto importante per capire come funziona l'intero sistema, poiché gestisce gran parte della mappatura implicita degli URL al contenuto.
  • common.inc ha la maggior parte delle funzioni altrimenti misteriose che formano la base dell'API.
  • module.inc gestisce le invocazioni di hook menzionate da Eaton
  • form.inc si occupa della visualizzazione, dell'invio e dell'elaborazione dei moduli
  • theme.inc gestisce la presentazione.

C'è anche qualche funzionalità chiave nella directory modules /; in particolare, module / node / node.module costituisce la base del sistema di nodi, che è in generale quello che viene utilizzato per incapsulare il contenuto del sito.

Il codice è, in generale, molto ben commentato e chiaro. L'uso del markup Doxygen all'interno dei commenti significa che il codice è effettivamente la documentazione canonica.

Aiuta anche a farlo usando un editor che può saltare rapidamente alla definizione di una funzione. Usare Vim in combinazione con i tag funziona per me; devi dire a ctags di indicizzare i file .inc, .module, ecc. come file php.


5

Ho imparato un sacco importando il codice .php drupal in un progetto NetBeans. È quindi possibile eseguire il debugger di netbeans e guardare le diverse fasi della pagina riunirsi.


5

I migliori libri sull'argomento sono "Pro Drupal Development" e "Using Drupal".

"Pro Drupal Development" include diversi diagrammi di flusso e sintesi complete di ciascuna delle API di Drupal (moduli, temi, ecc.). È pensato per essere particolarmente istruttivo per le persone che creano i propri moduli e temi, ma ha molto valore per lo sviluppatore esperto di PHP medio che vuole capire Drupal. Oltre a ciò, ho creato un modulo personalizzato per ogni sito che ho creato, solo per ottenere il controllo extra su cose come nascondere selettivamente i campi su vari moduli (che in genere si desidera fare per semplificare la semplificazione dei moduli di nodo per end- utenti), quindi è bene avere questa conoscenza sotto il tuo cappello.

"Utilizzo di Drupal" si rivolge allo sviluppatore del sito che desidera sapere come creare elementi utili come gallerie, blog e siti di social network. Passa attraverso diversi casi d'uso e mostra come configurare i moduli esistenti per fare ogni lavoro. Nel processo ti familiarizza con i moduli aggiuntivi essenziali "Content Construction Kit" (CCK) e "Viste", come creare blocchi e modelli personalizzati e i dettagli del mantenimento di un sito Drupal. Raccomando questo libro soprattutto per coloro che vogliono tenersi aggiornati e USARE subito Drupal. Nel processo acquisisci una comprensione dell'organizzazione interna di Drupal.


5

Questo (per Drupal 6) e questo (per Drupal 7) è una panoramica architettonica piuttosto buona di Drupal. Se vuoi maggiori dettagli, allora inizierei a scrivere qualcosa che la maggior parte della documentazione è buona. Cercare di impararlo ad un alto livello di dettaglio senza qualcosa di concreto da realizzare sarà molto più difficile che provare qualcosa.


4

Nuovo collaboratore qui, con 2 anni di ritardo sulla conversazione ;-)

In risposta a https://stackoverflow.com/a/1070325/1154755

Per estendere le funzionalità di base non riscriverle. Invece copia il modulo in / siti / tutti / moduli / o / siti / [tuo] / moduli ed estendi QUELLO, oppure crea un nuovo modulo in quei luoghi. Lo stesso per i temi.

In realtà, non ho mai dovuto copiare un modulo principale per aggiornarlo. Drupal Hooks dovrebbe essere tutto ciò di cui hai bisogno.

Per i temi, sì, a volte è l'unico modo per andare, ma spesso puoi creare un sottotema per ottenere il risultato di cui hai bisogno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.