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

Drupal视图中公开过滤器的自定义逻辑,drupal,drupal-views,Drupal,Drupal Views,我在一个Drupal网站上工作,希望得到一些建议。目前,一个用户输入他的级别以获得许多不同的技能。它存储在一个CCK整数字段中,并作为一个下拉小部件向用户公开,其中包含键/值对1 |初学者、2 |中级、3 |高级 在一个视图中,我公开了每个技能的允许值,这些值作为复选框呈现给用户(使用更好的公开过滤器模块),然后在一个可排序的表中列出。在实践中,用户通常搜索“在技能Y方面至少具有X级知识”的人。是否有一个模块或直接的方法将允许的值显示为下拉列表,并在查询中使用“大于”运算符而不是“其中之一” 任

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

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

任何关于如何动态更改过滤逻辑或查询的WHERE子句的示例代码或建议都将不胜感激。

您想要使用,虽然我没有特别更改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;
}
这个特殊的部分允许您使用querystring(?condition=condition1)修改WHERE子句,但是您可以随意修改它以获得参数

希望这有帮助。

您想使用,虽然我没有特别修改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;
}
这个特殊的部分允许您使用querystring(?condition=condition1)修改WHERE子句,但是您可以随意修改它以获得参数


希望这能有所帮助。

使用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);
    }
}

使用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);
    }
}

我想我的大脑刚刚爆炸了……但是谢谢你的代码示例!我想现在是时候阅读一下模块开发和视图挂钩了,以理解其中的一些内容的含义。有推荐的教程吗?我想我的大脑已经崩溃了…但是谢谢你的代码示例!我想现在是时候阅读一下模块开发和视图挂钩了,以理解其中的一些内容的含义。有推荐的教程吗?