[Views] динамические фильтры

Прислано: mixey

ср, 01/08/2007 - 21:22

Другие статьи по теме:

Люди помогите пожалуйста,

Я в тупике, а все наверника просто..

example.com/test_page/200

Настроил page url: test_page

В argument handling code надо что-то написать, чтобы параметр 200 изменял свойства фильтра..

Как этого добиться? целый вечер мучаюсь.

пробовал сделать Export View и там где массив с фильтрами, ставил нужный кусочек в argument handling code, но тогда мне пишут что ошибка в SQL запросе.

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано mixey в чт, 02/08/2007 - 09:54.

кто-нибудь... отзовитесь :)

оооооочень нужна помощьб страшно горю!


Опубликовано kiev1 в чт, 02/08/2007 - 11:11.

не нужно фильтры менять динамически, пользуйтесь аргументами, при надобности сделайте несколько видов
а вообще - аргумент это и есть изменяемый фильтр - приходит при вызове вида переменная - и по ней уже вид делает фильтр, но сам фильтр менять динамически сложно, да и не нужно.


Опубликовано mixey в чт, 02/08/2007 - 12:11.

А каким образом сделать, чтобы можно было ноды отфильтровать по значению CCK поля price в пределах от 100 до 150 например?

как это настроить?


Опубликовано kiev1 в чт, 02/08/2007 - 14:36.

ну в вашем случае подойдет такое немного халтурное решение - http://drupal.ru/node/5960 - через viewsphpfilter, но это конечно халтура, хотя и будет работать, мне вот тоже интересно, а то получается такое простое действие - а решения нет.


Опубликовано mixey в чт, 02/08/2007 - 20:06.

Маленькими шажочками пришел к:

if ($args[0] && arg(1) == "asc") {
  drupal_set_message(arg(1));
  $view->sort[0]['vid'] = 7;
  $view->sort[0]['position'] = 0;
  $view->sort[0]['field'] = 'node_data_field_price.field_price_value';
  $view->sort[0]['sortorder'] = 'ASC';
  $view->sort[0]['options'] = '';
  $view->sort[0]['tablename'] = '';
  $view->sort[0]['id'] = 'node_data_field_price.field_price_value';
}
$view->is_cacheable = 0;
return $args;

Т.е. этот код делает сортировку...а вот с фильтрами никак :(

этот код почему-то не работает

if ($args[0]) {
  drupal_set_message(arg(1));
  $view->filter[0]['vid'] = 7;
  $view->filter[0]['tablename'] = '';
  $view->filter[0]['field'] = 'node_data_field_price.field_price_value';
  $view->filter[0]['value'] = '105';
  $view->filter[0]['operator'] = '>';
  $view->filter[0]['options'] = '';
  $view->filter[0]['position'] = 0;
  $view->filter[0]['id'] = 'node_data_field_price.field_price_value';
}
$view->is_cacheable = 0;
return $args;


Опубликовано Piyavkin в чт, 02/08/2007 - 23:56.

Ноды можно отфильтровывать, например, так:

1. Создать два фильтра для одного и того же поля:
field_price - Is Greater Than Or Equals - 0
field_price - Is Less Than Or Equals - 1000 000 000

2. Посмотреть индекс этих новосозданных фильтров в $view->filter. Для этого можно временно в Argument Handling Code разместить следующий скрипт:

ob_start(); // Start output buffering
print '<pre>';
print_r($view);
print '</pre>';
$view->page_footer .= ob_get_contents();
ob_end_clean(); // End buffering and discard
return $args;

Предположим, эти индексы 3 и 4 соответственно.

3. В Argument Handling Code написать:

$view->filter[3]['value'] = $args[0];
$view->filter[4]['value'] = $args[1];
$view->is_cacheable = 0;
return $args;

Это работает если view отображается как страница.
Не уверен, однако, что это самое элегантное решение. Возможно, было бы лучше задать фильтры и разрешить их изменение пользователем (exposed), однако у меня сея фича с двумя фильтрами для одного поля работала как-то неадекватно.

***

Код с фильтрами у Вас может не работать, если Вы позаимствовали значения переменных из чужого кода. В Вашем конкретном случае они могут отличаться. Загляните в переменную $view (см. п. 2) и сравните все ли сходится.

Надеюсь, что я по теме...


Опубликовано mixey в пт, 03/08/2007 - 19:59.

СПАСИБО!!!!!!!!! Огромное спасибо! У меня нет слов! Я воевал с этим трое суток!

Разрешите от Вашего имени на друпал.орг написать? там много людей, которые пытаются сделать тоже самое но не могут.
Это должно попасть в handbook :)


Опубликовано Piyavkin в пт, 03/08/2007 - 21:01.

Ну, слава богу, кто-то ответил!! А то я уже стал сомневаться в собственном существовании... : )

Рад, что решение оказалось полезным. С информацией можете поступать как пожелаете (моей заслуги тут, собственно, свежий, незамыленный взгляд со стороны на проблему).


Опубликовано kiev1 в пт, 03/08/2007 - 22:19.

какая элементарная задача, а столько сложностей, напишите конечно на друпал-орг про это безобразие что задокументированная функция не работает! пусть исправят.


Опубликовано mixey в пт, 03/08/2007 - 22:59.

Ок, в ближайшие дни напишу статейку в handbook с описанием и рншение проблемы.

Ещё раз спасибо


Опубликовано fairwind в вт, 07/08/2007 - 17:04.

там уже было что-то на эту тему.
http://drupal.org/node/70145#comment-204051


Опубликовано kiev1 в вт, 07/08/2007 - 20:42.

так в том-то и дело что то не работает


Ссылки партнёров