프로그래밍 방식으로 현재 노드의 NID를 얻는 방법


26

나는 이상 논의한 적이 drupal.org에이 오래된 스레드 및 그냥 가지 내 머리 회전의 주위를합니다. 경로를 풀고 그 안에서 NID를 파싱하려고합니까? 더 좋은 방법이 있어야합니다.

그리고 같은 솔루션

global $node;
$nid = $node->nid;

사용자 정의 모듈에서 작동하지 않습니다 (템플릿에서 작동한다고 들었습니까?). 오류 또는 아무것도 없으며 값으로 인스턴스화 $node됩니다 NULL.

내가 놓친 것이 분명한 것 같아요.

그렇다면 모범 사례를 따르고 합리적으로 강력한 모듈을 구축하면서 템플릿없이 현재 노드의 NID를 얻는 방법은 무엇입니까?

답변:


50

가정 코드, 나는 핵심에서 가장 자주 사용되는 볼 수있는 방법이 /있는 contrib 모듈 중 하나를 사용하는 노드 페이지에 대한 실행 menu_get_object()또는 arg():

if ($node = menu_get_object()) {
  // Get the nid
  $nid = $node->nid;
}

또는

if (arg(0) == 'node' && is_numeric(arg(1))) {
  // Get the nid
  $nid = arg(1);

  // Load the node if you need to
  $node = node_load($nid);
}

개인적으로 첫 번째 방법을 선호하지만 (조건에 따라 할당하는 것이 좋은 아이디어로 간주되지는 않지만) 두 방법 모두 완벽하게 유효합니다.


1
@ 레타 리온 그래, 나는 매번 조금 죄책감을 느낀다;)
Clive

1
@beth 어떤 기능을 사용합니까? 그리고 그것은 당신이 그것을 호출하는 노드 페이지입니까?
Clive

1
@beth 100 %는 경로 앨리어싱이 활성화 된 상태로 작동합니다. 경로 앨리어싱은와는 아무 상관이없는 라우터 경로 인 메뉴 항목의 node/1, node/2당신은 여전히 문제가 발생하는 경우 당신이 사용하고있는 정확한 코드를 다른 질문의 가치 게시, 그리고 상황의 비트를 제공 할 수있는 등. 그렇다면 우리는 문제가 어디에서 발생하는지 정확히 파악할 수 있습니다.
Clive

1
단일 회선 솔루션$nid = ($node = menu_get_object()) ? $node->nid : NULL;
timofey.com

3
@sheldonkreger 해당 시점에 이미 노드가로드 menu_get_object()되었거나 node_load()정적 캐시에서 가져옵니다. 심지어 일찍, 여전히 그 경우에 당신은 단지 다음 공정에 대한 정적 캐시를 따뜻하게 할 것, (이 노드 페이지이기 때문에) 나중에 페이지 빌드에 핵심 모듈에 의해로드 될 것에 호출하는 경우
Clive

5

arg ()가 더 이상 작동하지 않으므로 Drupal 8에서 가장 쉬운 방법은 다음과 같습니다.

$path_args = explode('/', current_path());
print $path_args[1];

기록 변경


2
이것은 Drupal 7에서도 작동합니다. 그러나 admin / structure / blocks와 같은 노드가 아닌 페이지에있는 경우 유효하지 않은 값 (이 경우 'structure')을받습니다. path_args [1]이 정수인지 확인하기 만하면됩니다.
sheldonkreger


1
@RobLoach하지만 인수 () D8에 존재하지 않습니다
Pouya Sanooei

4

arg(0)'node'를 arg(1)리턴하고 노드 nid를 리턴합니다.

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

1

이 링크는 저에게 도움이되었습니다 : http://www.webomelette.com/node-id-nid-url-path-alias- 내용으로 이동하여 downt를 필터링하여 노드 ID를 보거나 편집 위로 마우스를 가져갈 내용을 찾으십시오. 링크. 편집을 클릭하면 브라우저가 알려주는 하이퍼 링크를 보려면 아래를보십시오.


아나 안녕하세요, Drupal Answers에 오신 것을 환영합니다. 귀하의 답변은 훌륭하지만 (시도에 투표했습니다) 제목에 '모듈에서'가 포함되어 있기 때문에 프로그래밍 방식으로 nid를 얻는 방법을 묻는 질문입니다.
Darvanen

1

현재 허용되는 답변 의 두 번째 방법 은 D7에서 가장 깨끗합니다. 첫 번째 답변 :

if ($node = menu_get_object()) {
  // Get the nid
  $nid = $node->nid;
}

시각적으로 만 깨끗합니다. 실제로, menu_get_object()많은 코드를 호출하고 있으며 예기치 않은 오류가 발생할 수 있습니다. hook_node_grants()함수 내에서 사용 하고 PHP 치명적인 오류가 발생했습니다.

'256'의 최대 함수 중첩 수준에 도달하여 중단되었습니다!

설명은 https://drupal.stackexchange.com/a/69232/9158에 있습니다.

알 수없는 무한 루프 menu_get_object()는 Drupal이 현재 로그인 한 사용자에게 노드에 대한 액세스 권한이 있는지 확인하여 구현이 hook_node_grants()다시 호출되고 호출 menu_get_object()이 발생하여 구현이 hook_node_grants()다시 호출되게하므로 발생합니다. ...

이것은 두 번째 방법을 사용하여 해결되었습니다.

if (arg(0) == 'node' && is_numeric(arg(1))) {
  // Get the nid
  $nid = arg(1);

  // Load the node if you need to
  $node = node_load($nid);
}


-1

D7의 또 다른 옵션 :

function _my_module_get_nid() {
  $path_args = explode('/', current_path());
  //$nid = $path_args[1];
  if(is_int($path_args)) {
    return($path_args[1]);
  }
  // Log that we failed to load a NID.
  else {
    watchdog('my_module', 'Unable to gather NID at: ' . current_path(),  WATCHDOG_WARNING, NULL);
  return FALSE;
  }
}

모듈 외부에서 함수를 사용하려는 경우 함수 이름의 시작 부분에 선행 _을 사용하지 마십시오.


1
이것은 동일하지만 노드가 아닌 모든 경로에서 비싼 워치 독 호출이 있습니다.
beth September

내 코드가 예기치 않게 실패하는지 알고 싶습니다. 이 코드가 노드가 아닌 곳에서 실행되는 것을 원하지 않을 것입니다. 워치 독은 그것이 어디에서 발생하는지 보여 주므로 수정할 수 있습니다. 그렇지 않으면이 코드가 아무 이유없이 (노드가 아닌) 실행되고 있다는 흔적이 없습니다. 그렇지 않으면 위에서 언급 한 D8 방법과 동일합니다.
sheldonkreger

-1
<?php
if (isset($node->nid) && count($node->nid) > 0){
  $mynodeid = $node->nid;
}
?>

답변에 "왜"와 "방법"을 추가해 주시겠습니까? 코드 전용 답변은 효과가있을 수 있지만 실수를 이해하는 데 도움이되지는 않습니다.
Mołot

먼저 실행 전에 노드가 정의되어 있는지 확인합니다.
cptstarling
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.