Drupal视图中公开过滤器的自定义逻辑

时间:2010-02-08 15:34:15

标签: drupal drupal-views

我正在Drupal网站上工作,并希望得到一些建议。目前,用户输入他的等级以获得许多不同的技能。它存储在CCK整数字段中,并作为包含键/值对的下拉窗口小部件向用户公开1 | Beginner,2 | Intermediate,3 | Advanced。

在视图中,我公开了每种技能的允许值,这些值作为复选框呈现给用户(使用Better Exposed Filters模块),然后列在可排序表中。在实践中,用户通常搜索“至少具有技能Y中的知识水平X”的人。是否有一个模块或简单的方法将允许值显示为下拉列表,并在查询中使用“大于”运算符而不是“其中一个”?

非常感谢有关如何动态更改过滤器逻辑或查询的WHERE子句的任何示例代码或建议。

2 个答案:

答案 0 :(得分:1)

你想使用hook_views_query_alter(),虽然我没有特别改变WHERE子句,但我改变了SORTBY子句,两者背后的想法应该相对相似。

这是一段快速的代码:

function my_module_views_query_alter(&$view, &$query) {
  switch ($view->name) {
    case 'view1':
      $args = _my_module_get_querystring();
      switch ($args['condition']) {
        case 'condition1':
          $query->where[0]['args'][0] = 1;
          break;

        case 'condition2':
          $query->where[0]['args'][0] = 2;
          break;
      }
      break;
  }
}

/**
 * Returns querystring as an array.
 */
function _my_module_get_querystring() {
  $string = drupal_query_string_encode($_REQUEST, array_merge(array('q'), array_keys($_COOKIE)));
  $args = explode('&', $string);
  foreach ($args as $id => $string) {
    unset($args[$id]);
    $string = explode('=', $string);
    $args[$string[0]] = str_replace(' ', '-', $string[1]);
  }
  return $args;
}

这个特殊的部分允许你使用查询字符串(?condition = condition1)来改变WHERE子句,但你可以改变它以获得你想要的参数。

希望这有帮助。

答案 1 :(得分:0)

使用Decipher的样本并花几个小时阅读和玩游戏,我得到了一个完全符合我需求的基本模块。再次感谢!

如果其他人遇到类似的需求,这是我的代码:

<?php
// $Id$
/**
* @file
* Module for modifying the views query to change an EQUALS 
* to a GREATER THAN for specific filters.
*/


function views_greater_than_views_query_alter(&$view, &$query) {

//only implement for views that have Search in their name
    if(strstr($view->name, "search")) {

        $whereclauses = $query->where[0]['clauses'];

        foreach ($whereclauses as $i=>$currentrow) {

            $currentrow = str_replace('= %d', '>= %d', $currentrow);    
            $query->where[0]['clauses'][$i] = $currentrow;
    }

    unset($whereclauses);
    }
}