如何在 Drupal 中构建一个能够显示该块当前所在的视图页面的节点 ID 的块?
我正在使用视图来构建我的网站的一大块,但我需要能够在 PHP 模式下制作“智能”块,这将根据视图显示的内容具有动态内容。
如何找到视图当前显示的 $nid?
如何在 Drupal 中构建一个能够显示该块当前所在的视图页面的节点 ID 的块?
我正在使用视图来构建我的网站的一大块,但我需要能够在 PHP 模式下制作“智能”块,这将根据视图显示的内容具有动态内容。
如何找到视图当前显示的 $nid?
这是获取节点 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
函数将始终返回系统路径,因为该arg
函数基于$_GET['q']
...经过一番研究,似乎$_GET['q']
总是返回系统路径。
如果要从实际页面请求中获取路径,则需要使用$_REQUEST['q']
. 如果path
启用了模块,$_REQUEST['q']
则可能返回别名或系统路径。
对于解决方案,尤其是在路径中涉及视图参数的解决方案,department/%/list
请参阅博客文章Node ID as View Argument from SEO-friendly URL Path。
有几种方法可以解决这个问题:
您可以使用 Views 制作您的块,并通过参数传递 nid。
$view
您可以通过使用下面的代码访问对象来手动传入 nid 。它是一个数组$view->result
。视图中的每一行都是该数组中的一个对象,每个对象的 nid 都在该对象中。因此,您可以对其运行 foreach 并轻松获取视图中所有行的所有 nid。
第一个选项要容易得多,所以如果这适合您的需要,我会选择它。
您应该考虑面板模块。这是一个非常大的模块,需要一些工作才能真正发挥它的潜力。所以考虑到这一点。
您可以使用它来设置包含多个视图/块的页面,这些视图/块可以放置在不同的区域。它使用一个称为上下文的概念,它可以是与您正在查看的内容相关的任何内容。您可以使用该上下文来确定正在查看哪个节点,不仅可以更改块,还可以更改布局。它也更干净一些,因为您可以将 PHP 代码从管理界面中移开。
在旁注中,它也是由意见作者撰写的。
Drupal 7 的新内容:获取节点 ID 的正确方法是使用函数 menu_get_object();
例子:
$node = menu_get_object();
$contentType = node_type_get_name($node);
Drupal 8 有另一种方法。看一下这个: