Jak uzyskać identyfikator węzła z adresu URL?

47

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?

silkAdmin
źródło
Robisz to w node.tpl.php czy coś takiego? Jeśli tak, możesz użyć $ node-> nid.
Bart
Nie, robię to w funkcji wstępnego przetwarzania bloku, chociaż blok jest drukowany na stronie węzła.
silkAdmin,

Odpowiedzi:

63

Nie jestem pewien, jaka jest między nimi różnica

  • menu_get_object () zwraca obiekt powiązany z aktualnie wyświetlaną stroną. Jeśli kod zostanie wykonany, gdy Drupal wyświetla stronę example.com/node/1, wówczas 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ówczas menu_get_object('user')zwróci obiekt użytkownika dla użytkownika o identyfikatorze 1.
  • menu_get_item () zwraca tablicę zawierającą indeks dla każdego pola zawartego w tabeli „menu_router”. To zawiera:
    • ścieżka: bieżąca ścieżka wywołania zwrotnego menu
    • load_functions: tablica nazw funkcji (jak node_load), które mają zostać wywołane w celu załadowania obiektu odpowiadającego części bieżącej ścieżki
    • access_callback: callback, który sprawdza, czy aktualnie zalogowany użytkownik ma dostęp do pozycji menu
    • page_callback: nazwa funkcji, która renderuje stronę
    • tytuł: tytuł strony powiązanej z pozycją menu
  • drupal_lookup_path () to funkcja, która zwraca wewnętrzną ścieżkę związaną z aliasem przekazanym jako argument. Jeśli „strona główna” to alias powiązany z example.com/node/1, wówczas drupal_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.

i która jest bardziej odpowiednia do uzyskania identyfikatora węzła w funkcji wstępnego przetwarzania bloku.

Jeśli wszystko, co chcesz uzyskać, to identyfikator węzła aktualnie pokazanego węzła, wystarczy użyć następującego kodu:

if (arg(0) == 'node') {
  $nid = arg(1);
}

Jeśli potrzebujesz uzyskać obiekt węzła, możesz użyć następującego kodu:

if ($node = menu_get_object()) {
  // Use the node object.
}

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ć.

if (isset($variables['node'])) {
  // Check the node ID or other properties.
}

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.

kiamlaluno
źródło
4

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

  $node_path = explode('/', drupal_get_normal_path($path));
  $nid = $node_path[1];
iStryker
źródło
3
arg(1);

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ć.

Jeremy French
źródło
To prawda, aliasy ścieżek nie będą na to wpływać. Ale jeśli jesteś w węźle / XXXXX, możesz po prostu użyć $ node-> nid. @Francusku, gdzie jeszcze użyłbyś arg (1) i zwróciłbyś to, czego chcesz?
iStryker
jeśli jesteś w punkcie zaczepienia modułu, nie będziesz miał dostępu do węzła. Argumenty dotyczące widoków mogą być również przykładem.
Jeremy French
dzięki jeremy i istryker, zaktualizowałem moje pytanie, może być jaśniejsze. Chociaż spróbuję obu rozwiązań, dzięki
silkAdmin
1
Używanie arg () jest bardzo złym pomysłem, wiążesz się ze ścieżką, użyj menu_get_object(która po prostu owija się wokół siebie, menu_get_itemwięc jest równie dobra).
if (arg(0) == 'node' && is_numeric(arg(1)))wtedy arg(1)prawie 99% zwróci ci identyfikator węzła. Ale wyłącznie arg(1)może zwrócić ci wiele innych dokumentów tożsamości.
leymannx
2

W Drupal 8 możesz uzyskać argumenty URL w oparciu o to, co jest w routingu.

Aby uzyskać identyfikator sam:

$nid = \Drupal::routeMatch()->getRawParameter('node');

Jeśli planujesz załadować obiekt węzła, możesz po prostu uzyskać go w ten sposób:

$node = \Drupal::routeMatch()->getParameter('node');

Aby znaleźć nazwy parametrów, możesz użyć:

$possible_parameters = \Drupal::routeMatch()->getParameters();
oknate
źródło