web-dev-qa-db-ja.com

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() は、引数として渡されたエイリアスに関連付けられた内部パスを返す関数です。 「ホームページ」が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.
}
_

これらのスニペットのうち、2番目のほうが優れています。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's 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を使用できます。)

これはnode/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