You are here

Drupal专业开发指南 第20章 使用db_rewrite_sql()来保持私有数据的私有性

g089h515r806 的头像
Submitted by g089h515r806 on 星期四, 2009-08-27 13:12

老葛的Drupal培训班 Think in Drupal

在前面的列出节点这一例子,对于第3方模块来说是个常见的任务(现在的用的少一些了,这是由于使用views模块,可以很方便的通过web定义节点列表)。你可能会问:如果站点启用了节点访问控制模块,在前面的例子中哪段代码是用来保证我们的用户仅看到允许他们看到的节点集?这个问题问得很好,确实没有相应的代码。前面的代码将显示给定节点类型的所有节点,即便是节点访问模块限制访问的节点,也被显示了出来。这段代码非常傲慢,它没有考虑其它模块的感受!让我们修改一下代码。
    修改前:
 
$sql = "SELECT title FROM {node} WHERE type = '%s' AND status = 1";
$result = db_query($sql, $type);
 
    修改后:
 
$sql = "SELECT n.nid, title FROM {node} n WHERE type = '%s' AND status = 1";
$result = db_query(db_rewrite_sql($sql), $type); // Respect node access rules.
 
我们使用db_rewrite_sql()来对传递给db_query()的SQL参数进行了包装,函数db_rewrite_sql()允许其它模块修改SQL。传递给db_rewrite_sql()的查询语句,需要生命它们的主键(n.nid)和表的别名(n),所以我们在这里加了进来。核心模块中的一个重要例子就是节点模块,它改写针对node表的查询语句的。它首先检查node_access中是否存在可能限制用户访问节点的记录,然后向SQL中插入查询语句片段,用来检查这些权限。在我们的这种情况下,节点模块将修改SQL,它向WHERE语句中插入一个AND查询片段,从而过滤用户无权访问的节点。如何实现这一点,以及更多关于db_rewrite_sql()的信息,请参看第5章。
 

Drupal版本: