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?
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?
Odpowiedzi:
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.
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. ”
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).
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 ().
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ą:
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.
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ę.
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.
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ś.
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.