2

我创建了一个自定义导入和导出,目前作为外部脚本(通过引导程序),我计划稍后以更通用的方式创建一个模块。

我正在为 nagios 以及我们的主机管理和 nagios 配置构建一个前端。也许它可能对其他环境有用(网络管理)

现在我需要知道如何获取 x 类型的所有节点的列表?

我想避免直接使用 SQL。

我得到的一个建议是制作一个 rss 并解析它,但我访问 drupal 数据库十几次以提取各种节点,所以为一件事做一个 web 请求感觉很奇怪

所以我作为新手drupal开发者正在寻找的只是一个指向这个任务的基本搜索模块api的指针

TIA弗洛里安

4

5 回答 5

5

为什么要避免使用 SQL?

如果您想获取有关数据库中内容的信息,例如所有类型 x 的节点,那么获取它的唯一方法是通过 SQL 查询,除非您已经提取了数据。

像这样的查询

db_query("SELECT title, nid FROM {node} WHERE type = 'x';");

不应该是破坏你表现的东西。

编辑:
您提供的链接来自 Drupal 7,因此您必须小心阅读。原因是在 Drupal 7 中,它不仅可以使用db_query它基本上是 php 函数的包装器mysql_querypg_query. 它有点不同,使用它,您不必使用 db_specific 代码。无论如何,Drupal 7 中的新东西有点像 ORM。我没有详细阅读过它,但想法是您可以使用对象上的命令构建查询。这可能就是你所追求的。然而,Drupal 7 还没有为生产站点做好准备。仍然存在许多关键问题和安全问题。所以这在相当长的一段时间内是不可能的。

编辑2:
如果你想获得节点标题和正文,这就是你应该做的:

$type = 'x';
$query = db_query("SELECT r.nid, r.title, r.body FROM {node} AS n 
                  LEFT JOIN {node_revisions} AS r ON r.nid = n.nid
                  WHERE type = '%s';", array($type));
$nodes = array();
while ($node = db_fetch_object($query)) {
    $nodes[$node->nid] = $node;
}

如果要从数据库中提取数组而不是对象,则可以使用 db_fetch_array 而不是 db_fetch_object`。

于 2010-03-19T12:39:46.820 回答
2

这是一个很老的问题,但是对于现在遇到此页面的任何人来说,在 Drupal 7.x 中,最佳实践是使用动态查询。

因此,如果您想选择所有类型 x 的节点,您可以执行以下操作:

$articles = db_select('node')
->fields('node', array('nid', 'title'))
->condition('type', 'x', '=')
->execute()
->fetchAllKeyed();

$articles 变量应该是所有 x 类型节点的数组,以 nid 为键,数组对应的值设置为节点标题。希望能有所帮助。

于 2013-01-10T08:08:40.183 回答
1

视图通常是您创建数据库查询而不在 Drupal 中编写它们的方式,但是这个查询非常简单,我不确定它是否值得学习视图的开销,在您引导 Drupal 后仅 5 行:

$nodes = array();
$results = db_query("SELECT nid FROM {node} WHERE type = '%s'", $type);
while ($result = db_fetch_object($result)) {
  $nodes[] = node_load($result->nid);
}
于 2010-03-19T13:50:35.467 回答
0

必须使用 SQL 来做到这一点。

http://api.drupal.org/api/function/node_get_types/6

节点数 =

$node_types = node_get_types();

$type_count = array();

foreach ($node_types as $type) {
   $result = db_fetch_object(db_query('SELECT count(nid) AS node_count FROM {node} WHERE type = "%s"'), $type);
   $type_count[$type] = $result['count(nid)'];
}

print_r($type_count);

节点及其类型:

$node_types = node_get_types();

$nodes = array();

foreach ($node_types as $type) {
   $result = db_query('SELECT nid, title FROM {node} WHERE type = "%s"'), $type);

   while ($node = db_fetch_object($result)) {
      $nodes[] = array('Type' => $type, 'Title' => $node->title);
   }
}

print_r($nodes);

类似的东西。我正在吃午饭,所以我没有对此进行测试,但我之前已经这样做过,所以它应该可以工作。6.

于 2010-03-19T16:08:56.420 回答
0

您可能对迁移模块感兴趣。它还支持drush,因此您可以相当轻松地编写脚本。

于 2010-03-22T07:22:10.857 回答