it-swarm-ko.tech

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

지금까지 Drupal 7) 에서이 3 가지 기능을 발견했지만 그 차이점이 무엇인지 확실하지 않으며 블록 전처리 함수에서 노드 ID를 얻는 데 더 적합합니다. .

통찰력 좀 주 시겠어요?

47
silkAdmin

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

  • 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']를 사용할 수 있습니다.

63
kiamlaluno

Drupal Core의 template_preprocess_page :

theme.inc 의 2267 행 :

if ($node = menu_get_object()) {
    $variables['node'] = $node;
}

template_preprocess_page는 menu_get_object 를 사용합니다. 그 후 노드가 정의되어 있는지 확인하고 $ node-> nid를 얻는 것입니다.

7
Bart

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

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];
4
iStryker
arg(1);

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

3
Jeremy French

Drupal 8에서, 라우팅에 무엇이 있는지에 따라 url 인수를 얻을 수 있습니다.

ID 만 얻으려면 :

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

노드 객체를로드 할 계획이라면 다음과 같이 간단히 얻을 수 있습니다.

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

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

$possible_parameters = \Drupal::routeMatch()->getParameters();
2
oknate