nodeidを取得するには?


7

ページのURLからの情報を使用せずに現在のページのDrupalでノードIDを取得する方法 すなわち:

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

上記のアプローチは使いたくありません。

回答:


16

それでも間接的にURLを経由しますが、これはそれを取得する最も簡単な方法です:menu_get_object

<?
if ($node = menu_get_object()) {
 $nid = $node->nid;
}
?>

ノードがある場合、いずれにしてもメニューシステムによって既にロードされており、これは静的キャッシュからロードされることに注意してください。


2
このアプローチにより、ノードIDが有効であり、ユーザーがノードIDにアクセスできることが確認されます。

menu_get_objectを試してみましたが、ノード属性を取得できません

2
「ノード属性」を定義します。ノードを表示している場合、menu_get_object()は完全な$ nodeオブジェクトを返します。$ nodeを他の場所で取得する場合は、それを指定してください;)
Berdir

2
このアプローチにより、@ chxが指摘するように、IDが有効でアクセス可能になります。しかし、非常に重い場合もあります。多くの場合、DB呼び出しが多くなります。先週、私は1つ$node = menu_get_object()をコードの元の質問に似たものに置き換え、ページあたり500以上のデータベース要求を節約しました。注意して使用してください!
バーク

1
バーク、menu_get_objectは静的にキャッシュされた1つのnode_loadのみをトリガーし、ノードページにはすでにそこにあるはずです。また、単一ノードのロードに対する500以上のdbリクエスト?信じられない…。何かおかしい。

1

arg()メソッドを使用できない技術的な理由がない限り(または他の投稿と同様にアクセスを確認する必要がある場合)、arg()メソッドが最も単純で最も高速です。

追加のプロパティが必要な場合は、node_load()を実行してIDを取得できます。現在のノードを取得しようとしていると仮定すると、これはパフォーマンスにほとんど影響しません。


0

ノードのIDを取得するには、を呼び出し$node->nidます。実際、いつかはSEO対応のURLに切り替える可能性があるため、URLからIDを取得することは最善の解決策ではありません。

このドキュメントから、で$node定義されているように見えるpage.tpl.phpので、利用できるはずです。

<?php
  // In a template file...

  if ($node) {
    echo $node->nid;
  }
  else {
    // you are viewing taxonomy, view, etc
  }
?>

テンプレートファイルの外部からアクセスする必要があります。

モジュールからどこにアクセスしようとしていますか?「現在のページ」とはどのようなコンテキストで話しているのですか?
ゾートニー、2011年

「内部」URLがnode / 12であり、パスを使用してクリーンなURLを作成する場合、元のコードは引き続き機能することに注意してください。これは、システムに関する限りdrupal node / 12パスがURLであるためです。
mirzu


0

D7でのもう1つのかなり単純で信頼できるアプローチは、

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

Zourtneyの提案は、私の場合、未定義のインデックスエラー引き起こします。


0

はい、それは私を古くから混乱させましたが、arg配列の使用はほとんどすべての状況で機能するはずであり、Drupalはpathまたはpathautoによって作成された実際のURLからの変換を処理します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.