2010-02-08 140 views
1

我正在研究Drupal站点,并希望对此有所建议。目前,用户进入他的等级以获得许多不同的技能。它存储在CCK整数字段中,并以包含键/值对1 | Beginner,2 | Intermediate,3 | Advanced的下拉小部件的形式显示给用户。在Drupal视图中暴露过滤器的自定义逻辑

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

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

回答

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

这种特殊的一块将允许您使用查询字符串(?条件=条件1)改变WHERE子句,但你可以改变它得到的参数,但是你希望。

希望这会有所帮助。

+0

我想我的大脑只是爆炸......但感谢的代码示例!我想是时候做一些关于模块开发的东西了,然后查看挂钩来理解这些位的含义。任何推荐的教程? – Nicholai 2010-02-09 14:28:52

0

使用解码器的样本,花几个小时阅读和玩耍,我已经获得了一个基本模块,可以完美地满足我的需求。再次感谢!

这里是我的代码,如果任何人遇到了类似的需要:

<?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); 
    } 
} 
相关问题