Vladimir_K

Пользовательский фильтр не ищет так как нужно.

Recommended Posts

2 минуты назад, Vladimir_K сказал:

Да вот как раз этим и занимаюсь.

В файле template_search.php просто при


if($params['seadist_id']  == 1 && isset

не ищет вообще. 

При


if($params['seadist_id'] != '' && isset

Ищет, но находит только те объявления в которых прямое совпадение. Т.е. если я задаю 500, то он находит только те, где явно указано 500. Те, что с 150, 200, 300 и т.д. туда не попадают. А нужно, грубо говоря, что бы всё, что ДО 500 + само 500 туда попадало.

В адресной:


Array ( [0] => re_data.seadist_id=500 ) Array ( [0] => re_data.seadist_id=500 )


 

Тогда вам нужно конвертировать в базе данных тип поля дистации до моря в числовой (int) например.

И использовать условия больше, меньше в sql 

http://www.mysql.ru/docs/man/Comparison_Operators.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
29 минут назад, rumantic сказал:

Тогда вам нужно конвертировать в базе данных тип поля дистации до моря в числовой (int) например.

Сделал вот так, правильно?

 

Clip2net_170703134308.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
30 минут назад, rumantic сказал:

И использовать условия больше, меньше в sql

А можно чуть конкретнее) Не понял, что нужно сделать. Это вот сюда - inc/db.inc.php что-то нужно внести?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 минут назад, Vladimir_K сказал:

А можно чуть конкретнее) Не понял, что нужно сделать. Это вот сюда - inc/db.inc.php что-то нужно внести?

В своем template_search.php  where_array формирует условия, и вот там вам нужно сделать больше или меньше условие или же вхождение в диапазон.

            $where_array[]=DB_PREFIX.'_data.sea_distance > '.$params['sea_distance'];

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
28 минут назад, rumantic сказал:

В своем template_search.php  where_array формирует условия, и вот там вам нужно сделать больше или меньше условие или же вхождение в диапазон.


            $where_array[]=DB_PREFIX.'_data.sea_distance > '.$params['sea_distance'];

В template_search.php написал вот так вот:

if(''!==$this->getRequestValue('seadist_id')){
        $params['seadist_id'] = (int)$this->getRequestValue('seadist_id');
     }

и так

if($params['seadist_id'] != '' && isset($data_model_array['seadist_id'])){
            $where_array[]=DB_PREFIX.'_data.seadist_id <= '.$params['seadist_id'];
     }

Ставлю в фильтре 200.

В адресной строке:

index.php?regionareas_id=0&region_id=&city_id=0&topic_id=0&animals_id=0&seadist_id=200&price=0

Сверху сайта:

Array ( [0] => re_data.seadist_id <= 200 ) Array ( [0] => re_data.seadist_id <= 200 )

А вот в выдаче фильтра фиг знает что, но только не то, что нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
6 минут назад, Vladimir_K сказал:

В template_search.php написал вот так вот:


if(''!==$this->getRequestValue('seadist_id')){
        $params['seadist_id'] = (int)$this->getRequestValue('seadist_id');
     }

и так


if($params['seadist_id'] != '' && isset($data_model_array['seadist_id'])){
            $where_array[]=DB_PREFIX.'_data.seadist_id <= '.$params['seadist_id'];
     }

Ставлю в фильтре 200.

В адресной строке:


index.php?regionareas_id=0&region_id=&city_id=0&topic_id=0&animals_id=0&seadist_id=200&price=0

Сверху сайта:


Array ( [0] => re_data.seadist_id <= 200 ) Array ( [0] => re_data.seadist_id <= 200 )

А вот в выдаче фильтра фиг знает что, но только не то, что нужно.

А в базе у вас есть объекты с дистанцией меньше или равно 200?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
6 минут назад, rumantic сказал:

А в базе у вас есть объекты с дистанцией меньше или равно 200?

Конечно. Как минимум - 150, 180, 200.

Дело в том, что если бы их не было, то тогда логично, что фильтр ничего не вернёт. Нету объявлений. А он объявления показывает, но много очень и непонятно по каким параметра отфильтрованные вообще.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
36 минут назад, Vladimir_K сказал:

Конечно. Как минимум - 150, 180, 200.

Дело в том, что если бы их не было, то тогда логично, что фильтр ничего не вернёт. Нету объявлений. А он объявления показывает, но много очень и непонятно по каким параметра отфильтрованные вообще.

Тогда открываем файл

\apps\system\lib\frontend\grid\grid_constructor.php

