Do tej pory natknąłem się na te 3 funkcje w Drupal 7, ale tak naprawdę nie jestem pewny, jaka jest między nimi różnica i która jest bardziej odpowiednia, aby uzyskać identyfikator węzła w funkcji wstępnego przetwarzania bloku.
Czy możesz dać mi jakiś wgląd?
Odpowiedzi:
menu_get_object()
zwróci obiekt węzła dla węzła o identyfikatorze 1; jeśli wyświetlana strona to example.com/user/1, wówczasmenu_get_object('user')
zwróci obiekt użytkownika dla użytkownika o identyfikatorze 1.node_load
), które mają zostać wywołane w celu załadowania obiektu odpowiadającego części bieżącej ścieżkidrupal_lookup_path("homepage")
zwróci"node/1"
. Aliasy ścieżek mogą być powiązane z dowolnymi ścieżkami wewnętrznymi, nie tylko ze ścieżkami węzłów.Jeśli wszystko, co chcesz uzyskać, to identyfikator węzła aktualnie pokazanego węzła, wystarczy użyć następującego kodu:
Jeśli potrzebujesz uzyskać obiekt węzła, możesz użyć następującego kodu:
Z tych fragmentów drugi jest lepszy, ponieważ zwraca poprawny obiekt węzła dla ścieżek wewnętrznych, takich jak węzeł / 1 / rewizje / 3 / widok.
Należy pamiętać, że niektóre funkcje przetwarzania wstępnego, takie jak te dla strony lub węzła, mają już funkcję
$variables['node']
. Oznacza to, że w takich przypadkach wystarczy użyć następującego fragmentu kodu w funkcji wstępnego przetwarzania, bez obawy o to, której funkcji użyć.W przypadku innych funkcji wstępnego przetwarzania sprawdź dokumentację, aby zobaczyć, czy istnieje jakaś zmienna zawierająca obiekt węzła. Na przykład, że jest to przypadek
template_preprocess_comment()
, który sprawia, że$variables['node']
dostęp do funkcji przetwarzania wstępnego dla komentarzy.źródło
Jak to się robi na stronie template_preprocess_page Drupal Core :
Wiersz 2267 theme.inc i nowsze:
szablon_preprocess_page używa menu_get_object . Następnie wystarczy sprawdzić, czy węzeł jest zdefiniowany, i uzyskać $ node-> nid.
źródło
Jedną z rzeczy, na które musisz uważać, jest alias ścieżki.
drupal_get_normal_path($path)
aby uzyskać bieżącą ścieżkę, użyj zmiennej systemowej
$_SERVER["REQUEST_URI"]
(Jeśli jesteś na stronie węzła, do której możesz zadzwonić
$node->uri['path']
, to zwróci ścieżkę nie-aliasową. Następnie ponownie, jeśli jesteś na stronie węzła, możesz po prostu użyć$node->nid
.)to zwróci węzeł / XXXX
więc spróbuj czegoś takiego
źródło
To nie jest zły sposób na zrobienie tego. arg () działa na ścieżce wewnętrznej, więc aliasy ścieżek nie będą na nią wpływać.
źródło
menu_get_object
(która po prostu owija się wokół siebie,menu_get_item
więc jest równie dobra).if (arg(0) == 'node' && is_numeric(arg(1)))
wtedyarg(1)
prawie 99% zwróci ci identyfikator węzła. Ale wyłączniearg(1)
może zwrócić ci wiele innych dokumentów tożsamości.W Drupal 8 możesz uzyskać argumenty URL w oparciu o to, co jest w routingu.
Aby uzyskać identyfikator sam:
Jeśli planujesz załadować obiekt węzła, możesz po prostu uzyskać go w ten sposób:
Aby znaleźć nazwy parametrów, możesz użyć:
źródło