drupal.orgの古いスレッド を調べたところ、頭がぐるぐる回るだけです。パスを引き下げ、その中からNIDを解析しようとしていますか?もっと良い方法があるはずです。
とのようなソリューション
global $node;
$nid = $node->nid;
カスタムモジュールでは機能しません(テンプレートで機能すると言われていますが)。エラーなどは発生せず、NULL
値を使用して$node
をインスタンス化するだけです。
私が見逃していることが本当に明らかな何かがあるに違いないような気がします。
では、どのようにして、テンプレートなしで現在のノードのNIDを取得し、ベストプラクティスに従い、適度に堅牢なモジュールを構築するのでしょうか。
コードがノードページで実行されていると仮定すると、コア/コントリビューションモジュールで最もよく使用されるメソッドは、 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);
}
私は個人的には最初の方法を好みます(条件付きの割り当ては一部の人にとっては良いアイデアとは見なされませんが)が、どちらも完全に有効です。
Drupal 8)でこれを行う最も簡単な方法は、arg()が機能しないためです。
$path_args = explode('/', current_path());
print $path_args[1];
arg(0)
は「ノード」を返し、arg(1)
はノードnidを返します。
if (arg(0) == 'node' && is_numeric(arg(1))) {
$nid = arg(1);
}
このリンクは私に役立ちました: http://www.webomelette.com/node-id-nid-url-path-alias -コンテンツに移動し、downtをフィルターして、表示したいコンテンツを見つけます= Node [編集]のIDにカーソルを合わせて、下に移動します。ブラウザを見て、[編集]をクリックした場合にリンクが続くことを示すハイパーリンクを確認します。
現在の2番目の方法 受け入れられた回答 は、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()
の実装が再度呼び出されます...
これは2番目の方法を使用して解決されました。
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);
}
D8では:
$node = \Drupal::routeMatch()->getParameter('node');