BlueSnow,动物界-脊索动物门-脊椎动物亚门-哺乳动物纲-灵长目-类人猿亚目-狭鼻猴次目-人猿超科-人科-人属-智人种、雄性、昼伏夜出、喜独居、杂食,1996年至今一直作为程序员生活,恋过爱、失过恋、结了婚、有了儿子。

用好hook_views_query_alter,高度自定义view的筛选功能

BlueSnow 提交于 周五, 03/04/2016 - 15:27

欢迎转载,但请转载的朋友把我的名字留着,毕竟大家都是幸幸苦苦总结的。
函数api地址:https://api.drupal.org/api/views/views.api.php/function/hook_views_quer…
 该函数作用为:在view执行query之前对query进行复写

使用场景:近期工作项目需要,会用到根据用户角色来过滤一些内容。而 view的设置里面不是很方便,虽然可以用FILTER CRITERIA里面直接添加php来过滤,但是效果不理想,不能达到高度自定义,由此使用到了hook_views_query_alter来自定义条 件过滤内容(获取想要的内容)
过滤在我了解的有两种
1.在query里面可以加入一个table进行where查询
2.新的数据表和旧的数据表关联进行where条件查询

1.使用增加一个table用where过滤

?
1
2
$query->add_table('[表名]');
$query->add_where(0, '[表字段]', [和字段进行比较的值], '[操作符]');


说明: 
        1.表名:对query增加一个数据库中的表
        2.表字段:存在query中的所有字段都可以使用
        3.和字段进行比较的值:要和表字段进行比较的值,这里根据业务需求来赋值
        4.操作符:执行where条件用的操作符,比如like = < > in之类不再累述。

例如:我根据用户的当前所属医院过滤出只有该医院的值

?
1
2
3
$h_tid = ipumpkin_user_hospital_ref_tids($user);
      $query->add_table('field_data_field_hospital_ref');
      $query->add_where(0, 'field_hospital_ref_tid', $h_tid, 'in');

2.使用关联数据表进行内容过滤

 

?
1
2
3
4
$join = new views_join;
$join->construct('[添加关联的数据表]', '[被关联的数据表]', '[被关联的数据表的字段值]', '[添加关联的数据表的字段值]');
$query->add_relationship('[添加关联的数据表]', $join, '[被关联的数据表]');
$query->add_where(0, '[表字段]', [和字段进行比较的值], '[操作符]');

说明:        

1.实例化join        

2.设置它的construct。进行表和表之间的关联,和left join类似            

(将view中已存在的数据表和新添加的进行关联)        

3.调用$query的add_relationship方法,将它关联到$query中。        

4.和1中的add_where用法一致,不再说

 例子:利用left join和实体进行关联来查询。

?
1
2
3
4
5
$h_tid = ipumpkin_user_hospital_ref_tids($user);
    $join = new views_join;
    $join->construct('field_data_field_hospital_ref', 'eck_consumer_field_data_field_info_ref', 'id', 'entity_id');
    $query->add_relationship('field_data_field_hospital_ref', $join, 'eck_consumer_field_data_field_info_ref');     
    $query->add_where(0, 'field_data_field_hospital_ref.field_hospital_ref_tid', $h_tid, 'in');

以上就是我使用到的hook_views_query_alter。如果有什么专业术语的问题,欢迎纠正错误,如果还有一些其他用法也希望大家可以一起交流交流。