metrpro

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

Recommended Posts

Стандартная форма запрос при обращении через форму поиска выглядит так:

http://www.САЙТ.ru/index.php?topic_id=0&city_id=22&price_min=0&price=2+300+000+000&square_min=&square_max=

Как сделать так, чтобы выводились объект нескольких городов - скажем, не только id-22 как в примере, но еще и id-21 и id-23

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


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

Вам нужно будет программно расширять запрос поиска и делать мультивыбор на соответствующие разделы, т.к. в самом запросе присутствует только один город.

P.S. Готового кода нет.

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


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

ОК. Другим путем - у каждого города есть параметр seaside типа boolean - т.е. прибрежность города.

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

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


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

видели на одном сайте прикольный выбор разных районнов одновременно-сделали даже скрыть все -показать все 
колитесь кто делал?

 

косте.png

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


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

АУ! Прикольно, пишешь разработчикам в личке - они отвечают "задавайте вопрос на форуме".

Задаешь на форуме - молчат...

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


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

Попробую объяснить. Это форум технической поддержки продукта. В кратких правилах форума написано, что всякого рода хотели пишутся в определенный раздел или могут долгое время ожидать ответа. Если вы официально приобрели продукт и у вас по той или иной причине в нем что-то не работает то вы можете написать об этом в личном кабинете www.sitebill.ru . Если вы хотите конкретно что-то доработать или переделать то вам мешать ни кто не будет - код продукта открыт! Либо вам нужно подождать пока вам ответят.

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


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

Попробую объяснить. Это форум технической поддержки продукта. В кратких правилах форума написано, что всякого рода хотели пишутся в определенный раздел или могут долгое время ожидать ответа. Если вы официально приобрели продукт и у вас по той или иной причине в нем что-то не работает то вы можете написать об этом в личном кабинете www.sitebill.ru . Если вы хотите конкретно что-то доработать или переделать то вам мешать ни кто не будет - код продукта открыт! Либо вам нужно подождать пока вам ответят.

Вы бы лучше по делу отвечали. А так - у меня да, лицензия, неограниченная.

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


Ссылка на сообщение
Поделиться на других сайтах
В 21.06.2016 в 06:55, metrpro сказал:

Как сделать так, чтобы выводились объект нескольких городов - скажем, не только id-22 как в примере, но еще и id-21 и id-23

Географические поля такие как country_id, region_id, city_id, district_id, street_id  и близкое им metro_id поддерживают обработку в двух вариантах - единичном и множественном. Т.е. допустимо передавать в запросе

city_id=N и тогда фильтрация будет по одному городу или

city_id[]=N1&city_id[]=N2 - в этом случае фильтрация по двум городам. Передадим массив - будет искать по группе локаций.

Это же справедливо и для всех вышеперечисленных полей.

Следует быть осторожным с разнородными запросами

city_id[]=N1&city_id[]=N2&region_id=R1 сделает не поиск по "в городе Н1 ИЛИ в городе Н2 ИЛИ в регионе Р1" как могло бы ожидаться, а поиск по "(в городе Н1 ИЛИ в городе Н2) И в регионе Р1", что скорее всего вернут пустой набор.

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


Ссылка на сообщение
Поделиться на других сайтах
В 26.06.2016 в 22:31, metrpro сказал:

ОК. Другим путем - у каждого города есть параметр seaside типа boolean - т.е. прибрежность города.

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

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

Допустим что вы хотите что бы при передаче в запросе любым способом переменной seaside cо значением 1 осуществлялся поиск по полю модели seaside и выбирались только объявки с его значением равным 1.

В случае с template_search в функции getParams вы делаете отлов переменной

if(0!=intval($this->getRequestValue('seaside'))){
	$params['seaside'] = 1;
}

а в run указываете способ обработки

if(isset($params['seaside']) && isset($data_model_array['seaside'])){
	$where_array[]=DB_PREFIX.'_data.seaside=1';
}

В случае локального grid_manager'а процедура аналогична, только перехват переменной производится в функции gatherRequestParams которую мы переопределяем в рамках шаблона в файле main.php

public function gatherRequestParams(){
	$params=parent::gatherRequestParams();
	if(0!=intval($this->getRequestValue('seaside'))){
		$params['seaside'] = 1;
	}
	return $params;
}

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

protected function prepareRequestParams($params, $premium=false){
	$qparams=parent::prepareRequestParams($params, $premium);
	if(isset($params['seaside'])){
		$qparams['where_array_prepared'][]='('.DB_PREFIX.'_data.seaside=1)';
	}
	return $qarams;
}

 

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


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

city_id[]=N1&city_id[]=N2 - в этом случае фильтрация по двум городам. Передадим массив - будет искать по группе локаций.

Костя, красавчик, как всегда - то, что надо!!!

Спасибо!

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


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

Географические поля такие как country_id, region_id, city_id, district_id, street_id  и близкое им metro_id поддерживают обработку в двух вариантах - единичном и множественном. Т.е. допустимо передавать в запросе

city_id=N и тогда фильтрация будет по одному городу или

city_id[]=N1&city_id[]=N2 - в этом случае фильтрация по двум городам. Передадим массив - будет искать по группе локаций.

Это же справедливо и для всех вышеперечисленных полей.

Следует быть осторожным с разнородными запросами

city_id[]=N1&city_id[]=N2&region_id=R1 сделает не поиск по "в городе Н1 ИЛИ в городе Н2 ИЛИ в регионе Р1" как могло бы ожидаться, а поиск по "(в городе Н1 ИЛИ в городе Н2) И в регионе Р1", что скорее всего вернут пустой набор.

Возник вопрос а как правильно передать запрос чтобы не грешить на редактор потом/ получается если нужно передать 2 города например или два параметра из селект бокс -например вид ремонта, где 

1 ремонт -без ремонта
2 ремонт -требует ремонта
в итоге писать для селект бокса кавычки типа [] или нет?
кавычки касаются только типов городов улиц регионов где тип поля селект бай квери? или же это тоже применимо к простым полям  селект-бокса?? 
нужно ли как то писать? 
и какой правильный будет запрос?
1) без кавычек типа  /?topic_id=2&city_id=2&remont=1&remont=2
2) с кавычками /?topic_id=2&city_id=2&remont=[]1&remont=[]2

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


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

все ждем ответа -  как в поисковый запрос  добавить 2, 3,4 параметра из DATA (в виде селект бокса) например вид ремонта и материал строения или другой угодный

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


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

кавычки касаются только типов городов улиц регионов где тип поля селект бай квери?

Кавычки, а точнее скобки, следует ставить в тех параметрах, которые передаются не в единственном числе. Если вы передаете параметр a одним значением, то передаете его a=5, а если нужно передать под одним именем набор значений тогда a[]=5&a[]=8&a[]=100.

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

В системе предусмотрена обработка отдельных параметров как в виде одного значения, так и в виде массива. Это география (города, страны...), ЖК и возможно еще что-то. Если у вас есть рукотворный селектбокс, то 99,9% что обработчик его не обраотает так, как вы ожидаете, так как он про него не знает.

В 15.08.2017 в 01:33, doma сказал:

1) без кавычек типа  /?topic_id=2&city_id=2&remont=1&remont=2

при такой записи действует правило "замена последним". так что на входе вы получите topic_id=2 И city_id=2 И remont=2

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


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

Кавычки, а точнее скобки, следует ставить в тех параметрах, которые передаются не в единственном числе. Если вы передаете параметр a одним значением, то передаете его a=5, а если нужно передать под одним именем набор значений тогда a[]=5&a[]=8&a[]=100.

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

В системе предусмотрена обработка отдельных параметров как в виде одного значения, так и в виде массива. Это география (города, страны...), ЖК и возможно еще что-то. Если у вас есть рукотворный селектбокс, то 99,9% что обработчик его не обраотает так, как вы ожидаете, так как он про него не знает.

при такой записи действует правило "замена последним". так что на входе вы получите topic_id=2 И city_id=2 И remont=2

как понять он про него не знает ?
если например параметр ремонт у нас прописан и отдельно по нему он ищет, а как вот сделать поиск по двум параметрам одновременно?
например 1)параметр-евроремонт 2) параметр-отличный ремонт
таким образом например можно сделать "виртуальный" поиск сразу по двум паарметрам  в итоге как бы получается поиск по "хорошему ремонту"
требуется поиск вроде  topic_id=2 И city_id=2 И remont=2 И remont=3

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


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

ак понять он про него не знает ?

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

 

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

как вот сделать поиск по двум параметрам одновременно?

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

в getParams

if(''!==$this->getRequestValue('имя_параметра')){
$params['имя_параметра'] = intval($this->getRequestValue('имя_параметра'));
}

станет

if(NULL!==$this->getRequestValue('имя_параметра')){
    $v=$this->getRequestValue('имя_параметра');
    if(!is_array($v)){
        $v=(array)$v;
    }
    foreach($v as $k=>$_v){
        if(0==intval($_v)){
            unset($v[$k]);
        }
    }
    if(!empty($v)){
		$params['имя_параметра'] = $v;
    }
}

т.е. получаем из запроса, чистим от значений которые не число большее нуля и отдаем далее.

 

А потом в run() обрабатіваем

if(isset($params['имя_параметра'])){
	$where_array[]=DB_PREFIX.'_data.`имя_параметра` IN ('.implode(',', $params['имя_параметра']).')';
}

 

Эот пример для переменных, передающих целые числа. Для других будет примерно та же логика с некоторыми изменениями при проверке и формировании запроса.

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


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

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

 

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

в getParams


if(''!==$this->getRequestValue('имя_параметра')){
$params['имя_параметра'] = intval($this->getRequestValue('имя_параметра'));
}

станет


if(NULL!==$this->getRequestValue('имя_параметра')){
    $v=$this->getRequestValue('имя_параметра');
    if(!is_array($v)){
        $v=(array)$v;
    }
    foreach($v as $k=>$_v){
        if(0==intval($_v)){
            unset($v[$k]);
        }
    }
    if(!empty($v)){
		$params['имя_параметра'] = $v;
    }
}

т.е. получаем из запроса, чистим от значений которые не число большее нуля и отдаем далее.

 

А потом в run() обрабатіваем


if(isset($params['имя_параметра'])){
	$where_array[]=DB_PREFIX.'_data.`имя_параметра` IN ('.implode(',', $params['имя_параметра']).')';
}

 

Эот пример для переменных, передающих целые числа. Для других будет примерно та же логика с некоторыми изменениями при проверке и формировании запроса.

маленькая поправочка -сейчас у нас написано
if(0!==(int)$this->getRequestValue('kolvokrovatei')){
$params['kolvokrovatei'] = (int)$this->getRequestValue('kolvokrovatei');
}

только вот вместо вашего if( ' ' ==(int)$this-     у нас  написано if(0!==(int)$this ничего страшного ? поскольку две как бы  '  а у нас стоит 0

получается мы должны писать так 
гетпарамс пишем 
 

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

 

а потом в run а именно в 

public function run(){
        $where_array=array();
        $params=$this->getParams();
        require_once(SITEBILL_DOCUMENT_ROOT.'/apps/system/lib/model/model.php');
        $data_model = new Data_Model();
        $data_model_array = $data_model->get_kvartira_model(false);
        $data_model_array = $data_model_array['data'];

 

пишем 

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

все ли правильно?

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


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

все ли правильно?

да. только в последней копипасте `имя_параметра` заменить на `kolvokrovatei` или как там колонка в таблице называется эта.

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


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

да. только в последней копипасте `имя_параметра` заменить на `kolvokrovatei` или как там колонка в таблице называется эта.

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

в итоге в 1 строке линкменеджера будут квартирки где есть1или2квартиры

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


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

маленькая поправочка -сейчас у нас написано
if(0!==(int)$this->getRequestValue('kolvokrovatei')){
$params['kolvokrovatei'] = (int)$this->getRequestValue('kolvokrovatei');
}

только вот вместо вашего if( ' ' ==(int)$this-     у нас  написано if(0!==(int)$this ничего страшного ? поскольку две как бы  '  а у нас стоит 0
 

а как с этим ? все ли будет в порядке? поскольку пустое значение и цифра 0 могут обрабатывать по разному -как все же правильно писать тогда?

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


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

как все же правильно писать тогда?

лучше так, как написал я.

 

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

можно ли потом сформированную  строку использовать в линк менеджере

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

 

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


Ссылка на сообщение
Поделиться на других сайтах
В 28.08.2017 в 12:04, abushyk сказал:

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

 

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

в getParams


if(''!==$this->getRequestValue('имя_параметра')){
$params['имя_параметра'] = intval($this->getRequestValue('имя_параметра'));
}

станет


if(NULL!==$this->getRequestValue('имя_параметра')){
    $v=$this->getRequestValue('имя_параметра');
    if(!is_array($v)){
        $v=(array)$v;
    }
    foreach($v as $k=>$_v){
        if(0==intval($_v)){
            unset($v[$k]);
        }
    }
    if(!empty($v)){
		$params['имя_параметра'] = $v;
    }
}

т.е. получаем из запроса, чистим от значений которые не число большее нуля и отдаем далее.

 

А потом в run() обрабатіваем


if(isset($params['имя_параметра'])){
	$where_array[]=DB_PREFIX.'_data.`имя_параметра` IN ('.implode(',', $params['имя_параметра']).')';
}

 

Эот пример для переменных, передающих целые числа. Для других будет примерно та же логика с некоторыми изменениями при проверке и формировании запроса.

попробовали поставить 2 параметра сразу но увы ничего не получилось  :(  вместо поиска и вывода сетки по 2-ум параматерам одновременно -выводит сетку лишь по последнему параметру в строке поиска

как быть и что не правильно?

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


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

попробовали поставить 2 параметра сразу но увы ничего не получилось  :(  вместо поиска и вывода сетки по 2-ум параматерам одновременно -выводит сетку лишь по последнему параметру в строке поиска

как быть и что не правильно?

Вероятно у вас нет нужного обновления для обработки нескольких параметров в поиске.

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


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

Вероятно у вас нет нужного обновления для обработки нескольких параметров в поиске.

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

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


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

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

Можете создать себе пробный сайт и попробовать эту функцию

https://www.sitebill.ru/arenda-cms-dlya-rieltorov

 

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


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

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

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

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

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

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

Войти

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

Войти сейчас