metrpro

Как добавить в поисковый запрос несколько городов

Recommended Posts

В 28.08.2017 в 12:04, abushyk сказал:

 

научить его. например в темплейт_сеарч у вас была обработка одного параметра.

Костя а этот код вы сами не проверяли ? Что то у нас все же есть сомнения что -что то не так работает и обрабатывает -поскольку по двум параметрам сразу не ищет

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


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

Вот сейчас проверил. Заказал в темплейт сеарч обработку параметра raz

if(NULL!==$this->getRequestValue('raz')){
			$v=$this->getRequestValue('raz');
			if(!is_array($v)){
				$v=(array)$v;
			}
			foreach($v as $k=>$_v){
				if(0==intval($_v)){
					unset($v[$k]);
				}
			}
			if(!empty($v)){
				$params['raz'] = $v;
			}
		}

Что бы он искал мне по странам

if(isset($params['raz'])){
	$where_array[]=DB_PREFIX.'_data.`country_id` IN ('.implode(',', $params['raz']).')';
}

В результате запрос на выборку ( /?raz[]=1&raz[]=2 ) имеет вид

SELECT re_currency.code AS currency_code, re_currency.name AS currency_name, ((re_data.price*re_currency.course)/0.015814) 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.`country_id` IN (1,2) ORDER BY re_data.`date_added` DESC, re_data.id DESC LIMIT 0, 12

Т.е. запрос корректен.

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


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

Вот сейчас проверил. Заказал в темплейт сеарч обработку параметра raz


if(NULL!==$this->getRequestValue('raz')){
			$v=$this->getRequestValue('raz');
			if(!is_array($v)){
				$v=(array)$v;
			}
			foreach($v as $k=>$_v){
				if(0==intval($_v)){
					unset($v[$k]);
				}
			}
			if(!empty($v)){
				$params['raz'] = $v;
			}
		}

Что бы он искал мне по странам


if(isset($params['raz'])){
	$where_array[]=DB_PREFIX.'_data.`country_id` IN ('.implode(',', $params['raz']).')';
}

В результате запрос на выборку ( /?raz[]=1&raz[]=2 ) имеет вид

SELECT re_currency.code AS currency_code, re_currency.name AS currency_name, ((re_data.price*re_currency.course)/0.015814) 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.`country_id` IN (1,2) ORDER BY re_data.`date_added` DESC, re_data.id DESC LIMIT 0, 12

Т.е. запрос корректен.

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

хм и обратили внимание у вас написано

$where_array[]=DB_PREFIX.'_data.`country_id` IN ('.implode(',', $params['raz']).')';

сначала country а потом raz
а у нас написано как вы рекомендовали в run
$where_array[]=DB_PREFIX.'_data.`material` IN ('.implode(',', $params['material']).')';
таким образом идет сначала material а потом опять  material

может надо гетпарамс написать переменную например mater а потом в run уже подставлять сначала material а потом только mater ?

 

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


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

может надо гетпарамс написать переменную например mater а потом в run уже подставлять сначала material а потом только mater ?

тут следует различать "параметр в запросе" (это то, что у вас ходит в строке запроса браузера и передается с формы - имя окошка для ввода на форме) и "поисковый параметр" - то, по чему в модели или таблице БД будет производиться поиск. Они могут быть одноименными, а могут и не быть.

Например я передаю в запросе country_id переменную, но это означает только то, что я передаю такую переменную. По какому значению в данных объекта будет производиться поиск на основании этой переменной не декларировано и будет определяться уже кодом. Если я передал переменную country_id то могу сделать поикс и по региону и по материалу дома. Имя переменной в запросе - это просто имя переменной в запросе. Иногда мне нужно искать по двум параметрам. Например я передаю ready_date и значение "2018-4", что обозначает что я хочу найти жк, которіе сдаются до 4 квартала 2018 года. Но я не могу реализовать поиск в лоб, так как у меня в БД у же есть признаки ready_year (год сдачи) и ready_quarter (квартал сдачи) и они отдельные. Так что переданная ОДНА переменная запроса в формировании выборки распадется на поиск по ДВУМ полям с именами не совпадающими с той, что в запросе.

