Vladimir_K

Настройка полей Пользовательской формы (продолжение).

Recommended Posts

Здравствуйте.

Возникла необходимость искать через форму поиска по фразе. Такое можно сделать?

У нас есть поле, мы его добавляли сами. Поле с заголовком объявления. Поле тестовое.

Можно ли организовать поиск по этому полю? Если нет, то какие есть варианты?

Я дела так. В main/template_search.php добавил:

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

И

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

Но ничего не ищет. Просто все объявления показывает.

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


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

Хотел написать быстро и просто, но тут смешалось немного.

Поиск организовать можно.

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

Поле тестовое

имеете в виду текстовое? верно?

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


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

Здравствуйте.

Возникла необходимость искать через форму поиска по фразе. Такое можно сделать?

У нас есть поле, мы его добавляли сами. Поле с заголовком объявления. Поле тестовое.

Можно ли организовать поиск по этому полю? Если нет, то какие есть варианты?

Я дела так. В main/template_search.php добавил:


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

И


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

Но ничего не ищет. Просто все объявления показывает.

Не легче ли поставить "Живой поиск" который уже готов и функционирует?

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


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

Не легче ли поставить "Живой поиск" который уже готов и функционирует?

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

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


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

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

Ну по названию он кажется ищет.

А про неудовольствие это я прекрасно знаю))

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


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

Хотел написать быстро и просто, но тут смешалось немного.

Поиск организовать можно.

имеете в виду текстовое? верно?

Да, обычное текстовое поле. Мы в него заголовок объявления пишем. Произвольный.

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


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

Поиск организовать можно.

Так как поиск по текстовому полю организовать всё таки?)

#########################################

И ещё вопрос сразу возник, что бы темы не плодить.

У нас есть такое понятие как связанные поля. Я имею ввиду привязка конкретного поля (или полей) к категории. Это всё хорошо работает в форме подачи объявления. А как это реализовать в Пользовательской форме поиска? Если добавить туда все поля, которые должны подтягиваться после выбора соответствующей категории, то они все в форме поиска видны сразу.

Пример, что бы было понятнее.

Список категорий:

Категория 1
Категория 2 
Категория 3
и т.д... 

К Категории 1 привязаны Поле А и Поле Б

К Категории 2 привязаны Поле С и Поле Е

Мы все эти поля (А, Б, С и Е) добавляем в нашу пользовательскую форму поиска (Редактор форм - Формы поиска). По логике оно должно работать как в форме подачи объявления. Т.е. Пока мы не выбираем Категорию 1, поля А и Б у нас в форме поиска не должны появляться. Но по факту, все наши поля, А, Б, С и Е (и все остальные перевязанные с категориями) видны в форме поиска сразу.

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


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

У нас есть такое понятие как связанные поля. Я имею ввиду привязка конкретного поля (или полей) к категории. Это всё хорошо работает в форме подачи объявления. А как это реализовать в Пользовательской форме поиска? Если добавить туда все поля, которые должны подтягиваться после выбора соответствующей категории, то они все в форме поиска видны сразу.

в данный момент возможно только ручками сверстать сому форму.

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


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

в данный момент возможно только ручками сверстать сому форму.

На базе и по принципу advance_search_form.tpl ?

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


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

На базе и по принципу advance_search_form.tpl ?

да, именно так. После на Jquery можно настроить показ элемента при выборе определенного параметра.

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


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

После на Jquery можно настроить показ элемента при выборе определенного параметра.

А есть какая-то инструкция как именно это сделать?

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


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

А есть какая-то инструкция как именно это сделать?

К сожалению нету, все сугубо индивидуально. Скрипт может быть и 5-10 строк, а может и растянуться на большее количество. 

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


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

Возникла необходимость искать через форму поиска по фразе. Такое можно сделать?

У нас есть поле, мы его добавляли сами. Поле с заголовком объявления. Поле тестовое.

Можно ли организовать поиск по этому полю? Если нет, то какие есть варианты?

Я дела так. В main/template_search.php добавил:


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

И


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

Но ничего не ищет. Просто все объявления показывает.

 

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

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

Находим строку

$results = $Template_Search->run();

Их там несколько, но нас интересует та, что в районе 800-й строки внутри функции function get_sitebill_adv_core

