我正在Drupal网站上工作,并希望得到一些建议。目前,用户输入他的等级以获得许多不同的技能。它存储在CCK整数字段中,并作为包含键/值对的下拉窗口小部件向用户公开1 | Beginner,2 | Intermediate,3 | Advanced。
在视图中,我公开了每种技能的允许值,这些值作为复选框呈现给用户(使用Better Exposed Filters模块),然后列在可排序表中。在实践中,用户通常搜索“至少具有技能Y中的知识水平X”的人。是否有一个模块或简单的方法将允许值显示为下拉列表,并在查询中使用“大于”运算符而不是“其中一个”?
非常感谢有关如何动态更改过滤器逻辑或查询的WHERE子句的任何示例代码或建议。
答案 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);
}
}