Sharovchic

Поиск во вкладках (добавление новых параметров)

Recommended Posts

Создал форму поиска "Аренда". В редакторе форм поправил поле "кол-во комнат" сделал его типа селектбокс прописал {0~~ выбрать значение}{1~~1}{2~~2}{3~~3}{4~~4 и больше} Не работает во вкладках "Аренда" " Продажа" короче, во всех вкладках. Только когда переходишь во вкладку  "Все" - так отмечен чекбокс с тем вариантом, что ты выбрал! Допустим, во вкладке выбрал двухкомнатную квартиру, результат поиска - 0 или выдает ВСЕ КВАРТИРЫ 1,2,3 по фиг. Переходишь во вкладку "Все" - там чекбокс уже отмечен на цифре 2. Нажимаешь - и там Поиск идет как по маслу! как исправить это безобразие?! Кстати, многие поля из созданных почему-то не работают во вкладках поиска. Этажность, смежные или раздельные комнаты, планировка. Отчего это?

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


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

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

Для решения таких ситуаций, когда частные поля добавлены, но встроенный поиск их не охватывает существует решение http://wiki.sitebill.ru/index.php?title=%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0

Это механизм внедрения в поиск пользовательских элементов.

Ознакомьтесь со справочной страницей и запустите поиск по форуму по словам Template_Search.

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

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


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

То есть, при создании  в админ панели поисковых форм в редакторе форм параметры поиска добавляются лишь для красоты что ли? Если они кроме 2-3 не работают? Ведь не работает основное!!

 

Прочитал мат часть, понял только что нужно создать еще  один search.php файл, но вот что прописывать в нем, хотя бы для поиска по количеству комнат - это, согласитесь, очень существенно! Системное имя переменной room_count Куда и как его нужно прописать, напишите пожалуйста! 

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


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

Сразу важное замечание. Для элементов типа select_box крайне рекомендуется избегать ключей в виде строк.

Т.е. не делать так {20 и выше~~20 и выше}

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


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

Как быстро починить поиск по комнатам.

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

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

Просто ищем через поиск вот такую строку

 if(isset($params['room_count'])){

Она знаменует блок кода, который заканчивается

 

else{     unset($params['room_count']);     }

Берем весь этот блок и заменяем его на

 

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

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


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

Чет у меня не работает. Все сделал как написано, и не работает.

Вообще поиск во вкладках работает странно: Нужно найти например, все предметы аренды, а уж затем в них ускать нужное по параметрам. Если сразу переключиться во вкладку и задать параметры какие-либо, то результат поиска - 0 !!!! Отчего так? Может, у меня сайт какой-то кривой? Я Дмитрию Кондину в Аську писал, у меня обновление на сайте какое-то кривое: сколько не обновляйся будет вот так - http://firepic.org/?v=3.2014-01-14_p79od3vzbtiu.jpg

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


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

В вашем случае сбоит поле optype (Вид недвижимости), как мне кажется на первый взгляд. Дело в том, что поле с именем optype используется самим движком для идентификации типа сделки - того, что вы вынесли в структуру. Но, для поддержки старых версий, движек неявно считает, что значение поля optype равное нулю не означает отсутствие значения по этому полю, а ищет по нему, потому что в старых версиях optype ==0 было эквивалентно операции Продажа.

Попробуйте убрать, временно, это поле из закладки поиска.

А в дальнейшем это поле стоит переименовать в модели и, соответственно, в БД.

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


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

Да, переименовал optype в другое значение, сбоить перестало, но и искать тоже. Эх, фигня полная с этим поиском! А что все же делать с поиском по количеству комнат? Это-то как починить? Или нужно прописывать локальный в search.php?

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


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

Извиняюсь поиск по комнатам заработал. Нужно было просто права выставить при перезаписи файла. Это уж мой косяк. А вот с полем " вид недвижимости" все равно не получается. Сделал  template_search.php прописал:  

<?php
class Template_Search extends SiteBill {
    public function getParams(){
        $params=array();
        if(''!==$this->getRequestValue('select_id')){
    $params['select_id'] = (int)$this->getRequestValue('select_id');
}
        return $params;
    }
    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['select_id']) && isset($data_model_array['select_id'])){
    $where_array[]=DB_PREFIX.'_data.select_id='.$params['select_id'];
}
        return array(
            'where'=>$where_array,
            'params'=>$params
        );
    }
}
 
где select_id -  системное название вкладки "вид недвижимости". Результат по поиску всегда 0! 

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


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

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

У него есть значимые значения и пустое - (0 = выберите значение). Т.е. если вы даже не выбрали ничего в поле Вид недвижимости в форму все равно уходит первичное значение select_id=0. Это значение нужно отсеять.

