如何从URL获取节点ID?


47

到目前为止,我在Drupal 7中遇到了这三个函数,但是我不确定它们之间的区别是什么,哪个更适合在块预处理函数中获取节点ID。

你能给我任何见识吗?


您是在node.tpl.php还是类似的程序中执行此操作?如果是,则可以使用$ node-> nid。
巴特

不,我在块预处理功能中执行此操作,尽管该块确实会打印在节点页面上。
silkAdmin 2011年

Answers:


63

我不确定他们之间有什么区别

  • menu_get_object()返回与当前显示的页面关联的对象。如果在Drupal显示example.com/node/1页面时执行了代码,menu_get_object()则将返回ID为1的节点的节点对象;否则,返回ID为1的节点的节点对象。如果显示的页面是example.com/user/1,menu_get_object('user')则将返回ID为1的用户的用户对象。
  • menu_get_item()返回一个数组,其中包含“ menu_router”表中包含的每个字段的索引。这包括:
    • path:菜单回调的当前路径
    • load_functions:node_load要调用的函数名称数组(如),以加载与当前路径的一部分相对应的对象
    • access_callback:用于检查当前登录用户是否有权访问菜单项的回调
    • page_callback:呈现页面的函数的名称
    • title:与菜单项关联的页面的标题
  • drupal_lookup_path()是返回与作为参数传递的别名关联的内部路径的函数。如果“ homepage”是与example.com/node/1关联的别名,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']可征求意见预处理功能。



4

您必须注意的一件事是路径别名。

drupal_get_normal_path($path)

要获取当前路径,请使用系统变量 $_SERVER["REQUEST_URI"]

(如果在节点页面上,您可以调用$node->uri['path'],这将返回非别名路径。然后,如果再次在节点页面上,则可以使用$node->nid。)

这将返回节点/ XXXX

所以尝试像

  $node_path = explode('/', drupal_get_normal_path($path));
  $nid = $node_path[1];

3
arg(1);

这不是一个坏方法。arg()在内部路径上工作,因此不会受到路径别名的影响。


的确如此,它不会受到路径别名的影响。但是,如果您在node / XXXXX上,则可以只使用$ node-> nid。@French,您还将在其他地方使用arg(1)并返回您想要的内容吗?
iStryker

如果您处于模块挂钩中,则将无法访问节点。Views参数也可能是一个示例。
杰里米·法兰西

谢谢jeremy和istryker,我已经更新了我的问题,这个问题可能会更清楚。.尽管我将尝试两种解决方案,但是谢谢
silkAdmin 2011年

1
使用arg()是一个非常糟糕的主意,您将自己绑定到一个路径上,使用menu_get_object(这会自动换行,menu_get_item所以效果也一样)。

if (arg(0) == 'node' && is_numeric(arg(1)))然后arg(1)将近99%的用户返回节点ID。但是一个arg(1)也可以返回许多其他ID。
leymannx

2

在Drupal 8中,您可以根据路由中的内容获取url参数。

单独获取ID:

$nid = \Drupal::routeMatch()->getRawParameter('node');

如果计划加载节点对象,则可以通过以下方式简单地获取它:

$node = \Drupal::routeMatch()->getParameter('node');

要查找参数名称,可以使用:

$possible_parameters = \Drupal::routeMatch()->getParameters();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.