使用hook_db_rewrite_sql()将查询暴露给其它模块

老葛的Drupal培训班 Think in Drupal

这个钩子可以用来修改Drupal中任何地方的查询,这样你就不用直接修改相关模块了。如果你将一个查询传递给db_query(),而且你相信其他人可能想修改它,那么你就需要把它包装到函数db_rewrite_sql()里面,这样其他的开发者就可以访问它了。当执行一个这样的查询时,它首先检查所有实现了hook_db_rewrite_sql()的模块,并给它们一个修改查询的机会。例如,节点模块修改了节点列表查询,从而将受节点访问规则保护的节点排除在外。
 
 
警告 如果你执行一个节点列表查询(例如,你直接对node表查询,来获取所有节点的一些子集),但是你没有使用db_rewrite_sql()来包装你的查询,那么节点访问规则将被忽略,这是由于节点模块无法修改你的查询,因此无法排除受保护的节点。
 
如果查询语句不是你的,但是你又想在你的模块中修改这一查询,那么你需要在你的模块中实现hook_db_rewrite_sql()。
 
    表5-3 使用SQL重写的两种方式的总结
 
5-3.使用db_rewrite_sql()函数VS使用hook_db_rewrite_sql()钩子
名称                           什么时候使用
db_rewrite_sql()                     当编写节点列表查询或者其它查询时,你想让别人能够对它进行修改它时
hook_db_rewrite_sql()       当你想修改其它模块中的查询时
 

Drupal版本: