URLからノードIDを取得するにはどうすればよいですか?


47

これまでのところ、Drupal 7でこれら3つの関数に出くわしましたが、それらの違いは何なのか、ブロック前処理関数でノードIDを取得するのにより適しているかどうかはわかりません。

何か洞察をいただけますか?


node.tpl.phpでこれを行っていますか?はいの場合、$ node-> nidを使用できます。
バート

いいえ、ブロックはノードページに印刷されますが、ブロック前処理関数でこれを行っています。
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()は、引数として渡されたエイリアスに関連付けられた内部パスを返す関数です。「ホームページ」が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']



4

注意しなければならないことの1つは、パスエイリアスです。

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];

3
arg(1);

悪い方法ではありません。arg()は内部パスで機能するため、パスエイリアスの影響を受けません。


これは事実であり、パスエイリアスの影響を受けません。ただし、node / XXXXXを使用している場合は、$ node-> nidを使用できます。@French、どこでarg(1)を使用しますか、それはあなたが望むものを返しますか?
-iStryker

モジュールフックにいる場合は、ノードにアクセスできません。ビューの引数も例になります。
ジェレミーフランス語

おかげでジェレミーと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.