我已经仔细研究了drupal.org上的这个旧线程,这只是使我的头旋转了一下。拉下路径并尝试从其中解析出NID?一定有更好的方法。
和类似的解决方案
global $node;
$nid = $node->nid;
不能在我的自定义模块中工作(尽管我被告知它们可以在模板中工作?)。没有错误或任何东西,它只是实例化$node
一个NULL
值。
感觉好像我确实缺少某些明显的东西。
因此,在遵循最佳实践并构建合理可靠的模块的同时,如何在没有模板的情况下获取当前节点的NID?
我已经仔细研究了drupal.org上的这个旧线程,这只是使我的头旋转了一下。拉下路径并尝试从其中解析出NID?一定有更好的方法。
和类似的解决方案
global $node;
$nid = $node->nid;
不能在我的自定义模块中工作(尽管我被告知它们可以在模板中工作?)。没有错误或任何东西,它只是实例化$node
一个NULL
值。
感觉好像我确实缺少某些明显的东西。
因此,在遵循最佳实践并构建合理可靠的模块的同时,如何在没有模板的情况下获取当前节点的NID?
Answers:
假设您的代码正在为节点页面运行,那么我在核心/贡献模块中最常用的方法就是使用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);
}
我个人更喜欢第一种方法(即使某些人认为条件分配不是一个好主意),但两者都是完全有效的。
node/1
,node/2
等等。如果仍然遇到问题,可能值得用您使用的确切代码发布另一个问题,并提供一些上下文信息。然后,我们也许可以查明问题出在哪里
$nid = ($node = menu_get_object()) ? $node->nid : NULL;
menu_get_object()
(或什至node_load()
)只是从静态缓存中获取它。即使您早点调用它,它也仍会在页面构建中稍后由核心模块加载(因为这是一个节点页面),在这种情况下,您只需为下一过程预热静态缓存
由于arg()不再起作用,因此在Drupal 8中最简单的方法是:
$path_args = explode('/', current_path());
print $path_args[1];
此链接对我有帮助:http : //www.webomelette.com/node-id-nid-url-path-alias-转到“内容”,然后向下过滤以查找要查看其节点ID并将其悬停在“编辑”上的内容链接。向下看,如果您单击“编辑”,浏览器将指示您将跟随超链接。
当前接受的答案中的第二种方法是D7中最干净的方法。第一个答案:
if ($node = menu_get_object()) {
// Get the nid
$nid = $node->nid;
}
仅在视觉上更清洁。实际上,menu_get_object()
正在调用很多代码,并可能导致无法预料的错误。我在hook_node_grants()
函数内部使用它,并遇到了PHP致命错误:
达到最大功能嵌套级别“ 256”,正在中止!
可以在/drupal//a/69232/9158中找到说明
您注意到的无限循环是由以下事实引起的,该事实
menu_get_object()
导致Drupal验证当前登录的用户是否有权访问该节点,这导致您的实现hook_node_grants()
再次被调用,该调用menu_get_object()
导致您的实现hook_node_grants()
再次被调用。 , 哪一个...
这是通过使用第二种方法解决的:
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');
D7中的另一种选择:
function _my_module_get_nid() {
$path_args = explode('/', current_path());
//$nid = $path_args[1];
if(is_int($path_args)) {
return($path_args[1]);
}
// Log that we failed to load a NID.
else {
watchdog('my_module', 'Unable to gather NID at: ' . current_path(), WATCHDOG_WARNING, NULL);
return FALSE;
}
}
如果您打算在模块外部使用该函数,请不要在函数名称的开头使用_。
<?php
if (isset($node->nid) && count($node->nid) > 0){
$mynodeid = $node->nid;
}
?>