InfernoLan

Параметры поиска от и до

Recommended Posts

Создал форму поиска, в нее запихнул поле "цена".

http://i.imgur.com/L3UfzLK.png

http://i.imgur.com/MVU2PNr.png

 

Но не работает поиск в диапазоне от и до.

работает поиск только по критерию "от"

А критерий "до" работает только если указать точную сумму.

 

Так же сделал поля "общая площадь", "жилая площадь", "площадь кухни" с параметром is_ranged=1.

Может их нужно добавить в template_search.php?

 

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


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

1. Какой шаблон?

2. Ссылка на сайт тоже приветствуется

3. Если поля  "общая площадь", "жилая площадь", "площадь кухни" имеют системные имена square_all, square_live и square_kitchen соответственно, то добавлять в template_search.php ничего не нужно - эти имена пока поддерживаются автоматически.

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


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

1. Какой шаблон?

2. Ссылка на сайт тоже приветствуется

3. Если поля  "общая площадь", "жилая площадь", "площадь кухни" имеют системные имена square_all, square_live и square_kitchen соответственно, то добавлять в template_search.php ничего не нужно - эти имена пока поддерживаются автоматически.

1. Шаблон дефолтный.

2. estateplus.infernonet.ru

3. Поля имеют именно такие названия.

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


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

Загнали меня в тупик. Возможно где-то недообновился движок. Параметры уходят верные. В коде должны обрабатываться верно. Но не идет. Если сможете предоставить фтп-доступ, можно будет попробовать разобраться. 

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


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

Несколько важных вопросов по   is_ranged

 

Как обработать я нашел на форуме, но есть другие вопросы.

 

1.Какого типа должно быть поле для ползунка? safe_string ?

 

2.Как вывести ручками в шаблон, если нет встроенной поддержки редактора формы поиска??  

Сделать assert?с какой функцией? $this->template->assert('currency_list', $form_generator->???????($kvartira_model['data']['currency_id']));

 

3.Ну и собственно как добавить сам ползунок?

 

Благодарю заранее за помощь. Исчерпывающей информации не нашел на эту тему...

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


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

1. Абсолютно не важно. Ползунок - это элемент UI и связь с моделью у него косвенная и односторонняя - т.е. вы приклеиваете ползунок к какому-то полю, но это никак не влияет на данные в модели.

2. get_single_select_box_by_query(), get_select_box() в зависимости от типа. Первый под selectbox_by_query, второй - select_box

3. Шаблон, скрипт ползунка и немного фантазии) Ползунок, по сути - это оболочка для инициализации двух текстовых полей - верхней и нижней границы значений.

 

ПС. Если вы используете is_ranged у вас НЕТ контроля за этим элементом в шаблоне. А следовательно и человечной возможности включить на него ползунок тоже нет.

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


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

 

Ползунок, по сути - это оболочка для инициализации двух текстовых полей - верхней и нижней границы значений.

Ну так как мне эти текстовые поля вывести?Как получить верхнюю и нижнюю границу значений и вставить в шаблон ?

 

Не на селектбокс-же вешать ползунок) ?

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


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

Не на селектбокс-же вешать ползунок) ?

 

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

 

 

Ну так как мне эти текстовые поля вывести?

 

 

Я поступаю следующим образом:

1. не использую ВСЮ модель data для создания формы поиска. Она избыточна и, в принципе, не соответствует в полной мере виду формы.

2. Я использую ОТДЕЛЬНУЮ модель формы поиска, в том числе и на базе модели data. Поясню. Для формы поиска я могу взять модель data и выкинуть из нее все ненужные для формы поиска поля (мне не нужно, что бы движок пытался проинициализировать несуществующие на форме поля, тратя лишнее время и усилия). Я могу описать свою модель в виде массива, как это делается с большинством исходных моделей перед тем, как они попадут в БД.

Так же в свою модель я могу добавить СВОИ поля. Например в объявлении вам не нужно поле мин. цена и макс. цена, а нужно одно поле Цена. А вот в форме поиска вам не нужно поле Цена, так как только умалишенній найдет удовольствие в поиске по четкому хзначению, а вот мин и мак нужны. В это и состоит смысл конфликта логики формы поиска и формы данных.

