Drupal - 从视图中获取节点ID以自定义块中的链接

时间:2009-11-03 17:24:45

标签: drupal drupal-6 drupal-views

如何在Drupal中构建一个块,它能够显示块当前所在的视图页面的节点ID?

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

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

6 个答案:

答案 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)

有几种方法可以解决这个问题:

  1. 您可以使用视图创建块,并通过参数传递nid。

  2. 您可以使用以下代码访问$view对象,手动传入nid。这是$view->result的数组。视图中的每一行都是该数组中的一个对象,并且每个行中的nid都在该对象中。因此,您可以在其上运行foreach并轻松获取视图中所有行的所有内容。

  3. 第一个选项更容易,所以如果这符合您的需求,我会选择它。

答案 4 :(得分:1)

你应该考虑面板模块。这是一个非常大的模块,需要一些工作才能真正发挥它的潜力。所以请考虑到这一点。

您可以使用它来设置包含可放置在不同区域的多个视图/块的页面。它使用一种称为上下文的概念,它可以与您正在查看的内容相关。您可以使用该上下文来确定正在查看的节点,不仅可以更改块,还可以更改布局。由于您可以将PHP代码从管理界面移开,因此它也更加干净。

另一方面,它也是由观点作者撰写的。

答案 5 :(得分:0)

关于Drupal 7的新内容:获取节点id的正确方法是使用函数menu_get_object();

示例:

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

Drupal 8有另一种方法。看看这个:

arg() is deprecated