wake-up-neo.net

Wie funktioniert Drupal?

Könnte jemand einen Überblick über die Architektur des Drupal= 7 Kontrollflusses geben? Vielleicht im Sinne eines Flussdiagramms darüber, wie eine Seite generiert wird. Welche zusätzlichen Ressourcen würden Sie vorschlagen, um zu beraten, wie Drupal funktioniert?

149
alice

Drupal kann in dieser Hinsicht verwirrend sein, zum Teil, weil es einen relativ tiefen Funktionsstapel hat. Obwohl es sich um ein prozedurales PHP) Ereignis-/Listener-Skript handelt, gibt es in seiner Architektur keinen einfachen "Ablauf" im Hauptskript PHP=). Ich habe kürzlich eine Präsentation zu diesem Thema geschrieben, und die Folien sind in einer Diashow veröffentlicht, aber eine kurze Zusammenfassung auf hoher Ebene kann nützlich sein.

  • Die index.php-Datei von Drupal fungiert als Frontside-Controller. Alle Seiten werden durchgeleitet und die "tatsächliche" URL/der Pfad, den der Benutzer angefordert hat, wird als Parameter an index.php übergeben.
  • Das Pfad-Routersystem (MenuAPI) von Drupal wird verwendet, um den angeforderten Pfad einem bestimmten Plugin-Modul zuzuordnen. Dieses Plugin-Modul ist für die Erstellung des "primären Inhalts" der Seite verantwortlich.
  • Sobald der primäre Seiteninhalt erstellt ist, ruft index.php das Thema ('page', $ content) auf, das den Inhalt an das Theming/Skinning-System von Drupal übergibt. Dort ist es in Sidebars/Headern/Widgets/etc ... eingebunden.
  • Die gerenderte Seite wird dann an Apache zurückgegeben und an den Browser des Benutzers zurückgesendet.

Während des gesamten Vorgangs lösen Drupal und Plug-in-Module von Drittanbietern Ereignisse aus und warten auf deren Antwort. Drupal nennt dies das 'Hook'-System Das 'Blog'-Modul kann zum Beispiel' Benutzer 'abfangen, indem es eine Funktion namens blog_user () implementiert. In Drupal= parlance, das heißt hook_user ().

Es ist ein bisschen klobig, aber aufgrund einer PHP Quirk (es behält eine interne Hashtabelle aller geladenen Funktionen bei), erlaubt es Drupal), schnell nach Hörern zu suchen Durchlaufen einer Liste installierter Plug-ins. Für jedes Plug-in kann function_exists () für das entsprechend benannte Muster aufgerufen werden und die Funktion, falls vorhanden, aufgerufen werden. ("Ich löse das 'login'-Ereignis aus. Existiert die' mymodule_login'-Funktion "Ich rufe es an. Gibt es" yourmodule_login "? Nein? Wie wäre es mit" nextmodule_login "?" Usw.) Auch hier ist ein Hauch klobig, aber es funktioniert ziemlich gut.

Alles , was in Drupal passiert, geschieht, weil eines dieser Ereignisse ausgelöst wird. Die MenuAPI weiß nur, welche URLs/Pfade werden von verschiedenen Plugin-Modulen behandelt, da es das 'menu'-Ereignis (hook_menu) auslöst und alle Metadaten-Plugin-Module sammelt, mit denen sie antworten. ("Ich kümmere mich um die URL' news/recent ', und hier ist die Funktion für Aufruf, wenn diese Seite erstellt werden muss ... ") Der Inhalt wird nur gespeichert, weil Drupals FormAPI für die Erstellung einer Seite verantwortlich ist und das Ereignis" Ein Formular wurde gesendet "für ein Modul auslöst, auf das geantwortet werden soll. Die stündliche Wartung erfolgt, weil hook_cron ( ) ausgelöst wird und jedes Modul mit mymodulenname_cron () als Funktionsname seine Funktion aufruft.

Alles andere sind letztendlich nur Details - wichtige Details, aber Variationen zu diesem Thema. index.php ist der Controller, das Menüsystem bestimmt, was die "aktuelle Seite" ist, und beim Erstellen dieser Seite werden viele Ereignisse ausgelöst. Plugin - Module können sich in diese Ereignisse einhängen und den Workflow ändern/zusätzliche Informationen bereitstellen/etc. Dies ist auch einer der Gründe, warum sich Drupal= Ressourcen auf das Erstellen von Modulen konzentrieren. Ohne Module macht Drupal= eigentlich nichts anderes als zu sagen ", fragte jemand für eine Seite! Existiert es? Nein? OK, ich werde eine 404 servieren. '

157
Eaton

Drupal Page Serving Mechanism

Um zu verstehen, wie Drupal funktioniert, müssen Sie den Mechanismus für die Seitenbereitstellung in Drupal verstehen.

Kurz gesagt, alle Aufrufe/URLs/Anforderungen werden von index.php bedient, wobei Drupal geladen wird, indem verschiedene Include-Dateien/Module eingeschlossen werden und anschließend die entsprechende, in module definierte Funktion aufgerufen wird, um die Anforderung/URL zu bedienen.

Hier ist der Auszug aus dem Buch Pro Drupal Development, in dem der bootstrap -Prozess von Drupal erläutert wird.

Der Bootstrap Prozess

Drupal bootet sich bei jeder Anfrage selbst, indem es eine Reihe von bootstrap Phasen durchläuft. Diese Phasen werden in bootstrap.inc definiert und verfahren wie in den folgenden Abschnitten beschrieben.

Konfiguration initialisieren

Diese Phase füllt das interne Konfigurations-Array von Drupal und legt die Basis-URL ($ base_url) der Site fest. Die settings.php-Datei wird über include_once () analysiert, und alle dort festgelegten Variablen- oder Zeichenfolgenüberschreibungen werden angewendet. Weitere Informationen finden Sie in den Abschnitten "Variable Overrides" und "String Overrides" der Datei sites/all/default/default.settings.php.

Early Page Cache

In Situationen, in denen ein hohes Maß an Skalierbarkeit erforderlich ist, muss möglicherweise ein Cachesystem aufgerufen werden, bevor überhaupt eine Datenbankverbindung hergestellt werden kann. In der frühen Seiten-Cache-Phase können Sie (mit include ()) eine PHP -Datei einfügen, die eine Funktion namens page_cache_fastpath () enthält, die den Inhalt übernimmt und an den Browser zurückgibt. Der frühe Seiten-Cache wird aktiviert, indem die Variable page_cache_fastpath auf TRUE gesetzt wird. Die einzuschließende Datei wird definiert, indem die Variable cache_inc auf den Pfad der Datei gesetzt wird. Ein Beispiel finden Sie im Kapitel zum Zwischenspeichern.

Datenbank initialisieren

Während der Datenbankphase wird der Datenbanktyp ermittelt und eine erste Verbindung hergestellt, die für Datenbankabfragen verwendet wird.

Hostname/IP-basierte Zugriffskontrolle

Drupal erlaubt das Sperren von Hosts pro Hostname/IP-Adresse. In der Zugriffskontrollphase wird schnell geprüft, ob die Anforderung von einem gesperrten Host stammt. In diesem Fall wird der Zugriff verweigert.

Session Handling initialisieren

Drupal nutzt die in PHP integrierte Sitzungsbehandlung, überschreibt jedoch einige der Handler, um die datenbankgestützte Sitzungsbehandlung zu implementieren. Sitzungen werden in der Sitzungsphase initialisiert oder wiederhergestellt. Das globale $ user-Objekt, das den aktuellen Benutzer darstellt, wird auch hier initialisiert, obwohl aus Effizienzgründen nicht alle Eigenschaften verfügbar sind (sie werden bei Bedarf durch einen expliziten Aufruf der user_load () -Funktion hinzugefügt).

Später Seiten-Cache

In der späten Seiten-Cache-Phase lädt Drupal genügend unterstützenden Code, um zu bestimmen, ob eine Seite aus dem Seiten-Cache bereitgestellt werden soll oder nicht. Dies umfasst das Zusammenführen von Einstellungen aus der Datenbank in das Array, das während der Initialisierungskonfigurationsphase erstellt wurde, und das Laden oder Parsen des Modulcodes. Wenn die Sitzung angibt, dass die Anforderung von einem anonymen Benutzer ausgegeben wurde und das Seiten-Caching aktiviert ist, wird die Seite aus dem Cache zurückgegeben und die Ausführung gestoppt.

Sprachbestimmung

In der Phase der Sprachermittlung wird die mehrsprachige Unterstützung von Drupal initialisiert und anhand der Website- und Benutzereinstellungen entschieden, in welcher Sprache die aktuelle Seite angezeigt wird. Drupal unterstützt verschiedene Alternativen zum Bestimmen der Sprachunterstützung, z. B. das Pfadpräfix und die Sprachaushandlung auf Domänenebene.

Pfad

In der Pfadphase wird Code geladen, der Pfade und Pfadaliasing verarbeitet. In dieser Phase können für Menschen lesbare URLs aufgelöst werden und die internen Drupal -Pfad-Caching- und Suchvorgänge ausgeführt werden.

Voll

Diese Phase schließt den bootstrap -Prozess ab, indem eine Bibliothek mit allgemeinen Funktionen, Themenunterstützung und Unterstützung für Callback-Mapping, Dateibehandlung, Unicode, PHP Image-Toolkits, Formularerstellung und -verarbeitung und E-Mail geladen wird Handhabung, automatisch sortierbare Tabellen und Ergebnismengen-Paging. Der benutzerdefinierte Fehlerbehandler von Drupal wird festgelegt, und alle aktivierten Module werden geladen. Schließlich löst Drupal den Init-Hook aus, sodass Module die Möglichkeit haben, benachrichtigt zu werden, bevor die offizielle Verarbeitung der Anforderung beginnt.

Sobald Drupal das Bootstrapping abgeschlossen hat, sind alle Komponenten des Frameworks verfügbar. Es ist an der Zeit, die Anfrage des Browsers an die PHP -Funktion weiterzuleiten, die sie bearbeiten wird. Die Zuordnung zwischen URLs und Funktionen, die diese verarbeiten, erfolgt mithilfe einer Rückrufregistrierung, die sowohl die URL-Zuordnung als auch die Zugriffssteuerung übernimmt. Module registrieren ihre Rückrufe über den Menü-Hook (Details siehe Kapitel 4).

Wenn Drupal festgestellt hat, dass ein Rückruf vorhanden ist, dem die URL der Browseranforderung erfolgreich zugeordnet wurde, und der Benutzer über die Berechtigung zum Zugriff auf diesen Rückruf verfügt, wird die Steuerung an die Rückruffunktion übergeben.

Eine Anfrage bearbeiten

Die Rückruffunktion erledigt alle erforderlichen Arbeiten, um die zur Erfüllung der Anforderung erforderlichen Daten zu verarbeiten und zu sammeln. Wenn beispielsweise eine Anforderung für Inhalt wie http://example.com/ q = node/3 empfangen wird, wird die URL der Funktion node_page_view () in node.module zugeordnet. Bei der weiteren Verarbeitung werden die Daten für diesen Knoten aus der Datenbank abgerufen und in eine Datenstruktur eingefügt. Dann ist es Zeit für das Thema.

Theming der Daten

Beim Theming werden die abgerufenen, bearbeiteten oder erstellten Daten in HTML (oder XML oder ein anderes Ausgabeformat) umgewandelt. Drupal verwendet das vom Administrator ausgewählte Thema, um der Webseite das richtige Erscheinungsbild zu verleihen. Die resultierende Ausgabe wird dann an den Webbrowser (oder einen anderen HTTP-Client) gesendet.

60
amitgoyal

Die Antwort von Eaton bietet einen guten Überblick. (Ich bin neu hier, also kann ich ihn nicht modifizieren, daher der Kommentar.)

Der brutale "Aha" -Moment für mich war die Erkenntnis, dass alles über index.php und dann über den Wasserfall der Module (erst nach Kern, dann nach Ort) geschieht. Um die Kernfunktionalität zu erweitern, schreiben Sie sie nicht um. Kopieren Sie das Modul stattdessen nach/sites/all/modules/oder/sites/[yoursite]/modules und erweitern Sie THAT, oder erstellen Sie an diesen Stellen ein neues Modul. Gleiches gilt für Themen. Modulverzeichnisse können auch Anzeigecode in Form von tpl, css usw. enthalten.

Wenn Sie daran gewöhnt sind, MVC-Frameworks wie Rails, Django usw. zu verschärfen, wird dies alles etwas verwirrend. Module können eine Menge Anzeigecode enthalten, und wenn Sie sich die Module oder Vorlagen einer anderen Person ansehen, wandern Sie irgendwann rückwärts durch den Stapel. Das ist die Schönheit/der Schmerz in PHP zu arbeiten.

Ironischerweise könnte "nur eine App erstellen" der schlechteste Weg sein, dies zu lernen. Drupal macht so viel aus dem Rahmen, was einfach unklar ist, bis Sie den Kontrollfluss herausfinden. In einer tpl-Datei steht nichts darüber, woher beispielsweise eine Funktion mit einem unterhaltsamen Namen wie l() stammt.

20
axoplasm

http://drupal.org/handbooks

Lesen Sie die Handbücher, insbesondere den Leitfaden für Themenentwickler. Drupal unterstützt mehrere Theme-Engines. Zen verwendet phptemplate, achten Sie also auf diesen Teil des Handbuchs.

Für die Modulentwicklung ist die API unter api.drupal.org dokumentiert.

besonders, wenn Sie die Informationen schnell und schnell erhalten müssen http://www-128.ibm.com/developerworks/ibm/osource/implement.html

9
joe

Es hängt davon ab, wie tief Sie nach einem Verständnis suchen. Wenn Sie sich mit PHP auskennen, empfehle ich Ihnen, den Code selbst zu lesen, beginnend mit index.php, und dann mit der Datei includes/bootstrap.inc und einigen anderen Skripten in diesem Verzeichnis fortzufahren.

Die Schlüssel-Include-Dateien:

  • menu.inc ist sehr wichtig, um die Funktionsweise des Gesamtsystems zu verstehen, da es einen Großteil der impliziten Zuordnung von URLs zu Inhalten verarbeitet.
  • common.inc verfügt über die meisten ansonsten mysteriösen Funktionen, die die Basis der API bilden.
  • module.inc verarbeitet die von Eaton erwähnten Hook-Aufrufe
  • form.inc befasst sich mit der Anzeige, Übermittlung und Verarbeitung von Formularen
  • theme.inc übernimmt die Präsentation.

Es gibt auch einige Schlüsselfunktionen im Verzeichnis modules /; Insbesondere bildet modules/node/node.module die Basis des Knotensystems, das im Allgemeinen zur Kapselung von Site-Inhalten verwendet wird.

Der Code ist im Allgemeinen sehr gut kommentiert und klar. Die Verwendung von Doxygen-Markup innerhalb des Kommentars bedeutet, dass der Code effektiv die kanonische Dokumentation ist.

Es ist auch hilfreich, einen Editor zu verwenden, mit dem Sie schnell zur Definition einer Funktion springen können. Die Verwendung von vim in Kombination mit ctags funktioniert bei mir. Sie müssen ctags anweisen, .inc-, .module- usw. -Dateien als PHP-Dateien zu indizieren.

7
intuited

Ich habe eine Menge gelernt, indem ich den drupal .php-Code in ein NetBeans-Projekt importiert habe. Anschließend können Sie den NetBeans-Debugger ausführen und beobachten, wie die verschiedenen Phasen der Seite zusammenlaufen.

5
Ben Hammond

Die besten Bücher zu diesem Thema sind "Pro Drupal Development" und "Using Drupal".

"Pro Drupal Development" enthält mehrere Nizza-Flussdiagramme und ausführliche Zusammenfassungen aller Drupal-APIs (Formulare, Themen usw.). Es soll besonders lehrreich für Leute sein, die ihre eigenen Module und Themen erstellen, hat aber einen großen Wert für den durchschnittlichen PHP-versierten Entwickler, der Drupal verstehen möchte. Außerdem habe ich für jede Site, die ich erstellt habe, ein benutzerdefiniertes Modul erstellt, um die zusätzliche Kontrolle über Dinge wie das selektive Ausblenden von Feldern in verschiedenen Formularen zu erlangen. Benutzer), so ist es gut, dieses Wissen unter dem Hut zu haben.

