Moses

Поиск через чекбоксы из обычного поля safe_string

Recommended Posts

При добавлении объекта http://realia.sitebill.ru/add/в характеристиках объекта есть поле "Количество комнат" это поле сделано обычной строкой  (safe_string)
А в поиске на сайте http://realia.sitebill.ru/сделан выбор чек боксами
Как такое сделать?

Можно подробную инструкцию на примере поля "Количество комнат"!!!!

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


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

Я вам с скайпе ответил, что точно так же как и в другом шаблоне. Пример можете посмотреть в дефолтном шаблоне агенси.

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


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

Чекбоксы в шаблоне

                <div class="controls">					{if isset($smarty.request.room_count) && is_array($smarty.request.room_count)}					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="1"{if in_array(1,$smarty.request.room_count)} checked="checked"{/if} /> <label class="ch">1</label></div> 					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="2"{if in_array(2,$smarty.request.room_count)} checked="checked"{/if} /> <label class="ch">2</label></div> 					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="3"{if in_array(3,$smarty.request.room_count)} checked="checked"{/if} /> <label class="ch">3</label></div>  					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="4"{if in_array(4,$smarty.request.room_count)} checked="checked"{/if} /> <label class="ch">4+</label> </div> 					{else if isset($smarty.request.room_count)}					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="1"{if $smarty.request.room_count==1} checked="checked"{/if} /> <label class="ch">1</label></div>  					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="2"{if $smarty.request.room_count==2} checked="checked"{/if} /> <label class="ch">2</label></div>  					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="3"{if $smarty.request.room_count==3} checked="checked"{/if} /> <label class="ch">3</label></div>  					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="4"{if $smarty.request.room_count>3} checked="checked"{/if} /> <label class="ch">4+</label></div>  					{else}					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="1" /> <label class="ch">1</label></div>  					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="2" /> <label class="ch">2</label></div>  					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="3" /> <label class="ch">3</label></div>  					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="4" /> <label class="ch">4+</label></div>  					{/if}								</div>

Обработка в коде

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

    	if(isset($params['room_count'])){    		if(is_array($params['room_count']) && count($params['room_count'])>0){    			$sub_where=array();    			$where_array_prepared_sub=array();    			foreach($params['room_count'] as $rq){    				if($rq==4){    					$sub_where[]='room_count>3';    					$where_array_prepared_sub[]='('.DB_PREFIX.'_data.room_count>3)';    				}elseif(0!=(int)$rq){    					$sub_where[]='room_count='.(int)$rq;    					$where_array_prepared_sub[]='('.DB_PREFIX.'_data.room_count=?)';    					$where_value_prepared[]=(int)$rq;    				}    			}    			if(count($sub_where)>0){    				$where_array[]='('.implode(' OR ', $sub_where).')';    				$where_array_prepared[]='('.implode(' OR ', $where_array_prepared_sub).')';    			}    		}elseif((int)$params['room_count']!=0){    			$where_array[] = 're_data.room_count = '.(int)$params['room_count'];    			$where_value_prepared[]=(int)$params['room_count'];    			$where_array_prepared[]='('.DB_PREFIX.'_data.room_count=?)';    		}else{    			unset($params['room_count']);    		}    	}

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


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

Дмитрий, а первый кусок кода - чекбоксы в шаблоне, это в каком файле должно быть? (Шаблон Realia)

И правильно-ли я понимаю, что это поправит поиск с сайта по позиции 4+ (количество комнат больше 3-х)?

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


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

тут /template/frontend/realia/standart_search_form.tpl

это кусок кода для определения количества комнат, там можете исправить на свой.

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


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

Теперь вопрос сопутствующий но только не с количеством комнат, а с другой переменной.

Есть у меня переменная "Спальные места" (sleeper), тоже сделанно через поле safe_string

я хочу добавить эту переменную в поиск так же как и "Количество комнат".

У меня получился вот такой код:
 

{if isset($smarty.request.sleeper) && is_array($smarty.request.sleeper)}				<input type="checkbox" name="sleeper[]" id="sleeper-1" class="css-checkbox" value="1"{if in_array(1,$smarty.request.sleeper)} checked="checked"{/if} />				<label class="css-label" for="sleeper-1"><span>1</span></label> 				<input type="checkbox" name="sleeper[]" id="sleeper-2" class="css-checkbox" value="2"{if in_array(2,$smarty.request.sleeper)} checked="checked"{/if} />				<label class="css-label" for="sleeper-2"><span>2</span></label>				<input type="checkbox" name="sleeper[]" id="sleeper-3" class="css-checkbox" value="3"{if in_array(3,$smarty.request.sleeper)} checked="checked"{/if} />				<label class="css-label" for="sleeper-3"><span>3</span></label> 				<input type="checkbox" name="sleeper[]" id="sleeper-4" class="css-checkbox" value="4"{if in_array(4,$smarty.request.sleeper)} checked="checked"{/if} />				<label class="css-label" for="sleeper-4"><span>4+</span></label>				 				{else if isset($smarty.request.sleeper)}				<input type="checkbox" name="sleeper[]" id="sleeper-1" class="css-checkbox" value="1"{if $smarty.request.sleeper==1} checked="checked"{/if} />				<label class="css-label" for="sleeper-1"><span>1</span></label> 				<input type="checkbox" name="sleeper[]" id="sleeper-2" class="css-checkbox" value="2"{if $smarty.request.sleeper==2} checked="checked"{/if} />				<label class="css-label" for="sleeper-2"><span>2</span></label>				<input type="checkbox" name="sleeper[]" id="sleeper-3" class="css-checkbox" value="3"{if $smarty.request.sleeper==3} checked="checked"{/if} />				<label class="css-label" for="sleeper-3"><span>3</span></label>				<input type="checkbox" name="sleeper[]" id="sleeper-4" class="css-checkbox" value="4"{if $smarty.request.sleeper>3} checked="checked"{/if} />				<label class="css-label" for="sleeper-4"><span>4+</span></label>								{else}				<input type="checkbox" name="sleeper[]" id="sleeper-1" class="css-checkbox" value="1" />				<label class="css-label" for="sleeper-1"><span>1</span></label>				<input type="checkbox" name="sleeper[]" id="sleeper-2" class="css-checkbox" value="2" />				<label class="css-label" for="sleeper-2"><span>2</span></label>				<input type="checkbox" name="sleeper[]" id="sleeper-3" class="css-checkbox" value="3" />				<label class="css-label" for="sleeper-3"><span>3</span></label> 				<input type="checkbox" name="sleeper[]" id="sleeper-4" class="css-checkbox" value="4" />				<label class="css-label" for="sleeper-4"><span>4+</span></label>											{/if}

Но поиск не работает по этим параметрам. Я так понимаю что нужно что то где то прописать?!

Прошу помощи у профессионалов!

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


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

Сотрите, я тут писал про реализацию своих условий поиска http://www.etown.ru/s/topic/241-добавить-новые-поля-в-поиск-template-search-и-др/?p=6145 Если совсем все будет не понятно, тогда спросите, расскажу подробнее.

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


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

Я такое проделывал с чекбоксами и селектбоксами (gilyug.ru), но тут ситуация немного другая. Тут нужно из safe_string сделать выборку чекбоксами.
Можете сделать пример на основе моего кода?

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


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

Принцип аналогичен. Только сравнение нужно проводить не просто на равенство единице или значению, а вариантивно
 
1. в getParams 

if(NULL!==$this->getRequestValue('sleeper')){$sleeper=$this->getRequestValue('sleeper');if(!is_array($sleeper)){$sleeper=(array)$sleeper;}$sleeper=array_filter($sleeper, function($it){if(intval($it)>0 && intval($it)<=4){return true;}else{return false;}});if(count($sleeper)>0){$params['sleeper'] = $sleeper;}}

2. в run()

if(isset($params['sleeper']) && isset($data_model_array['sleeper'])){$where_parts=array();foreach($params['sleeper'] as $v){if($v>3){$where_parts[]=DB_PREFIX.'_data.sleeper*1>=4';}else{$where_parts[]=DB_PREFIX.'_data.sleeper*1='.intval($v);}}$where_array[]='('.implode(' OR ', $where_parts).')';}

Т.е. взяли параметры из запроса. Выкинули ненужные. Если что-то осталось, то настраиваем набор условий. Так как в поиске у нас набор чекбоксов, то искать нужно по всем их значениям чрез ИЛИ - или 1 спальня ИЛИ 4 и больше.

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


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

Чекбоксы в шаблоне


                <div class="controls">					{if isset($smarty.request.room_count) && is_array($smarty.request.room_count)}					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="1"{if in_array(1,$smarty.request.room_count)} checked="checked"{/if} /> <label class="ch">1</label></div> 					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="2"{if in_array(2,$smarty.request.room_count)} checked="checked"{/if} /> <label class="ch">2</label></div> 					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="3"{if in_array(3,$smarty.request.room_count)} checked="checked"{/if} /> <label class="ch">3</label></div>  					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="4"{if in_array(4,$smarty.request.room_count)} checked="checked"{/if} /> <label class="ch">4+</label> </div> 					{else if isset($smarty.request.room_count)}					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="1"{if $smarty.request.room_count==1} checked="checked"{/if} /> <label class="ch">1</label></div>  					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="2"{if $smarty.request.room_count==2} checked="checked"{/if} /> <label class="ch">2</label></div>  					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="3"{if $smarty.request.room_count==3} checked="checked"{/if} /> <label class="ch">3</label></div>  					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="4"{if $smarty.request.room_count>3} checked="checked"{/if} /> <label class="ch">4+</label></div>  					{else}					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="1" /> <label class="ch">1</label></div>  					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="2" /> <label class="ch">2</label></div>  					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="3" /> <label class="ch">3</label></div>  					<div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="4" /> <label class="ch">4+</label></div>  					{/if}								</div>

Обработка в коде

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


    	if(isset($params['room_count'])){    		if(is_array($params['room_count']) && count($params['room_count'])>0){    			$sub_where=array();    			$where_array_prepared_sub=array();    			foreach($params['room_count'] as $rq){    				if($rq==4){    					$sub_where[]='room_count>3';    					$where_array_prepared_sub[]='('.DB_PREFIX.'_data.room_count>3)';    				}elseif(0!=(int)$rq){    					$sub_where[]='room_count='.(int)$rq;    					$where_array_prepared_sub[]='('.DB_PREFIX.'_data.room_count=?)';    					$where_value_prepared[]=(int)$rq;    				}    			}    			if(count($sub_where)>0){    				$where_array[]='('.implode(' OR ', $sub_where).')';    				$where_array_prepared[]='('.implode(' OR ', $where_array_prepared_sub).')';    			}    		}elseif((int)$params['room_count']!=0){    			$where_array[] = 're_data.room_count = '.(int)$params['room_count'];    			$where_value_prepared[]=(int)$params['room_count'];    			$where_array_prepared[]='('.DB_PREFIX.'_data.room_count=?)';    		}else{    			unset($params['room_count']);    		}    	}

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

<input style="float:left;" class="checkbox" type="checkbox" name="new_flat" value="1" /><label class="ch">Только в новостройке</label>

Увы не ищет

Подскажите пожалуйста, что мы могли напутать

Заранее спасибо

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


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

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

<input style="float:left;" class="checkbox" type="checkbox" name="new_flat" value="1" /><label class="ch">Только в новостройке</label>

Увы не ищет

Подскажите пожалуйста, что мы могли напутать

Заранее спасибо

Совсем не в ту степь полезли. Для поиска по чекбокс нужно выполнить в template_search. А только потом обрабатывать в форме поиска.

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


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

Совсем не в ту степь полезли. Для поиска по чекбокс нужно выполнить в template_search. А только потом обрабатывать в форме поиска.

Странно :)

Мы сделали такой чекбокс

<input style="float:left;" class="checkbox" type="checkbox" name="group_id" value="18" /><label class="ch">Только собственники</label>

И он хорошо ищет только объекты группы №18

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


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

Странно :)

Мы сделали такой чекбокс

<input style="float:left;" class="checkbox" type="checkbox" name="group_id" value="18" /><label class="ch">Только собственники</label>

И он хорошо ищет только объекты группы №18

Тут другая логика. 

1. Когда группа чекбокс используют один параметр в данном случае safestring.

2. Когда нужно отметить либо 1 либо 0. Например чекбокс обозначающий предмет. Вайфай. Вы отмечаете галочкой. Система понимает - отмечен значит 1, если нет то 0.

3. Мультивыбор. Когда в селексе выбираете несколько значений.

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


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

Странно :)

Мы сделали такой чекбокс

<input style="float:left;" class="checkbox" type="checkbox" name="group_id" value="18" /><label class="ch">Только собственники</label>

И он хорошо ищет только объекты группы №18

А если вы будете выгружать свои объявления, например на Яндекс, то система не поймет, что данное объявление от собственника. И.к нету самого признака .

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


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

А если вы будете выгружать свои объявления, например на Яндекс, то система не поймет, что данное объявление от собственника. И.к нету самого признака .

Выгрузка здесь совсем не причем. Это только для поиска фильтре на нашем сайте.

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


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

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

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

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

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

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

Войти

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

Войти сейчас

  • Похожие публикации

    • Автор: Анна Иванна
      На сканере недвижимости http://www.etown.ru/  поступают данные от сайтов, на которых реально работают риэлторы. 
      Также подключен парсер объявлений с досок объявлений avito.ru, irr.ru, realty.yandex.ru, cian.ru, sob.ru, youla.io, n1.ru, egent.ru, mirkvartir.ru и moyareklama.ru
      1. Чтобы получить доступ к отсканированным собственникам регистрируемся тут https://www.etown.ru/

      2. Подключаем тариф Премиум

      3. После оплаты вы увидите это сообщение и переходим во вкладку База собственников

      4. Теперь у нас есть доступ к скрытым полям телефонов собственников



      Иконкой с глазом можно посмотреть подробности объекта, перейти на страничку объекта и посмотреть фотографии.
      5. Если нужно отфильтровать по определенному гороуд объявления, тогда используем фильтр как показано на скриншоте. Если вы не нашли объявления по своему городу напишите нам на почту dkondin@gmail.com и мы добавим ваш город в парсер.

      Можно добавлять в фильтр несколько городов

       
      Также есть сканер для объявлений с авито.
      Они сами зарегистрировались по партнерской программе тут.
      В чем преимущество etown.ru ?
      В том, что когда объявления попадают на сайт, то вы получаете обратно ссылку на ваш сайт. Таким образом увеличивается поток трафика.
       
      Основной поток квартир мы получаем с одного источника, исключающего информацию, размещённую агенствами. То есть, объявления от собственников. Сканер платный, 500р в месяц. Но, безумно выгодно. Огромнейшая экономия времени. За сутки сканер выдаёт нам 20-30 квартир (аренда), только по нашему городу. Автоматически. Только обновляй страницу. 
      http://rent-scaner.ru/
      Вот, собственно ссылка. У кого есть более дешёвые, бесплатные или альтернативные сайты - делитесь.

    • Автор: iFedia
      Добрый день! У меня стоит разделенный доступ для риелторов и админов. Администратор видит все объявления, а група  риелторов только свои. Когда добавляешь объявление через админа, то поиск работает коректно и можна искать по заданным параметрам. Если объявление публикуется через групу риелторов, поиск не выводит результаты.
      Подскажите куда копать? Спасибо за ответы 
    • Автор: mykvartira
      Добрый день. Пока база городов не такая большая проблема с дублирование города не возникало, но все не вечно)))
      Обратил внимание, что есть объявление с городом Николаевка, который имеет Донецкую область. И тут человек все верно указал. Посмотрел в базу у себя и город Николаевка относится к Республике Крым и тут все верно. Все города привязаны к регионам!
      Нужно ли добавлять город Николаевка для Донецкой области? Получим в поиске и подачи 2 города.
      Будут ли проблемы если не добавлять дубль города, а вывод города привязать к региону/области?
      Как лучше реализовать все это, сайт работает по 10 странам и соответственно дубли будут! 
    • Автор: Realtor
      Некоторые собственники не хотят , чтобы их объекты распространялись через открытые СМИ
      Cоздаем поле чек бокс в таблице data например - поле MLSN
      Публикуем объект в базе с установленным чекбоксом MLSN-1 .
      В поиске поле MLSN показывается только для определенных групп к примеру - Агентство, Риэлтор, Помощник Риэлтора и в результате поиска объект  появляется  только для этих групп и карточка соответственно.(типа снятое с активации) и чтобы поисковики его не сканировали.
      Подскажите как реализовать?
    • Автор: Real
      Здравствуйте. С помощью мастера установил на хостинг шаблон agency. Ничего еще не делал, но при открытии расширенного поиска, кнопка "Найти" уходит под правый блок. Да и поля Город, Район, Метро и Улица то же выходят за рамки блока. Дело в том, что я этот шаблон очень давно покупал, но, в силу обстоятельств, им не занимался. Теперь вот решил поставить и такая неудача. Вроде как брак получается  Можно это как-то исправить?