3. Вся магия кроется в Local_Kvartira_Search_Form 

 

protected function addField($name) - это моя функция быстрого добавления поля ввода. В данном случае я использую как исходную модель data, поэтому мои манипуляции будут заключаться в удалении ненужных полей и добавлении нужных. Вот эта функция добавляет.

 

Строки 19-20 Полчение модели объявы и сохранение ее в отдельную переменную. Дальше она у нас как пластилин, из которого мы вылепим нужное.

Строка 21 Описание полей из модели data которые нам нужны в поиске. Все остальные поля будут удалены и на форму не попадут никаким способом. И операции по их инициализации из запроса тоже не будут проводиться.

 

Строка 22-28 Собственно очистка от лишних полей и убирание этого неказистого combo-элемента.

 

Строка 30-43 Дополнение модели нужными полями. Вся прелесть модели в том, что она способна сама взять свои значения из запроса. Но если поля минимальной цены нет в модели, то взять его она не может. И вот мы добавляем свои поля.

 $kvartira_model=array_merge($kvartira_model, $this->addField('price_min')); - это добавление поля ввода с name="price_min". Но не забывайте, тут мы описываем ТОЛЬКО поля для создания формы поиска. Все это не имеет отношения к самому поиску. Т.е. добавив поле price_min мы просто добавили поле в место, где его удобно брать и обрабатывать. Но правила для самого поиска, что искать в каком поле БД в зависимости откакого поля в запросе - это уже template_search (!Важно)

 

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

 

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

 

Все.

Дальше я на форме поиска распихиваю как мне нужно эти элементы и прописываю правила  в template_serach.

 

В чем плюс?

1. нет лишней работы движку. Вы за один раз настраиваете  и движек потом не повторяет безсмыслленых операций.

2. Нет конструкций типа

<input type="text" name="floor_min" value="{if (isset($smarty.request.floor_min) && $smarty.request.floor_min!=0)}{$smarty.request.floor_min}{/if}" /> 

Элемент генерируется моделью вместе со значением и нам не нужно уже смотреть в смарти.реквест и писать условия.

3. У меня могут быть нужные мне элементы, которых нет или не может быть в модели объявления. Соотв. я могу наладить произвольный или комплексный поиск.

 

 

Как получить верхнюю и нижнюю границу значений и вставить в шаблон ?

 

 

Запрос в БД на получение MAX и MIN и assert в шаблон. Или, что является приоритетным - вести эти значения как настройки или вшить в код с запасом.

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


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

 

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

Да, но в нем могут быть не только цифровые значения.

Какой тип поля лучше всего использовать для ввода и обработки чисел?

Вернее какой тип поля предназначен исключительно для чисел?

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


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

Исключительного для чисел в данный момент нет. Для хранения числовых значений чаще всего - safe_string. С использованием правил например.

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

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


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

Вроде разобрался.

 

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

 

В шаблоне вставляем нужное поле например так {$search_form_parts.city_list}  

 

Это выведит заранее сформированный элемент типа get_single_select_box_by_query и переданный через массив search_form_parts

 

_______________________________________________________________________________________________________________________

 

Не совсем понял как работает addField.   В частности откуда возьмуться значения square_uchastka_min  и square_uchastka_max  ?

 

$kvartira_model=array_merge($kvartira_model, $this->addField('square_uchastka_min'));
$kvartira_model=array_merge($kvartira_model, $this->addField('square_uchastka_max'));

 

Или мне их нужно задать вручную , или сделать выборку из базы min и max ?

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


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

До горизонтальной черты все верно поняли.

 

addField просто доьавляет. Что бы не писать длинный код формирования элемента массива я вынес его в функцию для однотипных элементов. Вот и вся его работа.

 

Откуда берутся значения - пастебин тотже. строка 45 - 

 

$kvartira_model = $data_model->init_model_data_from_request($kvartira_model, true, true);

 

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

 

Макс и мин - это уже отдельная история. Даже две - откуда брать и куда девать.

Откуда брать - вопрос спорный. Не всегда есть смысл забивать готово даже максимальную цену. Нет от этого никакой реальной пользы. С минимальным значением любого параметра - та же беда. Можно и из БД высчитывать, можно и эмпирически предположить некие граничные значения без привзки к реальным данным - это не принципиально совершенно.

 

 

Куда девать - вставлять в модель после init_model_data_from_request

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

Например проверяем поле price_max. Если оно равно нулю или больше PRICE_MAX, тогда $kvartira_model['price_max']['value']=PRICE_MAX

Или для мин. цены если она равна 0 или больше PRICE_MAX, тогда $kvartira_model['price_min']['value']=PRICE_MIN или PRICE_MAX, смотря какая логика вам нравится.

 

кажется плохо объяснил.

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


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

Имеем:   

 

1.В таблице re_data:      "sea_distance"    типа  safe_string  Type:int

 

2.В  local_kvartira_search.php

$kvartira_model=array_merge($kvartira_model, $this->addField('sea_distance_min'));$kvartira_model=array_merge($kvartira_model, $this->addField('sea_distance_max'));$e=$form_generator->compile_safe_string_element($kvartira_model['sea_distance_min']);$form_parts['sea_distance_min']=$e['html'];		$e=$form_generator->compile_safe_string_element($kvartira_model['sea_distance_max']);$form_parts['sea_distance_max']=$e['html'];		$this->template->assert('search_form_parts', $form_parts);

3.В search_template.tpl

            <div class="control-group">                <div class="controls">                    {$search_form_parts.sea_distance_min}                </div>            </div>            <div class="control-group">                <div class="controls">                    {$search_form_parts.sea_distance_max}                </div>            </div>

Теперь выводяться 2 инпута, которые можно обработать,  но как эти инпуты  заполнить сразу минимальными и максимальными значениями?

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


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

Обработка:

public function getParams(){						if(0!==(int)$this->getRequestValue('sea_distance_min')){			$params['sea_distance_min'] = (int)$this->getRequestValue('sea_distance_min');		}				if(0!==(int)$this->getRequestValue('sea_distance_max')){			$params['sea_distance_max'] = (int)$this->getRequestValue('sea_distance_max');		}		return $params;	}
public function run(){		$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(!empty($params['sea_distance_min']) && isset($data_model_array['sea_distance'])){			$where_array[]='`'.DB_PREFIX.'_data`.`sea_distance`>='.$params['sea_distance_min'];		}				if(!empty($params['sea_distance_max']) && isset($data_model_array['sea_distance'])){			$where_array[]='`'.DB_PREFIX.'_data`.`sea_distance`<='.$params['sea_distance_max'];		}				return array(			'where'=>$where_array,			'params'=>$params				);	}

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


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

//опеределяем границы. метод получения ихх не учитываем

$MIN_SEA_DIST=10;

$MAX_SEA_DIST=1000;

$kvartira_model=array_merge($kvartira_model, $this->addField('sea_distance_min'));

$kvartira_model=array_merge($kvartira_model, $this->addField('sea_distance_max'));

$kvartira_model = $data_model->init_model_data_from_request($kvartira_model, true, true); //получение данных из запроса

//если пуст или ноль, забиваем максималку

if(intval($kvartira_model['sea_distance_max']['value'])<0 || intval($kvartira_model['sea_distance_min']['value'])>$MAX_SEA_DIST){

$kvartira_model['sea_distance_max']['value']=$MAX_SEA_DIST

}

//если пуст или ноль, забиваем минималку

if(intval($kvartira_model['sea_distance_min']['value'])<0 || intval($kvartira_model['sea_distance_min']['value'])>$MAX_SEA_DIST){

$kvartira_model['sea_distance_min']['value']=$MIN_SEA_DIST

}

$e=$form_generator->compile_safe_string_element($kvartira_model['sea_distance_min']);

$form_parts['sea_distance_min']=$e['html'];

        

$e=$form_generator->compile_safe_string_element($kvartira_model['sea_distance_max']);

$form_parts['sea_distance_max']=$e['html'];

        

$this->template->assert('search_form_parts', $form_parts);

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


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

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

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

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

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

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

Войти

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

Войти сейчас