В getParams где вы проводите первую фильтрацию

if(0!==(int)$this->getRequestValue('select_id')){        $params['select_id'] = (int)$this->getRequestValue('select_id');}else{    unset($params['select_id'])}

Человеческим словами - если в параметрах запроса есть select_id и его числовое значение не равно 0, то передаем его в формировщик кусочков условий выбора в виде числа. Если же нет, то удаляем его из набора параметров, что бы не мусорил.

А в run уже правильно - если параметр пришел (значит он уже не ноль!) и есть такое поле в модели (вдруг вы его удалите в Редакторе, а эот файл не измените) то применяем некое условие к запросу.

 

===================ъ

 

Далее.

1) Я смотрю на сайт и вижу, что поле optype и далее присутствует в виде селектбокса Вид недвижимости.

2) После того, как вы смените имя поля optype на select_id в модели через Редактор Форм обязательно переименуйте колонку optype в select_id в таблице re_data в базе данных.

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


Ссылка на сообщение
Поделиться на других сайтах
if(0!==(int)$this->getRequestValue('select_id')){   

$params

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

}else{

unset($params['select_id'])

}

 

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

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


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

все поправил. Но теперь: при  0 значении ( выберите значение)  ищет всю недвижимость, скажем, во вкладке "Продажа", если ставлю значение "квартира" результат 0 - по остальным тоже самое! Вот скрин БД там две вкладки: и optype и select_id

http://firepic.org/images/2014-01/16/0nfh879tezp5.jpg

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


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

Чудесно! Все заработало. Просто пришлось во ВСЕХ Объявлениях заново выставить вид недвижимости. :D  ОН сбился на значение " 0" - " выберите значение"

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


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

Он не сбился. Смотрите, при создании поля модели через Редактор таблиц в таблице БД создается новая колонка. Но если вы переименовываете это поле в редакторе форм, то колонка в таблице БД не переименовывается вместе с ним, а просто создается новая с новым именем. А старая остается как резервное.

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


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

Хотел поставить в template.search.php еще несколько значений для поиска. Поставил второе: izolir 

 

<?php
class Template_Search extends SiteBill {
    public function getParams(){
        $params=array();
        if(0!==(int)$this->getRequestValue('select_id')){    
    $params['select_id'] = (int)$this->getRequestValue('select_id');
}else{
    unset($params['select_id']);
}
if(0!==(int)$this->getRequestValue('izolir')){    
    $params['izolir'] = (int)$this->getRequestValue('izolir');
}else{
    unset($params['izolir']);
}
 
        return $params;
    }
    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['select_id']) && isset($data_model_array['select_id'])){
    $where_array[]=DB_PREFIX.'_data.select_id='.$params['select_id'];
 
        if(isset($params['izolir']) && isset($data_model_array['izolir'])){
    $where_array[]=DB_PREFIX.'_data.izolir='.$params['izolir'];
       
}
        return array(
            'where'=>$where_array,
            'params'=>$params
        );
    }
}
 
Получил вместо сайта белый экран. Что не так сделал?

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


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

Если это все содержимое файла, то, навскидку, скушали закрывающую фигурную скобку после 

$where_array[]=DB_PREFIX.'_data.select_id='.$params['select_id'];

Попробуйте заменить этим http://pastebin.com/g2YQRTjg

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


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

Добрый день!

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

Приведите пожалуйста пример для поля "Телефон" (is_telephone), тип записи я сделал select_box, в наборе опций прописал {0~~неважно}{1~~есть}{2~~нет}

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

 

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

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


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

Вот базовый файл для организации поиска http://pastebin.com/dYmUkjC1

имя его должно быть template_search.php и располагаться он должен по адресу /template/frontend/имя_вашего_шаблона/main/template_search.php

 

Обработка состоит из двух этапов.

1. Перехват параметра.

строки 6-8

Вы ловите переменную из запроса, проверяете имеет ли она значение. Так как пустое и нулевое значение вас не интересует, вы апоминаете только отличные от нуля.

2. Обработка параметра.

строки 28-30

Вы берете запомненные переменные и проверяете есть ли такие в ващей модели. Если есть, вы формируете кусочек запроса, который укажет в каком поле базы данных искать это значение. Для параметра is_telephone это будет соттв. поле is_telephone .

 

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

 

Для обработки поля Интернет с такими же параметрами вы делаете дубль строк 6-8 и 28-30 после существующих и меняете имя обрабатываемого параметра с is_telephone на is_internet или как у вас будет системное имя данного поля.

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


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

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

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

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

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

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

Войти

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

Войти сейчас