koreshok

добавить новые поля в поиск (template_search и др.)

Recommended Posts

1-2. Для вставки обычного чекбокса нет надобности наследовать целый Kvartira_Search_Form

Если уже потянули, то делаем

 

daily_rent_id - системное имя чекбокса отвечающего за признак Посуточной

<?phpclass Local_Kvartira_Search_Form extends Kvartira_Search_Form {function main () {parent::main();$data_model = new Data_Model();$kvartira_model = $data_model->get_kvartira_model(true)$kvartira_model['data'] = $data_model->init_model_data_from_request($kvartira_model['data']);$form_generator = new Form_Generator();$this->template->assert('daily_rent_list', $form_generator->get_checkbox($kvartira_model['data']['daily_rent_id']));}}
Заменив ВСЁ в local_kvartira_search.php на данный код , получил чего-то белый экран!

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


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

 

Заменив ВСЁ в local_kvartira_search.php на данный код , получил чего-то белый экран!

 

после $kvartira_model = $data_model->get_kvartira_model(true) точку с зяпятой поставьте

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


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

...думал ещё вводить другие поля... потренеровался на Посуточной Аренде))

 

Тогда лучше оставить. Главное поменять как я показал, что бі ваши действия віполнялись после основных движковых операций - так как по сути вы дополняете функционал.

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


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

 

 

Если нет надобности наследовать целый Kvartira_Search_Form

 

 

 

То просто в шаблоне

Посуточная аренда <input type="checkbox" name="daily_rent"{if isset($smarty.get.daily_rent)} checked="checked"{/if} value="1" />

или daily_rent заменить на daily_rent_id, смотря какое системное имя у поля.

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


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

Не буду утверждать, что тормозит из-за этого, но и не буду опровергать.

 

Попробуйте заменить строку

$kvartira_model['data'] = $data_model->init_model_data_from_request($kvartira_model['data']);

на

$kvartira_model['data']['daily_rent_id']['value']=(int)$this->getRequestValue('daily_rent_id');

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


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

Стало намного быстрее!

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

 

P.S. У меня везде только просто daily_rent (без id)

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


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

P.S. У меня везде только просто daily_rent (без id)

 

 

значит везде нужно заменить daily_rent _id на daily_rent 

 

 

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

 

 

С большой долей вероятности.

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


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

Тут у меня возникли ещё 2 маленькие проблемы в связи с внедрением Чекбокса "Посуточной аренды":

1) Ничего не находит, если его установить в Новую (дополнительную) форму поиска

2) Так же, почему-то выборка происходит и в блоке со Специальными предложениями. Причём, как-то странно: чекбокс установлен у 2-х объектов, а в VIP-блоке остаётся только один.

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


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

А что за "Новая (дополнительная)" форма поиска?

 

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

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


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

А что за "Новая (дополнительная)" форма поиска?

 

Обычно Спецпредложения реагируют на указанные параметры поиска. Т.е. если в форме вы выбрали искать по какому-то параметру, то и спецпредложения аналогично меняют свое содержимое. А вот почему выводится только одно - сложно сказать. 

1. Новая Форма поиска для главной страницы, которая создаётся в админке, допустим, под отдельную категорию (со своим набором полей).

2. Этого не знал. Может это и хорошо. Но лучше бы было, чтобы это как-то отключалось. Пример: допустим спецпредложения/спецразмещения реализованы широкоформатным слайдером-каруселью с 10-ком превьюшек... Из них почти все о продаже квартир, домов и т.п., и только 1-2 — это объявления об аренде. В момент фильтрации, при поиске сдаваемого помещения - слайдер превращается в не очень красивую штуку. Это же, в принципе касается и боковой колонки, когда у тебя количество объявлений чётко подобрано под дизайн. 

 

"Спецпредложения выводятся ограниченным количеством, возможно вторая запись просто не попадает в это количество."

Нет, ограничений не стоит! 

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


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

1. В принципе должна срабатывать даже из таких форм - они все, если мне не изменяет память, собирают параметры из одного места.

Есть возможность взглянуть на сайт или он локальный?

 

2. Мне это "самоуправство", в принципе, тоже не нравится. Но отключить кнопкой варианта нет. Можно просто переопределить функцию-сборщик спецпредложений.

 

Нет, ограничений не стоит! 

 

Количество спецпредложений, выбираемых из БД, для показа на странице лимитировано. Если в БД содержится спецпредложений больше этого лимита, от за один показ они все не будут показаны.

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


Ссылка на сообщение
Поделиться на других сайтах
$params['tmp_var_id'] = (int)$this->getRequestValue('tmp_var_id');

столкнулся со следущим:

скажем в форму добавлено поле с типом selectbox,

а если делаем в template_search.php  var_dump ($params['tmp_var_id']);  на стандартной форме поиска, то почему-то в сырце 2 массива

при этом, дефолтный 0 для поля ставить нельзя, не отработает, отработает только если будет null, т.е. не указано

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


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

а если делаем в template_search.php  var_dump ($params['tmp_var_id']);  на стандартной форме поиска, то почему-то в сырце 2 массива

 

Я что-то не уловил суть.

Если правильно понял - вызов template_search происходит несколько раз (не единожды). Построитель сетки, который вызывает template_search строит не только сетку результатов поиска, но и просто сетку топика, участвует в выборке данных для спецпредложений. Грубо говоря практически везде, где выбирается несколько объявлений.

 

Насчет отработает 0 или null - не понял. Если в template_search вы приводите к целому, то пустое значение или ноль приведутся к нулю и дальше уже все будет зависеть от следующих проверок.

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


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

Если правильно понял - вызов template_search происходит несколько раз (не единожды).

а зачем не 1 раз, если возвращаем всё равно массив?

 

 

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

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

 

 

 

Насчет отработает 0 или null - не понял. Если в template_search вы приводите к целому, то пустое значение или ноль приведутся к нулю и дальше уже все будет зависеть от следующих проверок.

всё верно, к целому. 0 - ясно, а null не приводится.Поэтому при указания дефолтного 0 - один вывод, с пустым значением - другой.

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


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

0 - ясно, а null не приводится

 

$d=NULL;

var_dump((int)$d);

 

возвращает что-то отличное от нуля?

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


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

а зачем не 1 раз, если возвращаем всё равно массив?

 

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

 

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

 

 

Почему нонсенс? У вас в админке не такие объявления как во фронте? Тем более, что бы условие сработало, надо зарядить в реквест соотв. переменную, чего в админке обычно нет.

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


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

$params['rayonkarelii_id'] = (int)$this->getRequestValue('rayonkarelii_id');
var_dump ($params['rayonkarelii_id']);  // при отсутствии дефолтного 0 в модели возвращает дважды null

--------

а нонсенс, т.к. считаю, что в админке не должны обрабатываться условия template_search.php

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


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

$params['rayonkarelii_id'] = (int)$this->getRequestValue('rayonkarelii_id');

var_dump ($params['rayonkarelii_id']);  // при отсутствии дефолтного 0 в модели возвращает дважды null

 

Вообще-то дальше после

$params['rayonkarelii_id'] = (int)$this->getRequestValue('rayonkarelii_id');

должно бы идти

if($params['rayonkarelii_id']==0){unset($params['rayonkarelii_id']);}

так как 0 - "мусорное" значение.

Я верно догадался?

 

 

считаю, что в админке не должны обрабатываться условия template_search.php

 

 

Как аргументация - не убедительно))

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

А в чем проблема того, что для админки он обрабатывается?

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


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

 

ага, должно бы, естесно нету :)

 

А в чем проблема того, что для админки он обрабатывается?

в одном случае выведет 3 из 3, в другом 1 из 3 -х и естесно глаза квадратные, когда также в админке.

Резюме: с IF вылечилось :)

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


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

Помогите.

Как соединить 2 поля в поиске (регион и город)  чтобы сохранить зависимости.

Например:

 

 

область 1 >  город1

область 1 >  город2

область 2 > город 1

область 2 > город 2

и т.д.

 

Цель - уменьшить количество полей при поиске.

Потом на это поле повесить автодополнение.

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


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

Помогите.

Как соединить 2 поля в поиске (регион и город)  чтобы сохранить зависимости.

Например:

 

 

область 1 >  город1

область 1 >  город2

область 2 > город 1

область 2 > город 2

и т.д.

 

Цель - уменьшить количество полей при поиске.

Потом на это поле повесить автодополнение.

Смотрите тут

/apps/system/js/refresher.functions.js

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

