Views как сделать exposed filter интервалом?

Главные вкладки

Аватар пользователя Shaltay Shaltay 29 декабря 2008 в 0:11

Здравствуйте.

Проблема следующая. Есть ноды типа "Анкета". Через cck к ней привязано поле "Возраст" (Integer)

Мне нужно, чтобы через Exposed Filter можно было фильтровать ноды по признаку "Возраст от и до".

Сделать 2 фильтра "Возраст больше или равно" и "Возраст меньше или равно" - не проблема, однако, не получается добавить дважды фильтр в Exposed по одному и тому же полю.

Есть решение?

Комментарии

Аватар пользователя Shaltay Shaltay 29 декабря 2008 в 0:58

"Shagi" wrote:
А если сделать два поля?
"Возраст от"
"Возраст до"
?

Это, конечно, сработает, но представь анкету с полями:

"Фамилия"
"Имя"
"Отчество"
"Пол"
"Возраст от"
"Возраст до"

Smile

Аватар пользователя Shagi Shagi 29 декабря 2008 в 1:27

Хе-хе...
Но два одинаковых Exposed фильтра не пробовал вставлять.
У меня были анонсы. Похожая задача, но решил проблему просто модулем (Евент).

Аватар пользователя Shaltay Shaltay 29 декабря 2008 в 1:58

"<a href="mailto:ingumsky@drupal.org">ingumsky@drupal.org</a>" wrote:
А что Вам мешает выбрать «между» (between) вместо «больше или равно» и «меньше или равно»?

Собственно, отсутствие этого варианта и мешает.

У меня только такие:

Больше
Больше или равно
Равно
Не равно
Меньше или равно
Меньше

Аватар пользователя Shaltay Shaltay 29 декабря 2008 в 2:11

"<a href="mailto:ingumsky@drupal.org">ingumsky@drupal.org</a>" wrote:
Хм... У вас пятый Друпал (у меня шестой), а модуль Вьюс какой версии? У меня 2.2

1.6 естественно с пятеркой...

Аватар пользователя yasik yasik 29 декабря 2008 в 3:04

есть решения для пятерки добавляется фильтр «от» потом «до»
мне как-то патчили но где фиг его знает могу в личку сбросить свой вьевс модуль.
Зайди http://www.idgroup.in.ua/categories/6/2675 там цена от до площадь от до и т.д.

Аватар пользователя glu2006 glu2006 29 декабря 2008 в 11:06

Ничего патчить не надо. Надо в своем модуле зарегистрировать 2 таба для вьюсов и прописать к ним соответствующие хендлеры, если интересно вот кусок моего кода, правда вам придется его переписывать под свой модуль. у меня это был диапазон цен, который не сильно отличается от Вашей задачи.

function bli_views_tables() {
  $tables = array();
    $tables['content_type_product'] = array(
    'name' => 'content_type_product',
    'provider' => 'internal',
    'filters' => array(
      'price_from' => array(
        'name' => t('Price from: Prices search for Prod_info'),
        'operator' => 'views_handler_operator_gtlt',
        'handler' => '_bli_views_price_filter_handler',
      ),
      'price_to' => array(
        'name' => t('Price to: Prices search for Prod_info'),
        'operator' => 'views_handler_operator_gtlt',
        'handler' => '_bli_views_price_filter_handler_1',
      ),
    )
);
  return $tables;
}

function _bli_views_price_filter_handler_1($op, $filter, $filterinfo, &$query) {
  switch ($op) {
    case 'handler':
       if(is_numeric($filter['value'])){
         $query->add_table('content_type_product', false, 1, array('left' => array('table' => 'node', 'field' => 'vid'), 'right' => array('table' => 'content_type_product', 'field' => 'field_proditem_ref_nid')));
         $query->add_table('uc_products', false, 1, array('left' => array('table' => 'content_type_product', 'field' => 'nid'), 'right' => array('table' => 'uc_products', 'field' => 'nid')));
         $query->add_where("uc_products.sell_price {$filter['operator']} {$filter['value']}");
         $query->add_orderby('uc_products', 'sell_price', NULL);
       }
    break;
  }
}

function _bli_views_price_filter_handler($op, $filter, $filterinfo, &$query) {
   switch ($op) {
     case 'handler':
        $query->add_table('content_type_product', false, 1, array('left' => array('table' => 'node', 'field' => 'vid'), 'right' => array('table' => 'content_type_product', 'field' => 'field_proditem_ref_nid')));
        $query->add_table('uc_products', false, 1, array('left' => array('table' => 'content_type_product', 'field' => 'nid'), 'right' => array('table' => 'uc_products', 'field' => 'nid')));
        if(is_numeric($filter['value'])){
           $query->add_where("uc_products.sell_price {$filter['operator']} {$filter['value']}");
        }
        $query->add_orderby('uc_products', 'sell_price', NULL);
     break;
   }
}