Именно поэтому я передаю raz а ишу в country_id. Так как имена переменных - это условности.

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


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

тут следует различать "параметр в запросе" (это то, что у вас ходит в строке запроса браузера и передается с формы - имя окошка для ввода на форме) и "поисковый параметр" - то, по чему в модели или таблице БД будет производиться поиск. Они могут быть одноименными, а могут и не быть.

Например я передаю в запросе country_id переменную, но это означает только то, что я передаю такую переменную. По какому значению в данных объекта будет производиться поиск на основании этой переменной не декларировано и будет определяться уже кодом. Если я передал переменную country_id то могу сделать поикс и по региону и по материалу дома. Имя переменной в запросе - это просто имя переменной в запросе. Иногда мне нужно искать по двум параметрам. Например я передаю ready_date и значение "2018-4", что обозначает что я хочу найти жк, которіе сдаются до 4 квартала 2018 года. Но я не могу реализовать поиск в лоб, так как у меня в БД у же есть признаки ready_year (год сдачи) и ready_quarter (квартал сдачи) и они отдельные. Так что переданная ОДНА переменная запроса в формировании выборки распадется на поиск по ДВУМ полям с именами не совпадающими с той, что в запросе.

Именно поэтому я передаю raz а ишу в country_id. Так как имена переменных - это условности.

и как нам все же быть чтобы у нас по двум параметрам из селектбокса  одновременно искало ? :)  создавать отдельный тестовый сайт на тестовом периоде ? а если и там не будет работать ?
 

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


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

тут следует различать "параметр в запросе" (это то, что у вас ходит в строке запроса браузера и передается с формы - имя окошка для ввода на форме) и "поисковый параметр" - то, по чему в модели или таблице БД будет производиться поиск. Они могут быть одноименными, а могут и не быть.

Например я передаю в запросе country_id переменную, но это означает только то, что я передаю такую переменную. По какому значению в данных объекта будет производиться поиск на основании этой переменной не декларировано и будет определяться уже кодом. Если я передал переменную country_id то могу сделать поикс и по региону и по материалу дома. Имя переменной в запросе - это просто имя переменной в запросе. Иногда мне нужно искать по двум параметрам. Например я передаю ready_date и значение "2018-4", что обозначает что я хочу найти жк, которіе сдаются до 4 квартала 2018 года. Но я не могу реализовать поиск в лоб, так как у меня в БД у же есть признаки ready_year (год сдачи) и ready_quarter (квартал сдачи) и они отдельные. Так что переданная ОДНА переменная запроса в формировании выборки распадется на поиск по ДВУМ полям с именами не совпадающими с той, что в запросе.

Именно поэтому я передаю raz а ишу в country_id. Так как имена переменных - это условности.

если мы вас правильно поняли -то попробуем расшифровать как мы это поняли :)
предположим на сайте есть выбор квартир
1 параметр- квартиры в новостройках, квартиры вторичное жилье
2) квартира с евроремонтом, квартира с отличным ремонтом, квартира без ремонта совсем

получается например на главной мы даем пользователю выбрать какую квартиру он хочет выбрать он выбирает
квартира в новостройке с ремонтом. ок мы его поняли это будет на форме и на главной странице, 
но в базу данных мы передаем так:
база данных найди и выведи нам все объявления с параметрами
новостройка-и-евроремонт-и-отличный ремонт
создастся таблица в котором и будут наши искомые варианты :) поскольку туда  не войдут квартиры -совсем без ремонта

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


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

В запросе вы передаете переменную, которая является только лишь неким признаком, что она есть и имеет некое значение. Как понимать эту переменную, с чем в БД сравнивать ее значение - все это уже другая история, которая не связана с самим запросом. Это как номер вашего паспорта. Вроде ссылается на вас, но если завтра его у вас забрать и дать этот номер в паспорт другому человеку - то номер будет ссылаться уже не на вас.

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


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

получается например на главной мы даем пользователю выбрать какую квартиру он хочет выбрать он выбирает
квартира в новостройке с ремонтом. ок мы его поняли это будет на форме и на главной странице, 
но в базу данных мы передаем так:
база данных найди и выведи нам все объявления с параметрами
новостройка-и-евроремонт-и-отличный ремонт
создастся таблица в котором и будут наши искомые варианты :) поскольку туда  не войдут квартиры -совсем без ремонта

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

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


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

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

мы вроде как написали все так как вы указали и подсказали нам :) уже спасибо. Но что то все равно одновременно по двум параметрам не ищет. Или мы все же что то делаем не так?
если мы создаем просто ссылку вида  -даже без формы
sait.ru/index.php?&material=1&&material=2 то фактичечски сетка должна состоять только из 2 параметров сразу (в селекст бокс),
но почему то создается сетка только по последнему параметру и только по одному
 

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


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

Потому что вы передаете один параметр два раза вместо того, что бы передать массив значений под одним именем.

sait.ru/index.php?&material[]=1&&material[]=2

Красным отмечено лишнее, зеленым - недостающие квадратные скобки.

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


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

material=1 - в запросе будет matrial=1

material=1&material=2 - в запросе будет material=2 так как у всех переменных одно имя и последняя перезапишет все предыдущие с таким же именем

material[]=1&material[]=2 - в запросе будет material в виде массива, содержащего значения 1 и 2

material[]=1&material[]=2&material=3 - в запросе будет material=3 так как последняя переданная переменная успешно перезатрет весь предыдущий массив с 1 и 2

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


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

Потому что вы передаете один параметр два раза вместо того, что бы передать массив значений под одним именем.

sait.ru/index.php?&material[]=1&&material[]=2

Красным отмечено лишнее, зеленым - недостающие квадратные скобки.

пардон 2 подряд && это не ошибка это банальная опечатка на форуме так как не копипаст а писали вручную и не досмотрели, конечно же должна быть одна.
Но смотрите та строка которую вы написали с кавычками [] идет только в ручном написание, а мы скопировали эту строку формируемую через нажатие и выбор в форме и там нет кавычек - убрав город улицу и цену по которой формируется строка в браузере

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


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

material=1 - в запросе будет matrial=1

material=1&material=2 - в запросе будет material=2 так как у всех переменных одно имя и последняя перезапишет все предыдущие с таким же именем

material[]=1&material[]=2 - в запросе будет material в виде массива, содержащего значения 1 и 2

material[]=1&material[]=2&material=3 - в запросе будет material=3 так как последняя переданная переменная успешно перезатрет весь предыдущий массив с 1 и 2

о круто! добавились значения написав в ручную []  если в браузере вбить вручную
sait.ru/index.php?&material[]=1&material[]=2 то выходит сумма объявлений и это уже правильнее и то что мы желали .

Фактически получается нам надо формировать строку вручную для правильного выбора чтобы на сайте была например ссылка
Вам предлагаются "квартиры в новостройках с ремонтом"
при этом мылка вручную написанная у нас будет вида sait.ru/index.php?&material[]=1&material[]=2
в итоге в сетку попадут все новостройки с ремонтом :)
Если это так - то отлично Костя ! То что надо.
Будем писать вручную -так как через форму пока не требуется.
Сразу попутный вопрос, если все же эту строку тупо вписать в линк менеджер с кавычками []  то все будет ли правильно?

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


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

в линк менеджер с кавычками []  то все будет ли правильно?

да. он их должен нормально воспринимать.

14 минуты назад, doma сказал:

а мы скопировали эту строку формируемую через нажатие и выбор в форме и там нет кавычек

если у вас элемент выбора прописан вручную в шаблоне формы, то у него есть аттрибут name

<select name="bla">

так вот он должен быть

<select name="bla[]">

 

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


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

да. он их должен нормально воспринимать.

если у вас элемент выбора прописан вручную в шаблоне формы, то у него есть аттрибут name


<select name="bla">

так вот он должен быть


<select name="bla[]">

 

нет мы его поставили не так как вы написали а просто скопировали данное поле из другой формы которая например расположена справа,вроде как работает :)
если мы правильно понимаем ваш вариант более разумен потому что под  одним выбором например "с ремонтом" можно включить и 1 и 2 и 3 параметра, а в нашем случае в селект боксе будет только одно знчение которое определено в DATA,  по вашему селекту более правильный выбор и более грамотно наверное сделано-поскольку все меняется и может добавиться например параметр "ремонт только в зале " - заехал и живи в одной коммнате а в других доделывай ремонт.

В итоге в вашем более грамотном варианте можно выбрать "квартиры с ремонтом" и туда войдут
квартиры с евроремонтом
квартиры с хорошим ремонтом
квартиры с ремонтом в зале
ведь так ? мы правы ?

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


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

да. он их должен нормально воспринимать.

если у вас элемент выбора прописан вручную в шаблоне формы, то у него есть аттрибут name


<select name="bla">

так вот он должен быть


<select name="bla[]">

 

пришла еще идея -получается если так делать то можно вашим селектом заморочиться и сделать то что бывает акутально -например
1) объявления за сегодня
2)  объявления за 3 дня
3) объявления за последние 7 дней

не знаем на сколько востребовано -но зачастую встречается такое на сайте. наиболее актуально например для отлова осбственников сдающих квартиры на длительный срок -чтобы в первую очередь обзвонить только свежие объявления и не нарываться на "извините уже сдано"

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


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

пришла еще идея -получается если так делать то можно вашим селектом заморочиться и сделать то что бывает акутально -например
1) объявления за сегодня
2)  объявления за 3 дня
3) объявления за последние 7 дней

бессмысленно, так как в этом случае каждый следующий вариант УЖЕ включает каждый предыдущий. тут множественный выбор не нужен.

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


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

бессмысленно, так как в этом случае каждый следующий вариант УЖЕ включает каждый предыдущий. тут множественный выбор не нужен.

ок -намек поняли :)) не будем трогать noutime   и минусовать секунды.

Но тогда еще идея -получается таким образом можно объединить много улиц в 1 микрорайон ? :)
Например
1) в районе Канадский можно включить 5 улиц
2) в район Северный включить 3 улицы и так далее
и Потом написать строкой мол "Все квартиры в Северном районе" :)   верно?

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


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

и Потом написать строкой мол "Все квартиры в Северном районе" :)   верно?

Да. Сечас работает например как. Мы имеем город и район. Сам район привязан к какому-то городу. Но в объявке мы указываем и район и город. Потому для поиска по городу мы можем передать идешку города и фильтрануть по ней объекты. Но если бы у нас город фигурировал в объявке не отдельным полем, а опосредовано через принадлежность района и в объвке был бы указан только район, то для поиска по городу мы бы передавали поиск по идешкам ВСЕХ входящих в город районов. Просто этот способ более накладный и менее наглядный и потому мы держим и город в объявке. но "по уму" должно было бы быть именно так, как вы описали.

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


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

Да. Сечас работает например как. Мы имеем город и район. Сам район привязан к какому-то городу. Но в объявке мы указываем и район и город. Потому для поиска по городу мы можем передать идешку города и фильтрануть по ней объекты. Но если бы у нас город фигурировал в объявке не отдельным полем, а опосредовано через принадлежность района и в объвке был бы указан только район, то для поиска по городу мы бы передавали поиск по идешкам ВСЕХ входящих в город районов. Просто этот способ более накладный и менее наглядный и потому мы держим и город в объявке. но "по уму" должно было бы быть именно так, как вы описали.

мы не стали заморачиваться районами в городе так как писали когда то ранее на форумах что "район города" это такая БОЛЬЬЬЬШАЯ условность и как ее логично и правильно понять -до сих пор не понятно.
Улица может быть длинной или короткой и входить например в 2-3 района а может быть одна и та же улица по правую строну к одному району относиться, а с левой стороны к другому  -поэтому линкенд и депенденд не стали настраивать. думаем что наша логика правильная ?

А какие фишки для удобства пользователя еще бы порекомендовали -чтобы пользователям было бы удобно пользоваться сайтом ?

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


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

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

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

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

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

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

Войти

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

Войти сейчас