function update_child_list ( id, context ) {	if(context===undefined || context===null){		return;	}		var parent=$(context).parents('form').eq(0);		parent.find('[id='+ id +'_div]').html('<div id="select_box_loading"></div>');		var country_id = parent.find('#country_id').val();	var region_id = parent.find('#region_id').val();	var city_id = parent.find('#city_id').val();	var district_id = parent.find('#district_id').val();	var metro_id = parent.find('#metro_id').val();	var street_id = parent.find('#street_id').val();	var url = estate_folder+'/js/ajax.php?action=get_'+ id +'&country_id='+ country_id  +'&region_id='+ region_id +'&city_id='+ city_id +'&district_id='+ district_id +'&metro_id='+ metro_id +'&street_id='+ street_id + '&callback=?';	//console.log(url);			jQuery.ajax({		url: url, 		dataType: 'json', 		type: "get",		timeout: 2000,		success: function(json){			parent.find('[id='+ id +'_div]').replaceWith(json.response.body).fadeIn('slow', function() {				if('function' == typeof refresher_global_callback){					refresher_global_callback(parent.find('[id='+ id +'_div] select'));				}			}); 		},		error: function(){/*alert("error");*/}	});}

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


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

 

В сайтбилле есть два принципиально разных типа форм поиска - стандартная (та которая доступна в шаблоне при установке) и пользовательская (которые создаются Редактор Форм - Формы Поиска).
Основная разница между ними в том, что последняя создается автоматически из выбранных вами элементов, в то время как первая - продукт ручной работы. За создание стандартной формы отвечает базовый класс Kvartira_Search_Form (/apps/system/lib/frontend/search/kvartira_search.php) либо его локальный наследник - Local_Kvartira_Search_Form (/template/frontend/nuzhendom/main/search/local_kvartira_search.php) как пример , либо его заменитель Kvartira_Search_Form (/template/frontend/capitol/main/search/kvartira_search.php).
Эти классы либо заменяют базовый, либо расширяют его.
 
Принцип работы таков, что в одном из этих классов, обычно локальном или переопределенном, что бы не затиралось при обновлениях, реализуется генерация нужных элементов. Например в базовом классе реализуется генерация $city_list. Поэтому жтот список выводится в форму. Но ваш $shosse_list не определен в этом классе, поэтому и не выводится.
После генерации элементов стандартной формы, эти значения перехватываются в шаблоне search_form.tpl/standart_search_form.tpl( в зависимости от шаблона ). Тут вы сами нашли куда вставлять свою переменную.
 
Грубо говоря порядок действий таков.
В свой шаблон вы копируете файл /apps/system/lib/frontend/search/kvartira_search.php в папку /template/frontend/имя_шаблона/main/search/ и переименовываете его в local_kvartira_search.php.
 
В этом файле меняете строку
 
class Kvartira_Search_Form extends SiteBill {
на
 
class Local_Kvartira_Search_Form extends SiteBill {
либо на 
 
class Local_Kvartira_Search_Form extends Kvartira_Search_Form {
Родитель не важен, поскольку вы будете переопределять единственный доступный метод класса. Но я бы советовал наследовать от Kvartira_Search_Form  поскольку возможно, что в Kvartira_Search_Form  будут добавляться новые фичи.
 
Метод 
 
function __construct() {
        $this->SiteBill();
    }
 
оставляете.
 
Сердце поиска - функция main().
В нем определена генерация элементов.
 

Примерно вот так будет выглядеть ваш генератор

$this->template->assert('shosse_list', $form_generator->get_single_select_box_by_query($kvartira_model['data']['shosse_id']));

Этой строкой необходимо дополнить код функции main().

 

Единственное, что вот тут $kvartira_model['data']['shosse_id'] вместо shosse_id должно стоять системное имя вашего поля, в котором хранится ид шоссе, из модели таблицы data.

 

После этого переходим к контроллеру шаблона \template\frontend\имя_шаблона\main\main.php

 

и ищем в нем строки

 

require_once(SITEBILL_DOCUMENT_ROOT.'/apps/system/lib/frontend/search/kvartira_search.php');$kvartira_search_form = new Kvartira_Search_Form();$kvartira_search_form->main();

Это инициализация формы поиска. Так как у вас уже локальный файл, а не базовы, то заменяем это все на 

require_once(SITEBILL_DOCUMENT_ROOT.'/apps/system/lib/frontend/search/kvartira_search.php');require_once(SITEBILL_DOCUMENT_ROOT.'/template/frontend/'.$this->getConfigValue('theme').'/main/search/local_kvartira_search.php');$kvartira_search_form = new Local_Kvartira_Search_Form();$kvartira_search_form->main();

т.е. инициализируем локальный поиск.

 

Вот после этого можем в шаблон формы поиска вставлять {$shosse_list}

 

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

 

 

Здравствуйте, я проделал все данные инструкции, в стандартной форме поиска теперь имеются созданные мной поля, но беда в том, что не происходит фильтрация объявлений. Добавил параметр поиска - "Удалённость от моря", по природе своей в data  - это селектбокс с 6-тью значениями. И в поисковике точно так же хочу сделать поиск по 6ти значениям, что по сути и получилось, только резултата нет. Что делать? как поправить? как заставить поиск работать?

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


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

Что делать? как поправить? как заставить поиск работать?

 

Мне нужно увидеть код, что бы сказать что-то определенное.

Контакты в профиле.

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


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

Добрый день!

 

Просмотрев эту тему, прихожу к мнению, что сделать поиск в Realia \  slider  сложно будет....

Необходимо для работы, чтобы после выбора Типа недвижимости ниже в поиске появлялись нужные поля.

 

Например, для Квартиры, ниже появляется выбор по   Район, количество комнат (чек-боксами), общая площадь, площадь кухни, Срок сдачи, цена

для Домовладения и Таунхаусы, ниже будет                 Район, площадь участка (от и до), общая площадь, цена,

для Участки, ниже параметры поиска:                            Район, площадь участка, цена,

для Коммерческих помещений, поиск:                           Район, назначение, площадь участка, общая площадь, цена.

 

А мебель и телефон убрать...

 

Вопрос: можно это сделать самому? Есть какая-то подробная инструкция?

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


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

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

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

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

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

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

Войти

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

Войти сейчас