Obecnie próbuję zaimplementować pole obrazu, do którego odwołuje się węzeł, w mojej witrynie Drupal 7, która zmieni tryb wyświetlania w zależności od logiki programowej tuż przed renderowaniem. Pole jest obecnie renderowane na wielu typach treści za pomocą ustawień trybu wyświetlania, z których każdy używa formatera pola „Rendered node”.
pierwsze podejscie
Moim pierwszym pomysłem było wdrożenie następujących, biorąc pod uwagę, że hak to hak to hak:
function HOOK_field_formatter_view( $entity_type, $entity, $field ... ){
switch ($display['type']) {
case 'node_reference_node':
/* Programatical logic here to modfy field render settings */
break;
}
}
Oczywiście wymiana HACKA na nazwę mojego modułu.
To nie ma znaczenia, czy powyższe będzie ogień przed lub po pierwotnej funkcji node_reference_field_formatter_view
w node_reference.module
bo bym albo zastąpić go za całkowicie lub wyjście, z nadzieją, zmodyfikować jego wartości przed renderowania. Jedyny problem polega na tym, że powyższy hak wydaje się działać tylko dla poszczególnych modułów - tzn. Nie jest szeroki dla całej witryny, więc w zasadzie nie uruchamia się dla mojego modułu.
Teraz oczywiście mogę napisać własny formater pola, aby wyrenderować renderowany węzeł. Ale wydaje się to trochę marnotrawstwem, biorąc pod uwagę, że już istnieje.
inne podejścia
Moje inne podejścia zostały do HOOK_preprocess_node
a HOOK_preprocess_field
jednak były nie zawierają żadnych view_mode
informacji, a druga zawiera co najmniej 5 różnych skomplikowanych struktur, które wszystkie mają odniesienia do view_mode
właściwości na różnych poziomach - i czuje się dość hacky musiał modyfikować każdy z ich wartości. Nawet po zmianie niektórych view_mode
właściwości wynikowy obraz się nie zmienia.
pytanie
Czy ktoś wie o czystym sposobie wejścia przed renderowaniem formatera pola (modułu contrib) i zmiany jego ustawień na podstawie żądania na stronę - tj. Bez konieczności zmiany ustawień stałego trybu wyświetlania rzeczywistego typu zawartości?
hook_field_formatter_view_alter()
podobnego od ponad roku, po prostu niestety nie istnieje. FYIhook_preprocess_node()
zdecydowanie nie miećview_mode
dostęp do niego, to w$vars['view_mode']
nie$vars['node']->view_mode
których może być skłonny spróbować.view_mode
dalejhook_preprocess_node
, głupcze mnie! Zastanawiam się, czy coś takiegohook_field_formatter_view_alter()
istnieje w D8 ...Odpowiedzi:
Pytanie wspomina, że
hook_field_formatter_view()
jest wywoływane tylko w module inicjującym, ale możesz przejąć na własność formatyzatora pól za pośrednictwemhook_field_formatter_info_alter()
.Powinieneś być w stanie ustawić
module
klucz formatyzatora na MYMODULE, np .:Następnie możesz wdrożyć
MYMODULE_field_formatter_view()
, opcjonalnie zasilając istniejący moduł, który go obsłużył, aby uzyskać element do zmiany.źródło
field_formatter
funkcjonalności węzła_referencyjnego tj.MYMODULE_field_formatter_settings_summary
IMYMODULE_field_formatter_settings_form
(nawet jeśli są to tylko funkcje proxy z powrotem do oryginalnego modułu), w przeciwnym razie back- end UI psuje się na dowolnym panelu trybu wyświetlania, gdy próbował znaleźć te metody w niewłaściwym module.Ok, więc zdałem sobie sprawę, dlaczego moje zmiany
#view_mode
w albohook_preprocess_node
ihook_preprocess_fields
nie działa. (Podziękowania dla Clive'a za wskazanie, że całkowicie przegapiłem obecność#view_mode
whook_preprocess_node
) .Mój problem wynikał z faktu, że
#view_mode
został już przetworzony i przekształcony we właściwą#image_style
właściwość - coś, czego nie szukałem.Mimo to zmiana tej wartości wydaje się zbyt mocno zależeć od tego, w jaki hak ją zmodyfikowałeś. W końcu udało mi się jednak trochę kodu, który faktycznie zmienia renderowany obraz:
Powyższe wciąż nie wydaje się bardzo wymowne, ale przynajmniej działa. Przyjmuję słowo Clive'a, że taka metoda _alter nie istnieje dla formaterów pola - szkoda, formaterery są niezwykle potężną cechą D7, fajnie byłoby mieć większą zdolność rozszerzania.
W każdym razie, jeśli przyszli ludzie będą mieli lepsze pomysły, odpowiedz :)
źródło
Najłatwiejszym rozwiązaniem będzie użycie Panelizatora .
Jeśli nie korzystasz z Panelizera, ale z domyślnych trybów widoku Drupal lub Display Suite, spróbuj hook_field_display_alter () lub hook_field_display_ENTITY_TYPE_alter () .
Masz encję, kontekst wyświetlania oraz wszystkie ustawienia formatyzatora. I możesz łatwo zmienić ustawienia renderowania w polu. Możesz nawet zmienić formatyzator pól na inny.
To podejście działa dla mnie idealnie. Jedyną wadą jest to, że możesz pomylić się z różnymi ustawieniami w interfejsie użytkownika „Zarządzaj wyświetlaniem”.
źródło
https://www.drupal.org/node/2130757 To dobry przykład. hook_field_formatter_third_party_settings_form () jest przydatny do zmiany formy istniejącego formatera pola.
Ale to nie działa z grupami pól.
źródło