И в отладку writeLog выводим запрос из строчки 1203 - возможно не точное расположение

    	$query = 'SELECT '.implode(', ', $select_what).' '.$add_select_value.'
        		FROM '.DB_PREFIX.'_data'.(count($left_joins)>0 ? ' '.implode(' ', $left_joins).' ' : '').' '.$where_statement_prepared.'
        		ORDER BY '.$order.((isset($params['no_portions']) && $params['no_portions']==1) ? '' : ' LIMIT '.$start.', '.$limit);

Надо увидеть что в $query;

А также что в массиве

$where_value_prepared

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я извиняюсь за долгое молчание. Работы навалилось.

В 03.07.2017 в 15:18, rumantic сказал:

Тогда открываем файл

\apps\system\lib\frontend\grid\grid_constructor.php

И в отладку writeLog выводим запрос из строчки 1203 - возможно не точное расположение


    	$query = 'SELECT '.implode(', ', $select_what).' '.$add_select_value.'
        		FROM '.DB_PREFIX.'_data'.(count($left_joins)>0 ? ' '.implode(' ', $left_joins).' ' : '').' '.$where_statement_prepared.'
        		ORDER BY '.$order.((isset($params['no_portions']) && $params['no_portions']==1) ? '' : ' LIMIT '.$start.', '.$limit);

Надо увидеть что в $query;

А также что в массиве

$where_value_prepared

Как его правильно вставить в writeLog. Так?

$this->writeLog($query = 'SELECT '.implode(', ', $select_what).' '.$add_select_value.'
                FROM '.DB_PREFIX.'_data'.(count($left_joins)>0 ? ' '.implode(' ', $left_joins).' ' : '').' '.$where_statement_prepared.'
                ORDER BY '.$order.((isset($params['no_portions']) && $params['no_portions']==1) ? '' : ' LIMIT '.$start.', '.$limit));

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, Vladimir_K сказал:

Как его правильно вставить в writeLog. Так?

 

$this->writeLog($query);
$this->writeLog($where_value_prepared);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
19 часов назад, DimWeb сказал:

$this->writeLog($query);
$this->writeLog($where_value_prepared);

 

Вставил я этот код в файл template_search.php. В адресной строке запрос пошёл вот такой:

/index.php?regionareas_id=0&region_id=&city_id=0&topic_id=0&animals_id=0&seadist_id=300&price=0

Т.е. пытаемся отфильтровать всё то, что до 300 метров. В System logger ничего током не выводится. Скрин во вложении.

Clip2net_170714174259.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Vladimir_K сказал:

Вставил я этот код в файл template_search.php. В адресной строке запрос пошёл вот такой:


/index.php?regionareas_id=0&region_id=&city_id=0&topic_id=0&animals_id=0&seadist_id=300&price=0

Т.е. пытаемся отфильтровать всё то, что до 300 метров. В System logger ничего током не выводится. Скрин во вложении.

Clip2net_170714174259.png

Надо не в template_search.php ставить а сюда

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
21 минуту назад, rumantic сказал:

Надо не в template_search.php ставить а сюда

Как-то так:

SELECT re_currency.code AS currency_code, re_currency.name AS currency_name, ((re_data.price*re_currency.course)/1) AS price_ue, re_data.* FROM re_data LEFT JOIN re_currency ON re_data.currency_id=re_currency.currency_id WHERE (re_data.`active`=1) AND re_data.seadist_id <= 300 ORDER BY re_data.`date_added` DESC, re_data.id DESC LIMIT 0, 20
SELECT re_currency.code AS currency_code, re_currency.name AS currency_name, ((re_data.price*re_currency.course)/1) AS price_ue, re_data.* FROM re_data LEFT JOIN re_currency ON re_data.currency_id=re_currency.currency_id WHERE (re_data.hot=1) AND (re_data.`active`=1) ORDER BY rand() LIMIT 0, 20
SELECT re_currency.code AS currency_code, re_currency.name AS currency_name, ((re_data.price*re_currency.course)/1) AS price_ue, re_data.* FROM re_data LEFT JOIN re_currency ON re_data.currency_id=re_currency.currency_id WHERE (re_data.`active`=1) AND re_data.seadist_id <= 300 ORDER BY re_data.date_added desc LIMIT 0, 3
SELECT re_currency.code AS currency_code, re_currency.name AS currency_name, ((re_data.price*re_currency.course)/1) AS price_ue, re_data.* FROM re_data LEFT JOIN re_currency ON re_data.currency_id=re_currency.currency_id WHERE (re_data.`active`=1) ORDER BY re_data.`date_added` DESC, re_data.id DESC LIMIT 0, 20
SELECT re_currency.code AS currency_code, re_currency.name AS currency_name, ((re_data.price*re_currency.course)/1) AS price_ue, re_data.* FROM re_data LEFT JOIN re_currency ON re_data.currency_id=re_currency.currency_id WHERE (re_data.geo_lat IS NOT NULL AND re_data.geo_lng IS NOT NULL) AND (re_data.`active`=1) ORDER BY re_data.`date_added` DESC, re_data.id DESC
SELECT re_currency.code AS currency_code, re_currency.name AS currency_name, ((re_data.price*re_currency.course)/1) AS price_ue, re_data.* FROM re_data LEFT JOIN re_currency ON re_data.currency_id=re_currency.currency_id WHERE (re_data.hot=1) AND (re_data.`active`=1) ORDER BY rand() LIMIT 0, 20
SELECT re_currency.code AS currency_code, re_currency.name AS currency_name, ((re_data.price*re_currency.course)/1) AS price_ue, re_data.* FROM re_data LEFT JOIN re_currency ON re_data.currency_id=re_currency.currency_id WHERE (re_data.`active`=1) ORDER BY re_data.date_added desc LIMIT 0, 3

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Выполните вот этот запрос напрямую через phpmyadmin в базе

SELECT re_currency.code AS currency_code, re_currency.name AS currency_name, ((re_data.price*re_currency.course)/1) AS price_ue, re_data.* FROM re_data LEFT JOIN re_currency ON re_data.currency_id=re_currency.currency_id WHERE (re_data.`active`=1) AND re_data.seadist_id <= 300 ORDER BY re_data.`date_added` DESC, re_data.id DESC LIMIT 0, 20

Выдаст что-нибудь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
7 часов назад, rumantic сказал:

Выполните вот этот запрос напрямую через phpmyadmin в базе


SELECT re_currency.code AS currency_code, re_currency.name AS currency_name, ((re_data.price*re_currency.course)/1) AS price_ue, re_data.* FROM re_data LEFT JOIN re_currency ON re_data.currency_id=re_currency.currency_id WHERE (re_data.`active`=1) AND re_data.seadist_id <= 300 ORDER BY re_data.`date_added` DESC, re_data.id DESC LIMIT 0, 20

Выдаст что-нибудь?

Ну да запрос прошёл успешно:

Отображение строк 0 - 19 (20 всего, Запрос занял 0.0013 сек.) [date_added: 2017-06-20 15:38:20 - 2017-05-22 14:47:21] [id: 37 - 2]

Вернулись записи в БД. 20 штук. Но в этих 20 записях, в нашем seadist_id содержатся значения разные. Ну т.е. формально всё правильно. С нулями он тоже показывает. Нуль ведь попадает в условие <=300. Но это с точки зрения математики.  А с точки зрения логики - это объявления в которых не указано расстояние до моря. И они не должны попадать в выдачу.

Скрин с фрагментом прилагаю.

Clip2net_170717143926.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У меня в модели data в настройках seadist_id в "Значение по-умолчанию" стоит 0 (нуль). По логике для того, что бы исправить ситуацию его оттуда нужно либо убрать вовсе, либо заменить на что-то другое.

Так вот вопрос - что-то туда вписать, что бы корректно работало? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нужно чтобы тип колонки seadist_id  был int, сделайте int

У вас скорей всего varchar()

Кстати значение 0 хорошо подходит к условию меньше или равно 300.

Вписывайте по-умолчанию 1000 туда )

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
54 минуты назад, rumantic сказал:

Нужно чтобы тип колонки seadist_id  был int, сделайте int

У вас скорей всего varchar()

Да нет, всё по феншую настроено. Скрин вложил в конце.

 

54 минуты назад, rumantic сказал:

Кстати значение 0 хорошо подходит к условию меньше или равно 300.

Вот это не совсем понял.

 

54 минуты назад, rumantic сказал:

Вписывайте по-умолчанию 1000 туда )

Это не вариант. Есть ситуации, когда сдают домик на лето в соседнем с курортом посёлке, который может от моря находится 4, 5 и более км. Предугадать всё множество вариантов невозможно. Я имею ввиду граничное значение. Можно конечно вписать туда 1 000 000...

Но даже если  и так (т.е. вписать туда 1 000 000), то получаем другую проблему. Если условие поиска будет не <=300, а >=300, то эти объявления туду попадут, а не должны ибо в них не указано явно значение расстояния до моря.

Нужно другое решение.

Clip2net_170717190240.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
16 часов назад, rumantic сказал:

Ну тогда

дистация != 0 и дистанция <= 300

 

И как сие правильно отобразить в template_search.php?

if($params['seadist_id'] != '' && isset($data_model_array['seadist_id'])){
            $where_array[]=DB_PREFIX.'_data.seadist_id <= '.$params['seadist_id'];

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
34 минуты назад, rumantic сказал:

$where_array[]= ' ( '.DB_PREFIX.'_data.seadist_id <= '.$params['seadist_id'].' AND '.DB_PREFIX.'_data.seadist_id <> 0 )';

 

Да, оно. Заработало! Наконец-то!)

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас