Jak działa Drupal? [Zamknięte]

151

Czy ktoś mógłby przedstawić przegląd architektury przepływu sterowania w Drupalu 7? Być może w sensie schematu blokowego przedstawiającego sposób generowania strony. Jakie dodatkowe zasoby sugerowałbyś skonsultowanie się z działaniem Drupala?

domoaringatoo
źródło
1
Pytanie? Więc dlaczego sam o to nie
zadałeś
Nie wydaje mi się, żeby wtedy stosowano przepełnienie. :)
Jeremy French
2
Społeczność Drupala zawsze szuka osób do pomocy w dokumentacji. Dlaczego nie pomóc, jeśli dokumentacja jest niezgrabna lub tutoriale są kiepskie? :)
Rimian
4
dokumentowanie wymaga zrozumienia ... które wymaga dokumentacji lub dużego doświadczenia
Damon

Odpowiedzi:

160

Drupal może być niejasny na tym froncie, częściowo dlatego, że ma stosunkowo głęboki stos funkcji. Chociaż jest to PHP proceduralne, jego architektura jest sterowana wyłącznie zdarzeniami / odbiornikami i nie ma prostego „przepływu” w głównym skrypcie PHP, który można by obejrzeć. Niedawno przeprowadziłem prezentację na ten temat , a slajdy są publikowane w ramach udostępniania slajdów, ale przydatne może być szybkie podsumowanie wysokiego poziomu.

  • Plik index.php w Drupalu działa jako kontroler frontside. Wszystkie strony są przez niego przesyłane potokiem, a „rzeczywisty” adres URL / ścieżka, o którą prosił użytkownik, jest przekazywany jako parametr do pliku index.php.
  • System routera ścieżek Drupala (MenuAPI) służy do dopasowania żądanej ścieżki do danego modułu wtyczki. Ten moduł wtyczki jest odpowiedzialny za budowanie „podstawowej zawartości” strony.
  • Po zbudowaniu zawartości strony głównej, index.php wywołuje motyw ('page', $ content), który przekazuje zawartość do systemu motywowania / skórowania Drupala. Tam jest opakowany w paski boczne / nagłówki / widżety / itp.
  • Wyrenderowana strona jest następnie przekazywana z powrotem do Apache i wysyłana z powrotem do przeglądarki użytkownika.

Podczas całego tego procesu Drupal i moduły wtyczek innych firm odpalają zdarzenia i nasłuchują ich reakcji. Drupal nazywa to systemem „haków” i jest zaimplementowany przy użyciu konwencji nazewnictwa funkcji. Na przykład moduł „blog” może przechwytywać związane z „użytkownikiem”, implementując funkcję o nazwie blog_user (). W języku Drupal nazywa się to hook_user () .

Jest to trochę niezgrabne, ale z powodu dziwactwa PHP (utrzymuje wewnętrzną tablicę hashy wszystkich załadowanych funkcji), pozwala Drupalowi szybko sprawdzić, czy słuchacze są po prostu przez iterację po liście zainstalowanych wtyczek. Dla każdej wtyczki może wywołać funkcję function_exists () na odpowiednio nazwanym wzorcu i wywołać funkcję, jeśli istnieje. („Uruchamiam zdarzenie 'login'. Czy istnieje funkcja 'mymodule_login'? Nazwę ją. Czy 'yourmodule_login' istnieje? Nie? A może 'nextmodule_login'?” Itd.) Znowu, trochę niezgrabny, ale to działa całkiem nieźle.

Wszystko, co dzieje się w Drupalu, dzieje się z powodu odpalenia jednego z tych zdarzeń. MenuAPI wie tylko o tym, jakie adresy URL / ścieżki są obsługiwane przez różne moduły wtyczek, ponieważ uruchamia zdarzenie „menu” (hook_menu) i gromadzi wszystkie odpowiadające im moduły wtyczek metadanych. („Zajmę się adresem URL„ wiadomości / najnowsze ”, a oto funkcja, która ma wywołać, gdy trzeba zbudować tę stronę…”) Treść zostaje zapisana tylko dlatego, że interfejs FormAPI Drupala jest odpowiedzialny za tworzenie strony i uruchamia zdarzenie „przesłano formularz”, na które moduł ma odpowiedzieć. Konserwacja godzinowa ma miejsce, ponieważ wywoływana jest funkcja hook_cron (), a każdy moduł z mymodulename_cron () jako nazwą funkcji będzie miał swoją funkcję wywołaną.

Wszystko inne to ostatecznie tylko szczegóły - ważne szczegóły, ale wariacje na ten temat. index.php jest kontrolerem, system menu określa, co to jest "bieżąca strona", a podczas tworzenia tej strony jest wywoływanych wiele zdarzeń. Moduły wtyczek mogą podłączać się do tych zdarzeń i zmieniać przepływ pracy / dostarczać dodatkowe informacje / itp. Jest to również jeden z powodów, dla których tak wiele zasobów dotyczących Drupala koncentruje się na tworzeniu modułów. Bez modułów Drupal właściwie nie robi nic poza powiedzeniem: „Ktoś poprosił o stronę! Czy to istnieje? Nie? OK, podam 404. ”

Eaton
źródło
1
FWIW, w D7 jest trochę inaczej (motyw („strona”) zniknął, a symbole są teraz buforowane w rejestrze kodu), ale ogólny proces pozostaje taki sam.
FGM
2
Świetne wyjaśnienie Eaton, dzięki za spędzenie czasu tutaj. Moje pytanie do Ciebie brzmi: jak to wszystko debugować, oprócz umieszczania var_dump w każdym module, aby dowiedzieć się, co się stało?
Brian G,
3
Dobre pytanie. To zależy od tego, co debugujesz. Zainstalowanie modułu deweloperskiego może pomóc, udostępniając przydatne narzędzia. Krok (w większości przypadków) polega na zidentyfikowaniu modułu odpowiedzialnego za zbudowanie danej strony. hook_menu () mapuje adresy URL / ścieżki do modułów, aby to mogło pomóc. Następnie zidentyfikuj, co robi jego wywołanie zwrotne w menu - wywołanie drupal_get_form () w celu zbudowania formularza lub motywu ('some_custom_thing') w celu zbudowania HTML, itp. Obserwuj użycie funkcji takich jak drupal_alter () lub module_invoke_all (), które wyzwalają zdarzenia dla innych moduły też ...
Eaton
Uważam, że to bardzo pomocne. Czy wiesz, czym różni się Drupal 7?
Hortitude
Aktualizacja D7: (zobacz także) drupal.org/node/350780
dreftymac,
63

Mechanizm udostępniania stron w Drupalu

Aby zrozumieć, jak działa Drupal, musisz zrozumieć mechanizm obsługi stron w Drupalu.

Krótko mówiąc, wszystkie wywołania / adresy URL / żądania są obsługiwane przez plik index.php, który ładuje Drupala, włączając różne pliki / moduły nagłówkowe, a następnie wywołując odpowiednią funkcję, zdefiniowaną w module, w celu obsługi żądania / adresu URL.

Oto fragment książki, Pro Drupal Development, który wyjaśnia proces bootstrap w Drupalu:

Proces Bootstrap

Drupal samoczynnie ładuje się na każde żądanie, przechodząc przez serię faz ładowania początkowego. Fazy ​​te są zdefiniowane w pliku bootstrap.inc i postępuj zgodnie z opisem w kolejnych sekcjach.

Zainicjuj konfigurację

Ta faza wypełnia wewnętrzną tablicę konfiguracji Drupala i ustanawia podstawowy adres URL ($ base_url) witryny. Plik settings.php jest analizowany za pomocą funkcji include_once () i stosowane są wszelkie ustalone tam zastąpienia zmiennych lub łańcuchów. Zobacz sekcje „Variable Overrides” i „String Overrides” w pliku sites / all / default / default.settings.php, aby uzyskać szczegółowe informacje.

Wczesna pamięć podręczna stron

W sytuacjach wymagających wysokiego poziomu skalowalności może być konieczne wywołanie systemu buforowania przed próbą połączenia z bazą danych. Faza wczesnej pamięci podręcznej strony umożliwia dołączenie (za pomocą funkcji include ()) pliku PHP zawierającego funkcję o nazwie page_cache_ fastpath (), która przejmuje i zwraca zawartość do przeglądarki. Pamięć podręczna wczesnych stron jest włączana przez ustawienie zmiennej page_cache_fastpath na wartość TRUE, a plik, który ma zostać dołączony, jest definiowany przez ustawienie zmiennej cache_inc na ścieżkę do pliku. Przykład znajduje się w rozdziale poświęconym buforowaniu.

Zainicjuj bazę danych

W fazie bazy danych określany jest typ bazy danych i nawiązywane jest pierwsze połączenie, które będzie używane do zapytań do bazy danych.

Kontrola dostępu oparta na nazwie hosta / adresie IP

Drupal umożliwia blokowanie hostów na podstawie nazwy hosta / adresu IP. W fazie kontroli dostępu następuje szybkie sprawdzenie, czy żądanie pochodzi od zablokowanego hosta; jeśli tak, odmowa dostępu.

Zainicjuj obsługę sesji

Drupal korzysta z wbudowanej obsługi sesji PHP, ale zastępuje niektóre procedury własnymi, aby zaimplementować obsługę sesji wspieranej przez bazę danych. Sesje są inicjowane lub ponownie ustanawiane w fazie sesji. Globalny obiekt $ user reprezentujący bieżącego użytkownika jest również inicjalizowany tutaj, chociaż ze względu na wydajność nie wszystkie właściwości są dostępne (są one dodawane przez jawne wywołanie funkcji user_load () w razie potrzeby).

Pamięć podręczna późnych stron

W późnej fazie pamięci podręcznej strony Drupal ładuje wystarczającą ilość kodu pomocniczego, aby określić, czy wyświetlić stronę z pamięci podręcznej strony. Obejmuje to scalanie ustawień z bazy danych do tablicy, która została utworzona podczas fazy inicjowania konfiguracji oraz ładowanie lub analizowanie kodu modułu. Jeśli sesja wskazuje, że żądanie zostało wysłane przez anonimowego użytkownika i jest włączone buforowanie strony, strona jest zwracana z pamięci podręcznej i wykonywanie zostaje zatrzymane.

Określenie języka

Na etapie określania języka uruchamiane jest wielojęzyczne wsparcie Drupala i podejmowana jest decyzja, który język będzie używany do obsługi bieżącej strony w oparciu o ustawienia witryny i użytkownika. Drupal obsługuje kilka alternatyw dla określenia obsługi języków, takich jak prefiks ścieżki i negocjacja języka na poziomie domeny.

Ścieżka

W fazie ścieżki ładowany jest kod obsługujący ścieżki i aliasy ścieżek. Ta faza umożliwia rozwiązywanie czytelnych dla człowieka adresów URL i obsługuje wewnętrzne buforowanie i wyszukiwanie ścieżek w Drupalu.

Pełny

Ta faza kończy proces ładowania początkowego przez załadowanie biblioteki wspólnych funkcji, obsługę motywów i obsługę mapowania wywołań zwrotnych, obsługi plików, Unicode, zestawów narzędzi obrazów PHP, tworzenia i przetwarzania formularzy, obsługi poczty, automatycznie sortowanych tabel i stronicowania zestawów wyników. Ustawiona jest niestandardowa obsługa błędów Drupala i ładowane są wszystkie włączone moduły. Wreszcie Drupal odpala hak inicjalizacyjny, dzięki czemu moduły mają możliwość otrzymania powiadomienia przed rozpoczęciem oficjalnego przetwarzania żądania.

Gdy Drupal zakończy ładowanie, wszystkie komponenty frameworka są dostępne. Pora przyjąć żądanie przeglądarki i przekazać je funkcji PHP, która je obsłuży. Mapowanie między adresami URL i funkcjami, które je obsługują, jest realizowane za pomocą rejestru wywołań zwrotnych, który zajmuje się zarówno mapowaniem adresów URL, jak i kontrolą dostępu. Moduły rejestrują swoje wywołania zwrotne za pomocą haka menu (aby uzyskać więcej informacji, zobacz Rozdział 4).

Gdy Drupal ustali, że istnieje wywołanie zwrotne, do którego adres URL żądania przeglądarki został pomyślnie odwzorowany, i że użytkownik ma uprawnienia dostępu do tego wywołania zwrotnego, sterowanie jest przekazywane do funkcji wywołania zwrotnego.

Przetwarzanie wniosku

Funkcja wywołania zwrotnego wykonuje wszelkie czynności wymagane do przetwarzania i gromadzenia danych potrzebnych do realizacji żądania. Na przykład, jeśli zostanie odebrane żądanie treści, takie jak http://example.com/ q = node / 3, adres URL jest mapowany na funkcję node_page_view () w node.module. Dalsze przetwarzanie spowoduje pobranie danych dla tego węzła z bazy danych i umieszczenie ich w strukturze danych. Następnie nadszedł czas na motywy.

Tematowanie danych

Tematyka polega na przekształceniu pobranych, przetworzonych lub utworzonych danych do formatu HTML (lub XML lub innego formatu wyjściowego). Drupal użyje motywu wybranego przez administratora, aby nadać stronie internetowej odpowiedni wygląd i styl. Wynikowe dane wyjściowe są następnie wysyłane do przeglądarki internetowej (lub innego klienta HTTP).

amitgoyal
źródło
20

Odpowiedź firmy Eaton zapewnia dobry przegląd. (Jestem tu nowy, więc nie mogę go modyfikować, stąd komentarz.)

Brutalnym momentem "aha" było dla mnie uświadomienie sobie, że wszystko dzieje się za pośrednictwem index.php, a następnie przez wodospad modułów (najpierw rdzeń, potem strona). Aby rozszerzyć podstawową funkcjonalność, nie przepisuj jej. Zamiast tego skopiuj moduł do / sites / all / modules / lub / sites / [twoja_witryna] / modules i rozszerz TO, lub utwórz nowy moduł w tych miejscach. To samo dotyczy motywów. Katalogi modułów mogą również zawierać kod wyświetlania w postaci tpl, css itp.

Jeśli jesteś przyzwyczajony do bardziej rygorystycznych frameworków typu MVC, takich jak Rails, Django itp., Wszystko to może być trochę zagmatwane. Moduły mogą mieszać dużo kodu wyświetlania, a jeśli patrzysz na moduły lub szablony innej osoby, w końcu skończysz chodząc wstecz po stosie. Oto piękno / ból pracy w PHP.

Jak na ironię, „po prostu zbuduj aplikację” może być najgorszym sposobem nauczenia się tego. Drupal robi tak wiele po wyjęciu z pudełka, które są po prostu niejasne, dopóki nie zrozumiesz przepływu kontroli. Na przykład w pliku tpl nie ma nic, co wskazywałoby, skąd pochodzi funkcja o zabawnej nazwie, takiej jak l ().

aksoplazma
źródło
7

To zależy od tego, jak głębokiego zrozumienia szukasz; jeśli masz dobrą znajomość php, sugerowałbym przeczytanie samego kodu, zaczynając od index.php, a następnie przechodząc do include / bootstrap.inc, a następnie kilka innych skryptów w tym katalogu.

Kluczowe pliki obejmują:

  • Menu.inc jest bardzo ważne, aby zrozumieć, jak działa cały system, ponieważ obsługuje wiele niejawnych mapowań adresów URL na zawartość.
  • common.inc zawiera większość tajemniczych funkcji, które stanowią podstawę API.
  • module.inc obsługuje wywołania hooków, o których wspomniał Eaton
  • form.inc zajmuje się wyświetlaniem, przesyłaniem i przetwarzaniem formularzy
  • theme.inc obsługuje prezentację.

Istnieje również kilka kluczowych funkcji w katalogu modules /; w szczególności moduły / node / node.module stanowią podstawę systemu węzłów, który jest ogólnie tym, co jest używane do hermetyzacji treści witryny.

Kod jest ogólnie bardzo dobrze skomentowany i jasny. Wykorzystanie znaczników Doxygen w komentarzach oznacza, że ​​kod w rzeczywistości jest dokumentacją kanoniczną.

Pomaga to również zrobić za pomocą edytora, który może szybko przejść do definicji funkcji. U mnie działa vim w połączeniu z ctags; musisz powiedzieć ctags, aby indeksowały pliki .inc, .module, itp. jako pliki php.

intuicyjnie
źródło
5

Nauczyłem się ładować, importując kod drupal .php do projektu NetBeans. Następnie możesz uruchomić debugger netbeans i obserwować, jak różne fazy strony łączą się.

Ben Hammond
źródło
5

Najlepsze książki na ten temat to „Pro Drupal Development” i „Using Drupal”.

Program „Pro Drupal Development” zawiera kilka ładnych schematów blokowych i dokładne podsumowania każdego z interfejsów API Drupala (formularze, motywy itp.). Ma to być szczególnie pouczające dla ludzi tworzących własne moduły i motywy, ale ma dużą wartość dla przeciętnego programisty zorientowanego na PHP, który chce zrozumieć Drupala. Poza tym stworzyłem niestandardowy moduł dla każdej witryny, którą zbudowałem, aby uzyskać dodatkową kontrolę nad takimi rzeczami, jak selektywne ukrywanie pól w różnych formularzach (co zazwyczaj chcesz zrobić w celu uproszczenia formularzy węzłów na koniec użytkowników), więc dobrze jest mieć tę wiedzę pod kapeluszem.

„Korzystanie z Drupala” jest skierowane do twórców witryn, którzy chcą wiedzieć, jak tworzyć dobre rzeczy, takie jak galerie, blogi i serwisy społecznościowe. Przedstawia kilka przypadków użycia i pokazuje, jak skonfigurować istniejące moduły do ​​wykonania każdego zadania. W trakcie tego procesu zapoznaje Cię z podstawowymi modułami dodatkowymi „Content Construction Kit” (CCK) i „Views”, jak tworzyć niestandardowe bloki i szablony, a także ze szczegółami obsługi witryny Drupal. Polecam tę książkę szczególnie tym, którzy chcą nabrać szybkości i od razu KORZYSTAĆ z Drupala. W ten sposób zyskujesz zrozumienie wewnętrznej organizacji Drupala.

Scott Lahteine
źródło
5

To (dla Drupala 6) i to (dla Drupala 7) to całkiem niezły przegląd architektury drupal. Jeśli chcesz uzyskać więcej szczegółów, zacznę pisać coś, co większość dokumentacji jest dobra. Próba nauczenia się tego na wysokim poziomie szczegółowości bez czegoś konkretnego do osiągnięcia będzie znacznie trudniejsza niż wypróbowanie czegoś.

Jeremy French
źródło
4

Nowy współpracownik tutaj, 2 lata spóźniony na rozmowę ;-)

W odpowiedzi na https://stackoverflow.com/a/1070325/1154755

Aby rozszerzyć podstawową funkcjonalność, nie przepisuj jej. Zamiast tego skopiuj moduł do / sites / all / modules / lub / sites / [twoja_witryna] / modules i rozszerz TO, lub utwórz nowy moduł w tych miejscach. To samo dotyczy motywów.

Właściwie nigdy nie musiałem kopiować podstawowego modułu, aby go zaktualizować. Hooki Drupala powinny być wszystkim, czego potrzebujesz.

W przypadku motywów tak, czasami jest to jedyna droga, ale często można zbudować podmotyw, aby uzyskać pożądany wynik.

Robin Millette
źródło