"Using Drupal" richtet sich an den Website-Entwickler, der wissen möchte, wie man gute Inhalte wie Galerien, Blogs und soziale Netzwerke erstellt. Es werden mehrere Anwendungsfälle behandelt und es wird gezeigt, wie vorhandene Module für die einzelnen Aufgaben konfiguriert werden. Dabei macht es Sie mit den grundlegenden Zusatzmodulen "Content Construction Kit" (CCK) und "Views" (Ansichten), der Erstellung benutzerdefinierter Blöcke und Vorlagen und den Hinweisen für die Verwaltung eines Drupalvertraut. _ Seite? ˅. Ich empfehle dieses Buch besonders für diejenigen, die auf dem Laufenden bleiben und Drupal sofort verwenden möchten. Dabei erhalten Sie ein Verständnis für die interne Organisation von Drupal.

5
Scott Lahteine

This (for Drupal 6) & this (for Drupal 7) ist eine ziemlich gute Architektur Überblick über Drupal. Wenn Sie mehr Details wünschen, würde ich anfangen, etwas zu schreiben. Die meisten der Dokumentation sind gut. Der Versuch, sie mit einem hohen Detaillierungsgrad zu erlernen Ohne etwas Konkretes wird es viel schwieriger sein, etwas auszuprobieren.

5
Jeremy French

Neuer Mitwirkender hier, 2 Jahre zu spät im Gespräch ;-)

Antworten auf https://stackoverflow.com/a/1070325/1154755

Um die Kernfunktionalität zu erweitern, schreiben Sie sie nicht um. Kopieren Sie stattdessen das Modul in/sites/all/modules/oder/sites/ [yoursite] /modules und erweitern Sie THAT oder erstellen Sie ein neues Modul in diesen setzt. Gleiches gilt für Themen.

Eigentlich musste ich nie ein Kernmodul kopieren, um es zu aktualisieren. Drupal Haken sollten alles sein, was Sie brauchen.

Ja, bei Themen ist dies manchmal der einzige Weg, aber häufig können Sie ein Unterthema erstellen, um das gewünschte Ergebnis zu erzielen.

4
Robin Millette