Drupal视图中公开过滤器的自定义逻辑
我在一个Drupal网站上工作,希望得到一些建议。目前,一个用户输入他的级别以获得许多不同的技能。它存储在一个CCK整数字段中,并作为一个下拉小部件向用户公开,其中包含键/值对1 |初学者、2 |中级、3 |高级 在一个视图中,我公开了每个技能的允许值,这些值作为复选框呈现给用户(使用更好的公开过滤器模块),然后在一个可排序的表中列出。在实践中,用户通常搜索“在技能Y方面至少具有X级知识”的人。是否有一个模块或直接的方法将允许的值显示为下拉列表,并在查询中使用“大于”运算符而不是“其中之一” 任何关于如何动态更改过滤逻辑或查询的WHERE子句的示例代码或建议都将不胜感激。您想要使用,虽然我没有特别更改WHERE子句,但我已经更改了SORTBY子句,两者背后的思想应该相对类似 下面是一段快速代码:Drupal视图中公开过滤器的自定义逻辑,drupal,drupal-views,Drupal,Drupal Views,我在一个Drupal网站上工作,希望得到一些建议。目前,一个用户输入他的级别以获得许多不同的技能。它存储在一个CCK整数字段中,并作为一个下拉小部件向用户公开,其中包含键/值对1 |初学者、2 |中级、3 |高级 在一个视图中,我公开了每个技能的允许值,这些值作为复选框呈现给用户(使用更好的公开过滤器模块),然后在一个可排序的表中列出。在实践中,用户通常搜索“在技能Y方面至少具有X级知识”的人。是否有一个模块或直接的方法将允许的值显示为下拉列表,并在查询中使用“大于”运算符而不是“其中之一” 任
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);
}
}
我想我的大脑刚刚爆炸了……但是谢谢你的代码示例!我想现在是时候阅读一下模块开发和视图挂钩了,以理解其中的一些内容的含义。有推荐的教程吗?我想我的大脑已经崩溃了…但是谢谢你的代码示例!我想现在是时候阅读一下模块开发和视图挂钩了,以理解其中的一些内容的含义。有推荐的教程吗?