URL에서 노드 ID를 어떻게 얻습니까?


47

지금까지 Drupal 7에서이 3 가지 기능을 살펴 봤지만 그 차이점이 무엇인지 확실하지 않으며 블록 사전 프로세스 기능에서 노드 ID를 얻는 데 더 적합합니다.

통찰력 좀 주 시겠어요?


node.tpl.php 또는 이와 비슷한 작업을 수행하고 있습니까? 그렇다면 $ node-> nid를 사용할 수 있습니다.
Bart

아니요. 블록 전처리 기능 에서이 작업을 수행하고 있지만 블록은 노드 페이지에 인쇄됩니다.
silkAdmin

답변:


63

나는 그들 사이의 차이점이 무엇인지 확실하지 않습니다.

  • menu_get_object () 는 현재 표시된 페이지와 관련된 객체를 반환합니다. Drupal이 example.com/node/1 페이지를 표시 할 때 코드가 실행되면 menu_get_object()ID가 1 인 노드의 노드 객체를 반환합니다. 표시되는 페이지가 example.com/user/1이면 menu_get_object('user')ID가 1 인 사용자의 사용자 개체를 반환합니다.
  • menu_get_item () 은 "menu_router"테이블에 포함 된 각 필드에 대한 색인을 포함하는 배열을 리턴합니다. 여기에는 다음이 포함됩니다.
    • path : 메뉴 콜백의 현재 경로
    • load_functions : node_load현재 경로의 일부에 해당하는 객체를로드하기 위해 호출 할 함수 이름의 배열 (예 :)
    • access_callback : 현재 로그인 한 사용자가 메뉴 항목에 액세스 할 수 있는지 확인하는 콜백
    • page_callback : 페이지를 렌더링하는 함수의 이름
    • title : 메뉴 항목과 관련된 페이지 제목
  • drupal_lookup_path () 는 인수로 전달 된 별칭과 관련된 내부 경로를 반환하는 함수입니다. "homepage"가 example.com/node/1과 연관된 별명 인 경우을 drupal_lookup_path("homepage")리턴 "node/1"합니다. 경로 별명은 노드 경로뿐만 아니라 모든 내부 경로와 연관 될 수 있습니다.

그리고 블록 전처리 기능에서 노드 ID를 얻는 데 더 적합합니다.

현재 표시된 노드의 노드 ID 만 얻으려면 다음 코드를 사용해야합니다.

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

노드 객체를 가져와야 할 경우 다음 코드를 사용할 수 있습니다.

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

이러한 스 니펫 중 두 번째는 node / 1 / revisions / 3 / view와 같은 내부 경로에 대한 올바른 노드 오브젝트를 리턴하므로 더 좋습니다.

페이지의 기능 또는 노드와 같은 일부 사전 처리 기능에는 이미가 $variables['node']있습니다. 즉, 이러한 경우 어떤 함수를 사용할지 걱정하지 않고 사전 처리 함수에서 다음 스 니펫을 사용해야합니다.

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

다른 사전 처리 기능에 대해서는 문서를 확인하여 노드 오브젝트를 포함하는 변수가 있는지 확인하십시오. 예를 들어, 그것은을위한 경우가 template_preprocess_comment()만드는 $variables['node']덧글에 대한 전처리 기능을 사용할 수 있습니다.



4

주의해야 할 사항은 경로 별칭입니다.

drupal_get_normal_path($path)

현재 경로를 얻으려면 시스템 변수를 사용하십시오. $_SERVER["REQUEST_URI"]

(노드 페이지에있는 경우을 호출하면 $node->uri['path']별칭이 아닌 경로가 반환됩니다. 그런 다음 다시 노드 페이지에 있으면을 사용할 수 있습니다 $node->nid.)

이것은 노드 / XXXX를 반환합니다

그래서 같은 것을 시도하십시오

  $node_path = explode('/', drupal_get_normal_path($path));
  $nid = $node_path[1];

3
arg(1);

그것을하는 나쁜 방법이 아닙니다. arg () 는 내부 경로에서 작동하므로 경로 별칭의 영향을받지 않습니다.


이것은 사실이며 경로 별칭의 영향을받지 않습니다. 그러나 node / XXXXX에 있다면 $ node-> nid를 사용할 수 있습니다. @French, 다른 곳에서 arg (1)을 사용하면 원하는 것을 반환합니까?
iStryker

모듈 훅에 있다면 노드에 액세스 할 수 없습니다. 뷰 인수도 예제 일 수 있습니다.
Jeremy French

덕분에 제레미와 istryker, 난, 난 당신의 솔루션을 모두 시도 할 것이다하지만이 .. 명확 수 있습니다 덕분에 내 질문에 업데이트 한
silkAdmin

1
arg ()를 사용하는 것은 매우 나쁜 생각입니다. 경로에 바인딩하고 사용하십시오 menu_get_object(이것은 menu_get_item똑같이 좋습니다).

if (arg(0) == 'node' && is_numeric(arg(1)))다음 arg(1)거의 99 %의 수익 당신에게 노드 ID를하는 방법 것입니다. 그러나 단독으로 arg(1)도 많은 다른 ID를 반환 할 수 있습니다.
leymannx

2

Drupal 8에서는 라우팅의 내용을 기반으로 URL 인수를 얻을 수 있습니다.

ID 만 얻으려면 :

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

노드 객체를로드하려는 경우 간단히 다음과 같이 얻을 수 있습니다.

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

매개 변수 이름을 찾으려면 다음을 사용할 수 있습니다.

$possible_parameters = \Drupal::routeMatch()->getParameters();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.