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

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

Аватар пользователя mixey mixey 2 августа 2007 в 1:22

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

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

example.com/test_page/200

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

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

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

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

Комментарии

Аватар пользователя kiev1 kiev1 2 августа 2007 в 15:11

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

Аватар пользователя mixey mixey 2 августа 2007 в 16:11

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

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

Аватар пользователя kiev1 kiev1 2 августа 2007 в 18:36

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

Аватар пользователя mixey mixey 3 августа 2007 в 0: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;

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

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

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 Piyavkin 3 августа 2007 в 3: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 mixey 3 августа 2007 в 23:59

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

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

Аватар пользователя Piyavkin Piyavkin 4 августа 2007 в 1:01

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

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

Аватар пользователя kiev1 kiev1 4 августа 2007 в 2:19

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