Проблема с фильтром в представлении

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

Аватар пользователя nexxxt nexxxt 7 ноября 2013 в 3:05

Тут столкнулся с проблемой, я делал выборку с помощью раскрытых фильтров в представлении, но тут нарвался на засаду - есть два поля (цены в рублях и долларах), в самой ноде заполняется одно из этих полей, при поиске надо сделать чтоб если я ввожу цену в рублях искало и ноды с ценой эквивалентную в доллорах. Это вообще возможно сделать, как условие или между этими фильтрами сделать?

Комментарии

Аватар пользователя serega111 serega111 7 ноября 2013 в 11:49

создайте модуль, в нем hook_views_query_alter. Там можно проверить, какое условие задано для цен в рублях и добавить свое условие для цен в долларах.

Аватар пользователя Koreychenko Koreychenko 7 ноября 2013 в 12:13

Как раз недавно такое делал. Тут возникают вопросы с тем, достаточно трудно получить выбранную пользователем валюту, чтобы запросы вьюхи альтерить, потому что если включен друпаловский кэш, то на этом все и заканчивается )))

Проще оказалось действительно при сохранении ноды заполнять второе поле валютой по курсу, а при пользовательском выборе валюты для вьюхи с помощью js менять видимость полей ввода.

Аватар пользователя Chyvakoff Chyvakoff 8 ноября 2013 в 9:21

Но у первого метода есть недостаток - изменение курса доллара.
Если при сохранении ноды доллар стоил 33 рубля, а завтра утром он будет стоить 16 рублей - ваш фильтр не прохляет... Придётся ждать пока курс опять не вырастет до 33 рублей.

Аватар пользователя Koreychenko Koreychenko 8 ноября 2013 в 14:54

"Chyvakoff" wrote:
Но у первого метода есть недостаток - изменение курса доллара.

Ну, можно обновлять значение поля по крону каждые сутки )

Аватар пользователя Chyvakoff Chyvakoff 8 ноября 2013 в 17:52

"Koreychenko" wrote:
Ну, можно обновлять значение поля по крону каждые сутки )

Даже если у нас 300 тысяч товаров?))

Тогда действительно лучше альтерить вьюху. В самом альтере пересчитывать рубли в доллары и всё. Пусть хоть миллион товаров и курс скачет 10 раз в день.

Аватар пользователя enemis enemis 8 ноября 2013 в 20:10

"Chyvakoff" wrote:
Тогда действительно лучше альтерить вьюху. В самом альтере пересчитывать рубли в доллары и всё. Пусть хоть миллион товаров и курс скачет 10 раз в день.

Да цена должна быть на сайте одна, рекомендуется ее делать в $
и искать тоже в долларах.

Вот пример кода для крона должен лежать в папке Crons и вашем вебсервере настроить его запуск раз в сутки в 9 часов(обычно обновляют курс в Dirol и в в переменной currenciesArr[ru][course] будет содержатся актуальный курс, так как курс не обновляется в понедельник и воскресенье курс перезаписывается только когда доступен...

chdir( dirname ( __FILE__ ) );
chdir('../');
include_once './includes/bootstrap.inc';
include_once 'exchange_rates.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

function curl_get_file_contents($URL) {
  $c = curl_init();
  curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($c, CURLOPT_URL, $URL);
  $contents = curl_exec($c);
  curl_close($c);

  if ($contents) return $contents;
        else return FALSE;
}

// Current date
$curDate = date('d-m-Y', time() + 60 * 60 * 24);
list($day, $month, $year) = explode('-', $curDate);
$content = curl_get_file_contents("http://www.cbr.ru/currency_base/daily.aspx?C_month=$month&C_year=$year&date_req=$day%2F$month%2F$year");

// Centrobank RF
if (preg_match("|>840<.*(\d{2,}),*(\d*)</td></tr>|siU", $content, $pock)) {
  // If course was found - update database with new course
  if ((int) $pock[1]) {
    $course = $pock[1];
    if ($pock[2] > 0) {
      $course = $pock[1] . '.' . $pock['2'];
    }
    $currenciesArr = variable_get("currenciesArr", array());

    if ($currenciesArr['ru'] != $course) {
      // Save new course and invalidate cache if any
      $currenciesArr['ru']['course'] = $course;
      $currenciesArr['ru']['suffix'] = 'руб.';
      variable_set("currenciesArr", $currenciesArr);
    }
  }
}

Аватар пользователя nexxxt nexxxt 9 ноября 2013 в 1:19

Спасибо за советы, но условие такое, что цена может быть одна из двух и я его не могу менять. Суть вопроса можно ли сделать такой фильтр где две цены будут как мультиселект т.е. при поиске будет выбирать ноды с одной ценой в рублях И другие ноды в долларах, а не одну ноду в которой будут и рубли и доллары?
я сделал третье поле которое автаматом заполнялось в зависимости от того какая валюта а патом в поиске участвует, ну этого способа большой минус с курсами про который выше сказанно

Аватар пользователя Chyvakoff Chyvakoff 10 ноября 2013 в 10:24

"nexxxt" wrote:
можно ли сделать такой фильтр

Всё можно. У вас 2 переменные и 1 условие. Тут и правда всё можно сделать.