2010-02-08 190 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); 
    } 
} 
相關問題