2009-11-03 50 views
6

如何在Drupal中构建一个块,该块能够显示块当前坐在的视图页面的节点ID?Drupal - 从视图中获取节点ID来定制块中的链接

我正在使用视图来构建我的站点的一大块,但我需要能够在PHP模式下创建“智能”模块,这将根据视图显示的内容而具有动态内容。

如何找到视图当前正在显示的$ nid?

+0

我对这里的'view'是什么意思有点困惑 - 你的意思是来自views模块的意见吗?如果是这样,为什么他们只有一个节点ID? (大多数视图是节点的集合,但也许你有一个特殊的使用场景) – 2009-11-03 19:07:16

+0

Hiya - 你是对的 - 我使用views模块来查找节点,然后正确地格式化它们。所有关于这些视图的信息都与一个节点有关 - 我只需要获取该NID。 – MrFidge 2009-11-04 09:14:09

回答

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 
    } 
?> 

即使您的节点具有自定义路径w即path和/或pathauto模块。

仅供参考,如果你path模块上没有反过来,Drupal的生成默认的网址被称为文档中的“系统路径”。如果您打开path模块,您可以设置文档中称为“别名”的自定义路径。

由于我总是打开path模块,所以起初让我困惑的一件事是arg函数是否有可能返回部分别名而不是系统路径的一部分。

事实证明,arg函数将始终返回系统路径,因为the arg function is based on $_GET['q'] ...经过一番研究,似乎$_GET['q']将始终返回系统路径。

如果您想从实际的页面请求中获取路径,则需要使用$_REQUEST['q']。如果启用path模块,$_REQUEST['q']可能会返回别名或系统路径。

+2

在相关说明中,启用'path'模块将使您可以访问名为'drupal_lookup_path'的函数,您可以使用该函数从别名查找系统路径,反之亦然。有关更多信息,请参阅'drupal_lookup_path'文档: mparker17 2009-11-23 16:59:22

+1

此外,一旦您拥有节点ID,则可以使用node_load函数获取有关该节点: mparker17 2009-11-23 17:00:10

+1

根据您粘贴我的代码的上下文,return语句可能并不总是有意义的...如果你需要返回别的东西,你可能想用'$ displayed_node ='替换它们;但你需要获得NID的东西。 – mparker17 2009-11-23 17:14:38

1

有几种方法去这个问题:

  1. 您可以查看使您的块,并通过论证在通过NID。

  2. 您可以通过使用下面的代码访问$ view对象来手动传递nid。它是$ view-> result的数组。视图中的每一行都是该数组中的一个对象,并且每个对象都位于该对象中。所以你可以运行一个foreach,并且很容易地获得视图中所有行的所有nid。

第一个选项更容易,所以如果适合您的需求,我会去那。希望有所帮助!

+0

选项1并不完全工作,我害怕 - 它可以选择参数,但参数的格式不正确,我需要它 - 它使用别名而不是nodeID – MrFidge 2009-11-04 18:19:43

+0

您可以检查参数下的选项以如果没有参数存在,则从URL传入节点ID。或者您可以检查PHP代码选项并输入如下内容:$ url = explode('/',$ _ GET ['q']);返回$ url [1]; – theunraveler 2009-11-04 18:25:59

1

你应该考虑面板模块。这是一个非常大的模块,需要一些工作才能真正挖掘潜力。所以把它变成considderation。

您可以使用它来设置包含多个视图/块的页面,这些视图/块可以放在不同的区域。它使用了一种叫做上下文的概念,它可以是任何与你正在查看的内容有关的东西您可以使用该上下文来确定正在查看哪个节点,不仅可以更改块而且还可以更改布局。由于您可以将PHP代码从管理界面移开,因此它也更清晰一些。

在旁注中,它也由视图作者编写。

+0

我以前看过面板,没有真正了解它,也许这可能是时间^^ – MrFidge 2009-11-04 18:21:33

2

最后,这段代码完成了这项工作 - 它只是清除了干净的URL并报告了最后一个参数。

<?php 
    $refer= $_SERVER ['REQUEST_URI']; 
    $nid = explode("/", $refer); 
    $nid = $nid[3]; 
?> 

考虑到评论的回复,上面大概减少到这一点,使用Drupal的arg()函数来获取请求路径的一部分:

<?php 
    $nid = arg(3); 
?> 
+0

你应该看看arg()函数从drupal路径中提取参数 - 请参阅:http:// api.drupal.org/api/function/arg/6 – 2009-11-04 18:54:24

+0

Henrik - 多完美!做了一个梦。 – MrFidge 2009-11-06 14:32:47

+0

+1用于发布后续查找解决方案。 – 2009-11-06 15:27:34

0

这个话题是相当古老的我看到。仅仅用一些关于Drupal 7的新东西来刷新一点,获取节点ID的正确方法是使用函数menu_get_object();

examp:

$node = menu_get_object(); 
$contentType = node_type_get_name($node); 

的Drupal 8具有另一种方法。 检查了这一点

arg() is deprecated

希望它能帮助!

相关问题