これまでのところ、Drupal 7でこれら3つの関数に出くわしましたが、それらの違いは何なのか、ブロック前処理関数でノードIDを取得するのにより適しているかどうかはわかりません。
何か洞察をいただけますか?
これまでのところ、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のtemplate_preprocess_pageでの方法:
theme.incの 2267行目以降:
if ($node = menu_get_object()) {
$variables['node'] = $node;
}
template_preprocess_pageはmenu_get_objectを使用します。その後は、ノードが定義されているかどうかを確認し、$ node-> nidを取得するだけです。
注意しなければならないことの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];
arg(1);
悪い方法ではありません。arg()は内部パスで機能するため、パスエイリアスの影響を受けません。
if (arg(0) == 'node' && is_numeric(arg(1)))
その後arg(1)
、ほぼ99%がノードIDを返します。しかし、それだけでarg(1)
多くの他のIDを返すこともできます。
Drupal 8では、ルーティングの内容に基づいてURL引数を取得できます。
IDのみを取得するには:
$nid = \Drupal::routeMatch()->getRawParameter('node');
ノードオブジェクトをロードする予定がある場合は、次の方法で簡単に取得できます。
$node = \Drupal::routeMatch()->getParameter('node');
パラメーター名を見つけるには、次を使用できます。
$possible_parameters = \Drupal::routeMatch()->getParameters();