代码之家  ›  专栏  ›  技术社区  ›  Nicholai

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

  •  1
  • Nicholai  · 技术社区  · 14 年前

    我在一个Drupal网站上工作,希望能得到一些建议。目前,一个用户进入他的水平为一些不同的技能。它存储在一个CCK整数字段中,作为一个下拉小部件向用户公开,其中包含键/值对1初学者、2中级、3高级。

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

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   Decipher    14 年前

    你想用 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),但是您可以更改它以获得您想要的参数。

    希望这有帮助。

        2
  •  0
  •   Nicholai    14 年前

    使用破译器的样本,花几个小时阅读和玩耍,我得到了一个基本的模块,非常适合我的需要。再次感谢!

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

    <?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);
        }
    }