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

问题描述 投票:0回答:2

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

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

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

php drupal drupal-views
2个回答
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 子句,但您可以更改它以获取您希望的参数。

希望这有帮助。


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);
    }
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.