Пользовательская логика для открытых фильтров в представлении Drupal - PullRequest
1 голос
/ 08 февраля 2010

Я работаю на сайте Drupal и хотел бы получить несколько советов по этому вопросу. В настоящее время пользователь вводит свой уровень для ряда различных навыков. Он хранится в целочисленном поле CCK и предоставляется пользователю в виде раскрывающегося виджета, содержащего пары ключ / значение 1 | Beginner, 2 | Intermediate, 3 | Advanced.

В представлении я выставляю разрешенные значения для каждого навыка, которые представляются пользователю в виде флажков (с помощью модуля «Улучшенные открытые фильтры») и затем отображаются в сортируемой таблице. На практике пользователи обычно ищут людей, которые имеют «по крайней мере уровень знаний X в навыке Y». Существует ли модуль или простой способ отображения разрешенных значений в виде раскрывающегося списка и использования в запросе оператора «больше чем» вместо «один из»?

Буду очень признателен за любой пример кода или советы о том, как динамически изменять логику фильтра или предложение WHERE запроса.

Ответы [ 2 ]

1 голос
/ 09 февраля 2010

Вы хотите использовать 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;
}

Этот конкретный фрагмент позволит вам изменить предложение WHERE, используя строку запроса (? Условие = условие1), но вы можете изменить его, чтобы получить аргументы по вашему желанию.

Надеюсь, это поможет.

0 голосов
/ 10 февраля 2010

Используя образец 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);
    }
}
...