首页 / 帖子
如何在获得节点列表时全局添加一个条件?

在多站部署的时候,我在node 表中添加一个字段名为sites,作用是存储此文章是来自哪个网站。


问题是,现在如何在我的模块(zfm)中写一个方法,就是在调用数据的时候直接过滤只显示这个网站的数据。这里我不考虑用views模块添加条件的方法,我是想加一个全局的条件,实现内核级别的过滤?默认我在首页加载某个node type数据时,teaser 列表会显示所有文章,如上应该如何过滤?


实现后,在我调用views这种模块去创建列表数据或者首页列表的时候,就可以自动的加上这个条件。


我用过用zfm_ndoe_load(),但这个只能修改返回的节点内容,没有过滤的效果。


请问有没有什么思路?谢谢。

2个答案
王斌
发布于:2014-10-13 15:15

提供一个思路,D7通过hook_query_alter修改查询(D6应该是hook_db_rewrite_sql)

例子:

/**
 * Implements hook_query_alter().
 */
function zfm_query_alter(QueryAlterableInterface $query) {
  // 更改views查询node表条件
  if ($query->hasAllTags('node_access','views')) {
    $query->condition('node.nid', 360, '>');
  }
  // 更改node_load函数查询条件
  else if ($query->hasTag('node_load_multiple')) {
    $query->where('base.nid < :nid', array(':nid' => 50));
  }
  
  // 以下方法可以查询query具体情况 
  /* 
  $fields =& $query->getFields();
  $expressions =& $query->getExpressions();
  $tables =& $query->getTables();
  $order =& $query->getOrderBy();
  $where =& $query->conditions();
  $having =& $query->havingConditions();
   */
}

具体参考这篇文章 https://www.drupal.org/node/310077


需要注意的是这么改可能会出现bug,例如我测试的时候,就发现分页数不正确,另外node表的别名可能是node,n或者base,因此还需要多调试。

陈蹊
发布于:2014-10-13 16:05

万分感谢楼上的帮助,问题解决了。

至于分页的问题,也可以用zfm_query_alter这个钩子来修改。。

我查询到分页那个查询方法的tag是node_access,所以,照楼上你的方法,我仿照加了一么,果然,分页的问题解决了。。。

==============

另外,我不理解的地方是:

$query->hasTag('node_load_multiple')

这个依据是什么,是如何找到是node_load_multiple这个tag的?