到目前为止,我在Drupal 7中遇到了这三个函数,但是我不确定它们之间的区别是什么,哪个更适合在块预处理函数中获取节点ID。
你能给我任何见识吗?
到目前为止,我在Drupal 7中遇到了这三个函数,但是我不确定它们之间的区别是什么,哪个更适合在块预处理函数中获取节点ID。
你能给我任何见识吗?
Answers:
我不确定他们之间有什么区别
menu_get_object()
则将返回ID为1的节点的节点对象;否则,返回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.
}
在这些片段中,第二个更好,因为它为内部路径(例如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即可。
arg(1);
这不是一个坏方法。arg()在内部路径上工作,因此不会受到路径别名的影响。
if (arg(0) == 'node' && is_numeric(arg(1)))
然后arg(1)
将近99%的用户返回节点ID。但是一个arg(1)
也可以返回许多其他ID。