Drupal 7 开发内部培训资料, 分头诗人

如何基于字段来过滤views的输出

赞成!
0
否决!

例如:我创建了一个内容类型为'foo'的views列表,foo有个自定义字段'start_date'并且不是必填项。

我要实现:当一个foo的节点没有填写start_date的时候就一直在views列表中显示如果填写了start_date并且值小于当前时间的话,就在views列表中显示,否则就不显示出来。

我找到了views的hooks(https://api.drupal.org/api/views/views.api.php/group/views_hooks/7),也尝试使用过hook_views_query_alter但发现这个hook是用于更改views的sql查询的,无法满足需求。因为在此阶段并不知道哪些节点有填写start_date字段,所以可能需要在创建views对象的时候对数据进行过滤修改,但不知道用哪个hook可以实现。

在views ui界面的filter配置可以进行过滤,但是当节点start_date为空的时候就不会显示该节点了,这并不是我想要的。

请问有人实现过类似的需求或有什么建议~~ 谢谢!

2 个回答

赞成!
0
否决!

最简单的方法就是用views PHP模块,在views里添加start_date字段和title字段,排除显示,放一个views PHP字段在它俩后面,输出里加一下判断条件就OK了。

 

赞成!
0
否决!

已经解决,后来需求变更了下:还需要过滤效果只对某个角色的用户起作用。

我使用hook_query_alter()钩子添加了一个tag

在views的高级设置里面的query setting里面将tag填写进去就可以了。这个tag可以复用在很多地方包括db_select()语句

示例代码:

if($query->hasTag('custom_filter')) {
  if(in_array('custom_role', $GLOBALS['user']->roles) || in_array('administrator', $GLOBALS['user']->roles)) {
    $query->leftJoin('field_data_field_valid_start_date', 'fdfvsd', 'fdfvsd.entity_id = node.nid');
    $query->leftJoin('field_data_field_valid_end_date', 'fdfved', 'fdfved.entity_id = node.nid');
    $start_date_or = db_or();
    $start_date_or->condition('fdfvsd.field_valid_start_date_value', NULL, 'IS');
    $start_date_or->condition('fdfvsd.field_valid_start_date_value', time(), '<=');
    $end_date_or = db_or();
    $end_date_or->condition('fdfved.field_valid_end_date_value', NULL, 'IS');
    $end_date_and = db_and();
    $end_date_and->condition('fdfvsd.field_valid_start_date_value', time(), '<=');
    $end_date_and->condition('fdfved.field_valid_end_date_value', strtotime("00:00:00"), '>=');
    $end_date_or->condition($end_date_and);
    $query->condition($start_date_or);
    $query->condition($end_date_or);
  }
}