Inne odpowiedzi są świetne, dokładne, szczegółowe, ale nie jestem pewien, czy są to „proste słowa” wyjaśniające gołe kości koncepcji, której szukał pytający.
Myślę o hakach jako punkcie, w którym kod zatrzymuje się i krzyczy: „ Czy ktoś jeszcze ma coś do dodania? ”. Każdy moduł może mieć funkcję, która odpowiada na to i jest wyzwalana odpowiednimi danymi przekazywanymi do niego w tym punkcie kodu.
Dobrym prostym przykładem jest hook_node_delete () . Każdy moduł może go użyć, aby za każdym razem usuwać węzeł. Dokumenty mówią ci, że ten haczyk przekazuje moduł obiektu usuniętego węzła do pracy i przedstawia inne przydatne informacje, takie jak dokładny czas jego wywołania (np. Że jest to zanim dane węzła zostaną faktycznie usunięte z bazy danych) i gdzie w kodzie Drupala nazywa się hak (który może być więcej niż jednym miejscem).
Możesz zbadać, jakie haki istnieją i dowiedzieć się, jakie dane są do nich przekazywane, badając rzeczy zaczynające się od „hook_” w interfejsie Drupal .
Haki działają według konwencji nazw: hook_node_delete
na naszym przykładzie, gdy proces usuwania węzła osiąga punkt, w którym wywoływany jest hak, dla każdego modułu z funkcją taką jak ta, w [modulename]_node_delete()
której słowo hook w nazwie haka jest zastępowane nazwą modułu (np. my_amazing_module_node_delete()
), wywoływane są te funkcje.
Dlaczego? Tak więc każdy moduł może zrobić wszystko w tych kluczowych punktach: na przykład możesz spojrzeć na usunięty węzeł i robić rzeczy, które spełniają określony warunek (powiedz, napisz do administratora lub uruchom jakiś długi proces).
Niektóre zaczepy pozwalają zmieniać rzeczy, które zostały wygenerowane tuż przed ich przetworzeniem. Na przykład hook_menu_alter () przekazuje ci bieżące pozycje menu wygenerowane przez system. Każdy moduł może zdefiniować funkcję some_modulename_menu_alter () i spojrzeć na nich, opcjonalnie je zmienić (usunąć niektóre, dodać niektóre, posortować je ...) i przekazać ponownie zmienione menu.
To proste, naprawdę potężne i stanowi sedno tego, jak Drupal działa jako system modułowy. Implementacje haków są sercem większości modułów Drupal.
Przeglądając kod modułu Drupal, możesz zauważyć, które funkcje pochodzą z haków (w przeciwieństwie do funkcji, które są po prostu wywoływane z samego kodu modułu), ponieważ społeczność Drupal egzekwuje konwencję, w której każda implementacja haka ma komentarz przed nim w ten sposób (zwróć uwagę na bit „Implements hook _...”):
/**
* Implements hook_some_hook().
*
* Some descriptive summary of what this does
*/
function my_amazing_module_some_hook() {
Niektóre moduły działające jako interfejsy API definiują własne zaczepy. Na przykład Widoki definiują wiele zaczepów, które pozwalają dodawać, odczytywać i edytować dane w różnych punktach procesu tworzenia lub wyświetlania widoku. Informacje o zaczepach utworzonych w niestandardowych modułach można znaleźć z dwóch miejsc (zakładając, że moduł jest zgodny z konwencjami itp.):
Bootstrapping jest, jak wyjaśnili inni, w zasadzie uruchamianiem - nie powielę innych dobrych jasnych wyjaśnień.
Mówiąc w skrócie, haki są rodzajem mostów, które umożliwiają modułom interakcję ze sobą, zmianę ich struktury i danych, dostarczanie nowych danych itp.
W większości przypadków słowo
hook_
w nazwach funkcji jest zastępowane nazwą Twojego modułu, co zapewnia modułowi dostęp do operacji innego modułu. Na przykład moduł rdzenia drupal zwany „węzłem” wywołuje różne haki. Jedną z nich jesthook_node_update
wywoływana za każdym razem, gdy istniejący węzeł jest aktualizowany. Po wywołaniu tego hooka wywoływana jestmymodule
implementacja twojego modułu (powiedzmy, że go nazywamy )hook_node_update
, co w tym przypadku będzie funkcją w pliku .module modułu o nazwiemymodule_node_update
(Oczywiście ta funkcja może znajdować się w dowolnym pliku w folderze modułu, o ile jest również zawarty w pliku .module). Do tego zaczepu zostaną również przekazane niezbędne parametry (zmienne), których może użyć, zmodyfikować i / lub wrócić do funkcji, która wywołała zaczep.Kiedy po raz pierwszy zacząłem uczyć się Drupala, byłem na tej samej łodzi, co ty, na początku trochę trudno jest pojąć, ale kiedy go zdobędziesz, to takie proste i intuicyjne. Powodzenia.
źródło
Jeden z głównych programistów napisał jakiś czas temu artykuł zatytułowany „Programowanie Drupal z perspektywy obiektowej” . Wyjaśnia, jak haczyki można traktować jako implementację wielu typowych wzorców projektowych . Najlepsze wyjaśnienie haczyków pochodzi z artykułu:
źródło
Bootstrap jest procesem, przez który Drupal buduje stronę, w zasadzie po kolei w całym rdzeniu, motywie i kodzie modułu.
Zasadniczo uruchamia się Drupal i przygotowuje się do pracy jako CMS.
Jest sprytny, ponieważ pozwala nam umieścić haczyki w dowolnym miejscu w naszych modułach i motywach, a proces ładowania początkowego zapewnia, że zostaną uruchomione w odpowiednim momencie.
Na przykład, jeśli użyjesz „hook_form_alter”, aby dodać niestandardowe pole wyboru do formularza, bootstrap Drupala upewni się, że uruchamia ten kod, tuż przed jego renderowaniem.
Jednym z problemów z bootstrap jest to, że cały proces wymaga czasu, nawet jeśli zwracasz tylko niewielką ilość danych. Gdy używasz Drupala z modułem usług jako API i zwraca wiele małych odpowiedzi XHTML lub JSON, uruchamianie całego bootstrapu nie jest zbyt wydajne. Niektórzy sprytni ludzie szukają w Drupal 8 sprytnych rozwiązań.
Ale do renderowania normalnych stron Drupala proces ładowania początkowego działa świetnie, używa systemu buforowania Drupals, aby przyspieszyć i daje całkowitą kontrolę nad każdą częścią witryny. Jeśli uważasz, że Twoja strona jest powolna, zawsze możesz użyć czegoś takiego jak APC lub MemCached, aby przyspieszyć działanie.
Mam nadzieję, że moja odpowiedź była dokładna i wyjaśnia po prostu dla ciebie, nie jestem ekspertem, ale myślę, że tak to działa.
źródło
Bootstrap to proces, podczas którego Drupal inicjuje się; proces faktycznie obejmuje:
$_SERVER
init_set()
Niektóre operacje, które opisałem, są specyficzne dla Drupala 7 lub nowszego, ale większość operacji jest niezależna od wersji Drupal.
Hak to funkcja PHP, którą można wywołać z Drupala lub modułów innych firm, gdy jest to konieczne do wykonania zadania. Zamiast mieć prefiksowaną listę funkcji do wywołania, lista jest budowana sprawdzając włączone moduły i funkcje, które implementują.
Na przykład wykorzystuje Drupal
hook_node_update()
; gdy węzeł jest zapisywany za pomocą node_save () , wykonywany jest następujący kod.To, co robi node_invoke () , to:
$node
jako parametrHaki mogą zapisywać własne dane w bazie danych lub zmieniać wartość zwracaną z funkcji. Ostatnim przypadkiem jest na przykład to, co dzieje się z hook_form_alter () , która zmienia wartość
$form
przekazywaną jako odwołanie do drupal_prepare_form () .Haki Drupal są zwykle wywoływane przy użyciu trzech funkcji:
drupal_alter()
jest funkcją używaną do wywoływania określonych haków, których celem jest zmiana danych przekazywanych jako odniesienie, takich jak hook_form_alter () , hook_hook_info_alter () i hook_tokens_alter () .Istnieją inne funkcje, które są używane do wywoływania przechwyceń, takie jak
node_invoke()
, ale funkcje te zasadniczo wykorzystują jedną z wymienionych wcześniej funkcji.źródło
Haki są punktami i
module_invoke_all
są tkaczem (niestety nie jesteśmy jednoznaczni w implementacji i istnieją inne funkcje tkania). O ile mi wiadomo, Drupal jest jedynym systemem implementującym AOP z funkcjami PHP.Zobacz inne wyjaśnienie dotyczące sposobu działania AOP w Drupal?
źródło
Jeśli chcesz zobaczyć haki, do których Drupal pozwala ci dzwonić, przejdź do api.drupal.org , przejdź do pola wyszukiwania i wpisz „hook_”. To da ci dużą listę większości haków zdefiniowanych przez Drupala. Zrób to samo dla „_alter” i zobacz jeszcze więcej.
Strona węzłów interfejsu API węzła oferuje chronologiczną listę wszystkich zaczepów wywołanych podczas operacji węzła. Możesz zobaczyć moduł Node oraz systemy Entity i Field, które nawzajem się nawracają przy wywoływaniu haków.
Na przykład, jeśli przewiniesz w dół i spojrzysz na sekcję
node_load()
: Moduł Node da ci hook_load (), a następnie przekaże kontrolę systemowi encji, który ładuje niektóre pola. Istnieje cały szereg haczyków polowych, których nie ma na liście, a następnie, gdy to się kończy, system wywołuje systemhook_entity_load()
, zanim przekaże kontrolę z powrotem do węzła, który wywołujehook_node_load()
.Daje to Twojemu kodowi szansę działania na dany węzeł, gdy jest on ładowany, kawałek po kawałku. Nauczenie się tych haków oraz kiedy i dlaczego się je nazywa, jest częścią przygody kodowania Drupal. :-)
Inne systemy również mają haczyki. Takich jak
hook_init()
ihook_boot()
. To prowadzi do części twojego pytania dotyczącej bootstrapu.hook_boot()
jest wywoływany przez Drupala przed załadowaniem systemu buforowania. Więc jeśli moduł musi coś zrobić, zanim Drupal naprawdę się uruchomi, a chcesz, aby Twój kod działał niezależnie od buforowania, to zaimplementujhook_boot()
. W przeciwnym razie, jeśli zależy Ci tylko na stronach, które nie są buforowane, zaimplementujeszhook_init()
.Daje to możliwość implementacji czegoś na wczesnym etapie procesu ładowania, zanim Drupal w pełni się uruchomi, a jednocześnie daje pewną elastyczność co do tego, który punkt w procesie chcesz przechwycić.
Jeśli musisz się upewnić, że Drupal uruchomił się do pewnego momentu, zanim przejdziesz dalej, możesz zadzwonić
drupal_bootstrap()
. Jeśli przejdziesz do tej dokumentacji, zobaczysz dostępne poziomy ładowania początkowego, od zera do wszystkiego.I wreszcie, w projekcie przykładów możesz zobaczyć obszernie udokumentowany kod dla dowolnego podsystemu .
źródło
Haki to funkcje php, bloki konstrukcyjne oparte na konwencjach nazewnictwa „twoja_nazwa_modulu”, mają ułatwić programistom tworzenie modułów .
Moduły to prawdziwa okazja, ponieważ umożliwiają zarówno CORE, jak i niestandardowe funkcje w twoim systemie Drupal. Zatem moduły są wykonane z haków, a kiedy moduł jest aktywowany w twojej instalacji Drupala, jego funkcje haków można wywoływać z innych modułów dzięki funkcji module.inc module_invoke_all ($ hook) lub module_invoke.
Dlatego, aby właściwie zrozumieć, czym są haczyki, powinieneś naprawdę ubrudzić sobie ręce i wypróbować rozwój modułu. W tym celu zacznij od pobrania i wypróbowania niektórych przykładów Drupala dla programistów , powinieneś również zapoznać się z tworzeniem modułów .
Oto kilka przydatnych przykładów Drupala dla programistów wspomnianych powyżej:
Przykład implementacji hook_block_view () w module block_example
Ten hak umożliwia dostęp do tworzenia bloków Drupala w celu wyświetlania niestandardowych bloków w witrynie. Jest to możliwe, ponieważ block.module ma funkcję _block_render_block, która umożliwia wszystkim modułom zdefiniowanie ich widoku hook_block (zwróć uwagę na ostatnią linię module_invoke):
Przykład implementacji hook_menu () w module render_example
Ten hak jest połączony z systemem routingu adresów URL Drupala i definiuje wzorce adresów URL z powiązanymi wywołaniami zwrotnymi renderowania używanymi przez moduł. Jest wywoływany z system.module .
Jeśli chodzi o bootstrap, to po prostu musisz wiedzieć, że jest wykonywany przy każdym żądaniu strony. Naprawdę radzę przeczytać tę odpowiedź dotyczącą przepełnienia stosu , wyjaśnia ona, w jaki sposób bootstrap i zaczepy są powiązane, ale oddzielone.
Jeśli chodzi o wyświetlanie strony internetowej, wyświetlanie html w witrynie Drupala jest najczęściej uzyskiwane za pomocą tablic renderujących i tematów.
źródło
Gdziekolwiek moduł wywołuje moduł_implements () http://api.drupal.org/api/drupal/includes%21module.inc/function/module_implements/7 Drupal uruchomi wszystkie poprawnie nazwane funkcje w odpowiedniej kolejności na podstawie ich wagi. Są to tak zwane funkcje przechwytujące, ponieważ w dokumentacji modułów wykorzystujących moduły_implementacyjne widzisz takie rzeczy, jak hook_menu (gdy menu wywołuje wszystkie funkcje zaprojektowane do zwracania pozycji menu). Słowo „hook” musi zostać zastąpione nazwą modułu wdrażającego go, a Drupal zajmie się resztą.
Istnieje również funkcja drupal_alter (), która uruchamia wszystkie poprawnie nazwane funkcje alter, z zamiarem umożliwienia ci zmiany rzeczy, które zostały wcześniej zarejestrowane przez inny hook.
Zasadniczo zmienne przekazują argumenty przez referencję, dzięki czemu można edytować obiekt bezpośrednio, podczas gdy „normalne” haki zwykle powodują zwrot nowych rzeczy.
Chodzi o to, że każdy moduł (w tym własny) można łatwo rozszerzyć, prosząc Drupala o wywołanie wszystkich wymaganych funkcji przechwytujących i odzyskanie tego, co wracają do przetworzenia. Moduł wywołujący funkcje przechwytujące nie musi nic wiedzieć o modułach, które implementują przechwytywanie, a moduły wdrażające przechwytywanie tak naprawdę nie muszą wiedzieć nic o module wywołującym przechwytywanie. Jedyne, co oba moduły muszą wiedzieć, to struktura zwracanych lub zmienianych danych.
W praktyce najczęściej stosuje się haczyki do:
źródło
Masz wiele odpowiedzi powyżej, ale chcę dać odpowiedź w znacznie prostszy sposób, aby zrozumieć bardzo podstawową koncepcję haków. Haki są tak naprawdę wbudowane w funkcje drupala, aby zarządzać różnymi rzeczami i wykonywać różne zadania w rdzeniu, możesz zsynchronizować własne funkcje z tymi wbudowanymi funkcjami drupala, aby dodać ich funkcjonalność do własnych funkcji, wywołując różne haki.
Mam nadzieję, że zrozumiesz!
źródło
Dla mnie chodzi przede wszystkim o funkcję module_implements, jeśli chodzi o hooks and core (D7). Jedną rzeczą, którą uważam za kluczową do zrozumienia jest to, że pisząc hak, aby coś zmodyfikować, w żadnym wypadku nie masz ostatniego słowa na temat tego, co dzieje się ze strukturami danych, z którymi masz do czynienia. Twój haczyk po prostu dostaje się do linii (kolejki) funkcji, które RÓWNIEŻ działają na tych samych strukturach danych, niezależnie od tego, czy są to menu, łącza_menu, bloki, węzły, użytkownicy lub jakakolwiek jednostka lub element renderujący.
Aby naprawdę zobaczyć, jak haczyki są wykorzystywane w oczekiwany sposób, musisz wiedzieć lub wiedzieć, gdzie jesteś (twój hak) w linii. Jest to określane na podstawie masy twojego mule. Rdzeń Drupala po prostu wywołuje odpowiednio nazwane haki w porządku rosnącym i wszystko, co dzieje się z danymi, ma miejsce.
Wcześniej pisałem haczyki, które nie przyniosły żadnego efektu, ale po godzinach walenia głową dowiedziałem się, że masa mojego modułu była zbyt lekka, a kolejne haki skutecznie nie robiły tego, co zrobiłem, lub całkowicie ignorowały to wszystko razem.
Dobrze napisany haczyk nie „poradzi sobie” ani „nie zmusi” do bycia ostatnim, ale „umieści się z innymi”, upewniając się, że zachowują struktury danych zgodnie z oczekiwaniami reszty haczyków wzdłuż linii.
A mówiąc o „linii” haków. Przez lata trollowałem google dla Drupala, ten obraz wydaje się być dobrą reprezentacją listy możliwych procesów wstępnych i procesów.
źródło
W znacznie prostszy sposób haki pomagają programistom zmienić istniejącą funkcjonalność zgodnie z wymaganiami bez wprowadzania zmian w istniejącym kodzie. Bardziej jak funkcja abstrakcyjna w php.
Przykład: Utworzyłeś moduł rezerwacji biletu autobusowego. Zgodnie z Twoim kodem, jeśli bilet jest raz zarezerwowany, nie można edytować lokalizacji odbioru, co było twoim wymaganiem dla tego projektu. Załóżmy, że twój przyjaciel potrzebuje tego samego modułu dla podobnych wymagań, z tym wyjątkiem, że użytkownik może zmienić lokalizację odbioru. Jakoś musi użyć twojego modułu, a ty nie chcesz, żeby wprowadzał zmiany w kodzie. Udostępniasz interfejs (w naszym przypadku podpięcie), w którym mógłby wprowadzić zmiany bez wprowadzania zmian w module.
W drupal do drupal-7 mamy haczyki na moduły i motywy. Aby dowiedzieć się, jak działa hook, sprawdź haki drupal.org, aby utworzyć niestandardowy hook, sprawdź ten link
źródło
Haki Zezwól modułom na interakcję z rdzeniem Drupala. System modułowy Drupala opiera się na koncepcji „haków”. Hak to funkcja PHP o nazwie foo_bar (), gdzie „foo” to nazwa modułu (którego nazwa pliku to foo.module), a „bar” to nazwa haka.
źródło