これまでのところ、Drupal 7でこれらの3つの関数に出くわしましたが、それらの違いが何であるか、ブロックプリプロセス関数でノードIDを取得するのに適しているかどうかはよくわかりません。
何か洞察を与えてくれますか?
両者の違いがよくわかりません
menu_get_object()
はIDが1であるノードのノードオブジェクトを返します。表示されているページがexample.com/user/1の場合、menu_get_object('user')
は、IDが1のユーザーのユーザーオブジェクトを返します。node_load
_など)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']
_を使用できるようにします。
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を取得するだけです。
注意が必要なのは、パスのエイリアスです。
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];
arg(1);
それを行うための悪い方法ではありません。 arg() は内部パスで機能するため、パスエイリアスの影響を受けません。
Drupal 8では、ルーティングの内容に基づいてURL引数を取得できます。
IDだけを取得するには:
$nid = \Drupal::routeMatch()->getRawParameter('node');
ノードオブジェクトをロードする場合は、次の方法で簡単に取得できます。
$node = \Drupal::routeMatch()->getParameter('node');
パラメータ名を見つけるには、以下を使用できます。
$possible_parameters = \Drupal::routeMatch()->getParameters();