Тут столкнулся с проблемой, я делал выборку с помощью раскрытых фильтров в представлении, но тут нарвался на засаду - есть два поля (цены в рублях и долларах), в самой ноде заполняется одно из этих полей, при поиске надо сделать чтоб если я ввожу цену в рублях искало и ноды с ценой эквивалентную в доллорах. Это вообще возможно сделать, как условие или между этими фильтрами сделать?
Комментарии
При сохранении ноды второе поле с ценой заполнять автоматически.
создайте модуль, в нем hook_views_query_alter. Там можно проверить, какое условие задано для цен в рублях и добавить свое условие для цен в долларах.
Как раз недавно такое делал. Тут возникают вопросы с тем, достаточно трудно получить выбранную пользователем валюту, чтобы запросы вьюхи альтерить, потому что если включен друпаловский кэш, то на этом все и заканчивается )))
Проще оказалось действительно при сохранении ноды заполнять второе поле валютой по курсу, а при пользовательском выборе валюты для вьюхи с помощью js менять видимость полей ввода.
Но у первого метода есть недостаток - изменение курса доллара.
Если при сохранении ноды доллар стоил 33 рубля, а завтра утром он будет стоить 16 рублей - ваш фильтр не прохляет... Придётся ждать пока курс опять не вырастет до 33 рублей.
Ну, можно обновлять значение поля по крону каждые сутки )
Даже если у нас 300 тысяч товаров?))
Тогда действительно лучше альтерить вьюху. В самом альтере пересчитывать рубли в доллары и всё. Пусть хоть миллион товаров и курс скачет 10 раз в день.
Да цена должна быть на сайте одна, рекомендуется ее делать в $
и искать тоже в долларах.
Вот пример кода для крона должен лежать в папке Crons и вашем вебсервере настроить его запуск раз в сутки в 9 часов(обычно обновляют курс в и в в переменной currenciesArr[ru][course] будет содержатся актуальный курс, так как курс не обновляется в понедельник и воскресенье курс перезаписывается только когда доступен...
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);
}
}
}
Спасибо за советы, но условие такое, что цена может быть одна из двух и я его не могу менять. Суть вопроса можно ли сделать такой фильтр где две цены будут как мультиселект т.е. при поиске будет выбирать ноды с одной ценой в рублях И другие ноды в долларах, а не одну ноду в которой будут и рубли и доллары?
я сделал третье поле которое автаматом заполнялось в зависимости от того какая валюта а патом в поиске участвует, ну этого способа большой минус с курсами про который выше сказанно
Всё можно. У вас 2 переменные и 1 условие. Тут и правда всё можно сделать.