После нее добавляем следующие кусочки

if (isset($results['where_prepared'])) {
	$where_array_prepared = array_merge($where_array_prepared, $results['where_prepared']);
}
if (isset($results['where_value_prepared'])) {
	$where_value_prepared = array_merge($where_value_prepared, $results['where_value_prepared']);
}

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

 

2. Открываем наш template_search.php файл.

Сейчас он имеет вид примерно такой

<?php
class Template_Search extends SiteBill {

	public function getParams(){

		if(''!==$this->getRequestValue('internal_type_id')){
			$params['internal_type_id'] = $this->getRequestValue('internal_type_id');
		}
		
	/*ДОБАВЛЯЕМ ПЕРЕХВАТ ПАРАМЕТРА word С ТЕКСТОМ*/
		if(''!==trim($this->getRequestValue('word'))){
			$params['word'] = $this->getRequestValue('word');
		}
	/*ЗАКОНЧИЛИ ДОБАВЛЕНИЕ*/

		return $params;

	}	

	public function run(){

		$params=$this->getParams();

		$where_array_prepared=array(); /*НОВЫЙ МАССИВ ДЛЯ ХРАНЕНИЯ ЧАСТЕЙ ЗАПРОСА*/
		$where_value_prepared=array(); /*НОВЫЙ МАССИВ ДЛЯ ХРАНЕНИЯ ЗНАЧЕНИЙ ЗАПРОСА*/

		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['internal_type_id'])){
			$where_array[]=DB_PREFIX.'_data.internal_type_id LIKE \'%'.$params['internal_type_id'].'%\'';
		}

	/*ТУТ ИДУТ КАКИЕ-ТО НАШИ ОБРАБОТКИ*/

	/*ТУТ НАЧИНАЕМ ОБРАБАТЫВАТЬ НАШЕ ПОИСКОВОЕ СЛОВО*/
	
		if(isset($params['word'])){
			$where_array_prepared[]=DB_PREFIX.'_data.text LIKE ?'; /*ЭТО УСЛОВИЕ ИЩЕТ ВХОЖДЕНИЯ ИСКОМОГО КУСКА ТЕКСТА В ЛЮБОМ МЕСТЕ ТЕКСТА В КОТОРОМ ИЩЕМ*/
			$where_value_prepared[]='%'.$params['word'].'%';
		}
	/*ЗАКОНЧИЛИ ОБРАБОТКУ*/	
		
		return array(
			'where'=>$where_array,
			'params'=>$params	,
			'where_prepared'=>$where_array_prepared, /*НОВЫЕ ЭЛЕМЕНТЫ МАССИВА ОТВЕТА КОТОРЫЕ ДОБАВИЛИСЬ*/
			'where_value_prepared'=>$where_value_prepared /*НОВЫЕ ЭЛЕМЕНТЫ МАССИВА ОТВЕТА КОТОРЫЕ ДОБАВИЛИСЬ*/

		);

	}

}

Если мы хотим сделать поиск по нескольким полям в объявлении, то часть запроса

$where_array_prepared[]=DB_PREFIX.'_data.text LIKE ?';
$where_value_prepared[]='%'.$params['word'].'%';

мы можем заменить на 

$where_array_prepared[]='( ('.DB_PREFIX.'_data.text LIKE ?) OR ('.DB_PREFIX.'_data.text1 LIKE ?) OR ('.DB_PREFIX.'_data.text2 LIKE ?) )';
$where_value_prepared[]='%'.$params['word'].'%';
$where_value_prepared[]='%'.$params['word'].'%';
$where_value_prepared[]='%'.$params['word'].'%';

В таком случае мы ищем по полям с именами text, tex1 и text2 и удовлетворяемся, если нашли хоть в одном из них. Количество кусочков $where_value_prepared[]='%'.$params['word'].'%'; будет равняться количеству вопросительных знаков в условии выборки.

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


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

 

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

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

Находим строку


$results = $Template_Search->run();

Их там несколько, но нас интересует та, что в районе 800-й строки внутри функции function get_sitebill_adv_core

После нее добавляем следующие кусочки


if (isset($results['where_prepared'])) {
	$where_array_prepared = array_merge($where_array_prepared, $results['where_prepared']);
}
if (isset($results['where_value_prepared'])) {
	$where_value_prepared = array_merge($where_value_prepared, $results['where_value_prepared']);
}

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

 

2. Открываем наш template_search.php файл.

Сейчас он имеет вид примерно такой


<?php
class Template_Search extends SiteBill {

	public function getParams(){

		if(''!==$this->getRequestValue('internal_type_id')){
			$params['internal_type_id'] = $this->getRequestValue('internal_type_id');
		}
		
	/*ДОБАВЛЯЕМ ПЕРЕХВАТ ПАРАМЕТРА word С ТЕКСТОМ*/
		if(''!==trim($this->getRequestValue('word'))){
			$params['word'] = $this->getRequestValue('word');
		}
	/*ЗАКОНЧИЛИ ДОБАВЛЕНИЕ*/

		return $params;

	}	

	public function run(){

		$params=$this->getParams();

		$where_array_prepared=array(); /*НОВЫЙ МАССИВ ДЛЯ ХРАНЕНИЯ ЧАСТЕЙ ЗАПРОСА*/
		$where_value_prepared=array(); /*НОВЫЙ МАССИВ ДЛЯ ХРАНЕНИЯ ЗНАЧЕНИЙ ЗАПРОСА*/

		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['internal_type_id'])){
			$where_array[]=DB_PREFIX.'_data.internal_type_id LIKE \'%'.$params['internal_type_id'].'%\'';
		}

	/*ТУТ ИДУТ КАКИЕ-ТО НАШИ ОБРАБОТКИ*/

	/*ТУТ НАЧИНАЕМ ОБРАБАТЫВАТЬ НАШЕ ПОИСКОВОЕ СЛОВО*/
	
		if(isset($params['word'])){
			$where_array_prepared[]=DB_PREFIX.'_data.text LIKE ?'; /*ЭТО УСЛОВИЕ ИЩЕТ ВХОЖДЕНИЯ ИСКОМОГО КУСКА ТЕКСТА В ЛЮБОМ МЕСТЕ ТЕКСТА В КОТОРОМ ИЩЕМ*/
			$where_value_prepared[]='%'.$params['word'].'%';
		}
	/*ЗАКОНЧИЛИ ОБРАБОТКУ*/	
		
		return array(
			'where'=>$where_array,
			'params'=>$params	,
			'where_prepared'=>$where_array_prepared, /*НОВЫЕ ЭЛЕМЕНТЫ МАССИВА ОТВЕТА КОТОРЫЕ ДОБАВИЛИСЬ*/
			'where_value_prepared'=>$where_value_prepared /*НОВЫЕ ЭЛЕМЕНТЫ МАССИВА ОТВЕТА КОТОРЫЕ ДОБАВИЛИСЬ*/

		);

	}

}

Если мы хотим сделать поиск по нескольким полям в объявлении, то часть запроса


$where_array_prepared[]=DB_PREFIX.'_data.text LIKE ?';
$where_value_prepared[]='%'.$params['word'].'%';

мы можем заменить на 


$where_array_prepared[]='( ('.DB_PREFIX.'_data.text LIKE ?) OR ('.DB_PREFIX.'_data.text1 LIKE ?) OR ('.DB_PREFIX.'_data.text2 LIKE ?) )';
$where_value_prepared[]='%'.$params['word'].'%';
$where_value_prepared[]='%'.$params['word'].'%';
$where_value_prepared[]='%'.$params['word'].'%';

В таком случае мы ищем по полям с именами text, tex1 и text2 и удовлетворяемся, если нашли хоть в одном из них. Количество кусочков $where_value_prepared[]='%'.$params['word'].'%'; будет равняться количеству вопросительных знаков в условии выборки.

Получилось. Я не верю своим глазам! )

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

Но всё равно это уже что-то. 

Осталось разобраться вот с этим великолепием :)

В 30.08.2017 в 13:55, Vladimir_K сказал:

У нас есть такое понятие как связанные поля. Я имею ввиду привязка конкретного поля (или полей) к категории. Это всё хорошо работает в форме подачи объявления. А как это реализовать в Пользовательской форме поиска? Если добавить туда все поля, которые должны подтягиваться после выбора соответствующей категории, то они все в форме поиска видны сразу.

 

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


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

Поиск, правда, ищет без учёта словоформ

Это естественно. Вхождение "квартиру" можно будет найти только отправив в поиск "квартиру" или любую другую форму этого слова, образованную побуквенным отбрасыванием первой и\или последней буквы -  "квартир", "кварт", "вартиру" и т.д. Преобразовывать "квартиру" из поискового запроса в набор вариантов "квартиры", "квартира", "квартир" код не будет, так как у него нет ни алгоритма под это, ни словарей.

Цитата

У нас есть такое понятие как связанные поля. Я имею ввиду привязка конкретного поля (или полей) к категории. Это всё хорошо работает в форме подачи объявления. А как это реализовать в Пользовательской форме поиска? 

Никак. Связанные с топиком поля имеют отношение к форме добавления\изменения объекта. Связи на форме же поиска неоходимо настраивать иным способом, не через редактор форм.

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


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

Связи на форме же поиска неоходимо настраивать иным способом, не через редактор форм.

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

У нас на данный момент ситуация примерно следующая. 

Через файл advance_search_form.tpl подключается файл new_search_form.tpl. Вот он то и отвечает за вывод формы поиска на нашем сайте. Та, что дефолтная.

Создали дубликат файла new_search_form.tpl и назвал его new_search_form2.tpl. И теперь уже файл new_search_form2.tpl подключили в advance_search_form.tpl. Его и будем пробовать подгонять под то, что нужно, что бы в случае чего не испортить оригинал.

В файле new_search_form2.tpl закомментировали всё лишнее оставили только вывод "Категория" и "Цена от/Цена/до".

Добавили туда поле с поиском по заголовку:

<div class="beds control-group">
						<label class="control-label" for="inputType">
						 Заголовок
						</label>
						<div class="controls">
						<input type="text" class="" name="object_name_id" value=""/>
						</div>
					</div>

В принципе ищет. Но подскажите, будет ли правильным такой код и достаточным? Может ещё что-то нужно прописать?

 

И вторая проблема, более масштабная - это "подтяжка" связанных полей как в форме добавления объявления.

Категории в нашем фильтре уже и так есть. Предположим, что в data у нас есть некоторые поля, которые нам нужно подтягивать в форму поиска по мере выбора конкретной категории. Они, эти поля уже там есть и уже подвязаны к конкретным категориям и в форме подачи работают нормально. Это могут быть обычный select_box, пользовательский справочник в виде того же select_box, checkbox или safe_string. 

Например категории:

  • Квартиры
  • Дома
  • Коммерческая 

К "Квартирам" привязано:

  1. Справочник "Тип квартиры", с перечнем типов квартир.
  2. select_box "Тип сделки" с двумя вариантами - Аренда или Продажа. 
  3. Несколько полей типа safe_string.

К Категории "Дома" привязаны другие поля и справочники.

И т.д.

Но появляться всё это должно не сразу в форме поиска, а по мере выбора категории.

Подскажите как сделать? С чего начать?

 

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


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

Обычно я делаю это по принципу закладок. У меня есть некий блок формы поиска. Внутри него я делаю несколько подблоков внутри которы размещаю отдельные формы с наьборами элементов. Например в блоке 1 у меня форма с полями под поиск по данных присущим квартирам. В блоке 2 - тоже форма, но с набором полей под поиск дома и т.д. Все эти блоки скрыты.

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

Минус в том, что так можно адекватно сделать только один уровень - Дом или Квартира или Участок и соотв. форма. Развивать далее потом, например внутри квартир еще варьировать подразделы Апатраметны, Простые квартиры, Элитное жилье со своими формами, таким макаром становится накладно.

Элементы можно подключать из существующих моделей. Что бы не вписывать в шаблон жестко разметку какого-нибудь селектбокса с набором варианто и потом следить, если в админке поменялось и не править утрясая в шаблоне, а сразу получать синхронизированный элемент, как сейчас доступны те же city_list со списком городов. Я найду пример такого варианта, что бы не был совсем мозговыносящим.

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


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

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

Буду очень признателен.

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


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

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

Не пробовали искать ещё?

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


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

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

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

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

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

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

Войти

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

Войти сейчас