如何在Drupal中构建一个块,它能够显示块当前所在的视图页面的节点ID?
我正在使用视图来构建我网站的一大块,但我需要能够在PHP模式下创建“智能”块,这将根据视图的显示内容生成动态内容。
如何找到当前显示视图的$ nid?
答案 0 :(得分:14)
以下是获取节点ID的更强大的方法:
<?php
// Check that the current URL is for a specific node:
if(arg(0) == 'node' && is_numeric(arg(1))) {
return arg(1); // Return the NID
}
else { // Whatever it is we're looking at, it's not a node
return NULL; // Return an invalid NID
}
?>
即使您的节点具有path
和/或pathauto
模块的自定义路径,此方法仍然有效。
仅供参考,如果不打开path
模块,Drupal生成的默认URL在文档中称为“系统路径”。如果您执行打开path
模块,则可以在文档中设置称为“别名”的自定义路径。
因为我总是打开path
模块,所以最初让我困惑的一件事是arg
函数是否有可能返回别名的一部分而不是系统路径的一部分。
事实证明,arg
函数将始终返回系统路径,因为the arg
function is based on $_GET['q']
...经过一些研究后,似乎$_GET['q']
将始终返回系统路径。
如果您想从实际页面请求中获取路径,则需要使用$_REQUEST['q']
。如果path
模块已启用,$_REQUEST['q']
可能会返回别名或系统路径。
答案 1 :(得分:7)
对于解决方案,尤其是涉及department/%/list
之类路径中的视图参数的解决方案,请参阅博客文章 Node ID as View Argument from SEO-friendly URL Path 。
答案 2 :(得分:2)
最后这个片段完成了这项工作 - 它只是删除了干净的URL并报告了最后一个论点。
<?php
$refer= $_SERVER ['REQUEST_URI'];
$nid = explode("/", $refer);
$nid = $nid[3];
?>
鉴于评论回复,上面的内容可能会减少到这一点,使用Drupal arg()
函数来获取请求路径的一部分:
<?php
$nid = arg(3);
?>
答案 3 :(得分:1)
有几种方法可以解决这个问题:
您可以使用视图创建块,并通过参数传递nid。
您可以使用以下代码访问$view
对象,手动传入nid。这是$view->result
的数组。视图中的每一行都是该数组中的一个对象,并且每个行中的nid都在该对象中。因此,您可以在其上运行foreach并轻松获取视图中所有行的所有内容。
第一个选项更容易,所以如果这符合您的需求,我会选择它。
答案 4 :(得分:1)
你应该考虑面板模块。这是一个非常大的模块,需要一些工作才能真正发挥它的潜力。所以请考虑到这一点。
您可以使用它来设置包含可放置在不同区域的多个视图/块的页面。它使用一种称为上下文的概念,它可以与您正在查看的内容相关。您可以使用该上下文来确定正在查看的节点,不仅可以更改块,还可以更改布局。由于您可以将PHP代码从管理界面移开,因此它也更加干净。
另一方面,它也是由观点作者撰写的。
答案 5 :(得分:0)
关于Drupal 7的新内容:获取节点id的正确方法是使用函数menu_get_object();
示例:
$node = menu_get_object();
$contentType = node_type_get_name($node);
Drupal 8有另一种方法。看看这个: