koreshok

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

Recommended Posts

а реально ли оставить поиск только на странице категорий, а с главной убрать?

 

Да.

Для это надо дать знать шаблону по какому признаку определяется главная ли страница и в шаблоне по этому признаку не подключать шаблон с кодом формы поиска.

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


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

Да.

Для это надо дать знать шаблону по какому признаку определяется главная ли страница и в шаблоне по этому признаку не подключать шаблон с кодом формы поиска.

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

делал такое на DLE, но там все проще, через [aviable main]

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


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

Это вопрос даже не технический, а логический.

Можно просто разбирать переменную $_SERVER['REQUEST_URI'] и если она не имеет вида site.ru/seo_alias/another_part/ или site.ru/something.html считать, что это главная. тут надо просто пройтись по сайту и посмтреть, что творится с адресами в строке браузера, что бы более-менее четко определиться.

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


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

Если наладите вывод, напишите, я напишу лекцию о том, как обрабатывать эти "ручнодобавленные" переменные.

очень хотелось бы продолжение банкета :)

вывод есть, в GET передаётся.

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


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

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

делал такое на DLE, но там все проще, через [aviable main]

В Smarty для этого есть зарезервированная переменная http://www.etown.ru/s/topic/633-добавление-в-шаблонный-файл-php-кода/#entry5909

Можно создать условие для любой страницы сайта.

А проверочное условие для главной ещё проще: {if $geodata_on_home}код{/if}

Ну, или  {if !$geodata_on_home}код{/if} если материал на главной не нужен.

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


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

Если наладите вывод, напишите, я напишу лекцию о том, как обрабатывать эти "ручнодобавленные" переменные.

Вроде сделал всё, как предписано, но селект появился в форме без опшенов, пустой.

И как насчёт продолжения...

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


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

Ну так как, настроил кто-нибудь поиск в стандартной форме с дополнительными полями? Поделитесь...

Первую часть с добавлением поля в форму поиска сделал. Как теперь инициировать поиск по этому полю?

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


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

если все сделать по инструкции написанной на 1 странице то все подключантся и работает 

http://realtyluga.ru/  в поиске раздел населенный пункт

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


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

я так поминаю, что вы создавали  дополнительный справочник… для функционирования поиска это обязательно? вроде без справочника не работает поиск (у меня в выпадающем списке 3-4 неизменяемых значения, справочник мне не нужен)

и кроме того у меня в поиске будут чекбоксы.

и ещё меня интригует обещание 

abushyk

Если наладите вывод, напишите, я напишу лекцию о том, как обрабатывать эти "ручнодобавленные" переменные.

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


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

 

я так поминаю, что вы создавали  дополнительный справочник… для функционирования поиска это обязательно? вроде без справочника не работает поиск (у меня в выпадающем списке 3-4 неизменяемых значения, справочник мне не нужен)

и кроме того у меня в поиске будут чекбоксы.

и ещё меня интригует обещание 

abushyk

 

если вы хотите выбирать как в том случае (где много деревень) то лучше делать справочник, если 1-5 параметров то можно select_box, ну а с чекбоксами попроще. Делаем проверку нажаты они в админке или нет.

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


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

Итак, мы имеем набор полей:

 

is_wifi Наличие интернета - поле типа checkbox. На форме присутствует в сиде чекбокса.

floor_type Тип покрытия пола - select_box с вариантами {0~~не указано}{1~~плитка}{2~~дерево}{3~~ламинат} - отображается в виде выпадающего списка

sea_distance Расстояние до моря. Тип safe_string, но отмеченный как is_ranged=1, что бы в форме поиска выводилось в виде двух полей - макс. и мин. значения.

 

Мы добавили эти поля в модель, каким-то образом разместили их на формах поиска. Теперь главная задача - заставить движек обработать их.

Для этого существует файл шаблонного поиска, который размещается в /template/frontend/имя_шаблона/main/ и носит имя template_search.php и не иначе.

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

В минимальной комплектации этот файл состоит из класса и двух функций:

http://pastebin.com/TmBSS9q8

 

Задача функции getParams забрать данные из запроса и подумать, стоит ли их передавать дальше.

А функции run, к которой обращается движек за данными, решить каким образом следует сравнить\обработать полученные параметры для формирования нужной выборки данных.

 

Итак, поехали.

1

Начнем с самого простого - чекбокса is_wifi. Чекбоксы отличаются тем, что в запросе они либо приходят, либо нет.

Из запроса берем его функцией $this->getRequestValue('is_wifi'), которая возвращает значение NULL, если такого параметра не существует.

if(NULL!==$this->getRequestValue('is_wifi')){

$params['is_wifi'] = 1;

}

 

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

 

Дальше floor_type. Этот тип передается в запрос в виде ключа своих значений. Т.е. выбрав "дерево" в запрос у нас приедет "2". Значит мы знаем, что будет целая цифра.

if(0!==(int)$this->getRequestValue('floor_type')){

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

}

 

Мы гарантированно делаем из значения параметра целое число с помощью (int) и сравниваем его с 0 - нашим значением никакого значения. Если оно не равно нулю, значит пользователь запросил конкретный тип покрытия и мы сохраняем его значение в $params['floor_type']. Но сохраняем уже конкретным начением, таккак, в отличии от чекбокса, тут нам важно само значение, а не его наличие.

 

sea_distance. При использовании пользовательских форм, которые енерирует движек на основе ваших выборок это поле представится в виде двух полей с именами созданными по принципу sea_distance_min и sea_distance_max. Соотв. и дву переменные прийдут в запросе. Каждую ловим отдельно.

Для простоты допустим, что мы готовы обработать целые расстояния до моря: 1, 5, 100.

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');

}

Принцип прост. Мы приводим значение к целому. Если пользователь вписал в поле не число, а "аврцуоац" строку, она приведется к нулю. И сравниваем все это с нулем. Искать по нулевому значению смысла нет, поэтому мы сохраняем только те значения, которые от него отличны. Разницы между мин и макс значением в момент их забора из запроса мы не делаем. Она не важна сейчас, но будет важна в следующей функции.

 

2

Переходим к функции run()

 

Методика ее работы такая

1. взять параметр

2. создать кусочек запроса.

 

Для чекбокса

if(isset($params['is_wifi']) && isset($data_model_array['is_wifi'])){
$where_array[]=DB_PREFIX.'_data.is_wifi=1';
}
Расшифровка. Проверяем, есть ли в параметрах запроса переменная is_wifi  и есть ли в нашей модели поле с таким именем (так как условие может быть, а поле мы давно погасили за ненадобностью). Если все эти условия выполнены, мы указываем, что хотим дополнить условия нашего запроса сравнением, которое выберет записи, где is_wifi равно1, т.е. при сохранении записи был отмечен чекбокс.
 
Для floor_type
if(isset($params['floor_type']) && isset($data_model_array['floor_type'])){
$where_array[]=DB_PREFIX.'_data.floor_type='.$params['floor_type'];
}

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

 

Для ранжированного sea_distance

if(isset($params['sea_distance_min']) && isset($data_model_array['sea_distance'])){
$where_array[]=DB_PREFIX.'_data.sea_distance*1>='.$params['sea_distance_min'];
}
if(isset($params['sea_distance_max']) && isset($data_model_array['sea_distance'])){
$where_array[]=DB_PREFIX.'_data.sea_distance*1<='.$params['sea_distance_max'];
}

И тут почти без изменений. Главное отличие - мы устанавливаем условия в зависимости от того _max или _min параметр мы хотим сравнить. Обратите внимание на DB_PREFIX.'_data.sea_distance*1. В неоптимизированных БД сайтбилля поля под safe_string имеют строковой тип. Поэтому, что бы не было строкового сравнения, где строковое "2" больше строкового "100", мы принудительно делаем значение поля числом перед сравнением. И тогда уже будет натуральное сравнение, где 2<100.

 

и вот примерно вот так http://pastebin.com/8jX7WEEH все єто будет выглядеть в конце.

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


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

Спасибо. Но я же немного по-другому сделал.

Правил файлы:

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

apps/system/lib/admin/data/data_manager.php

apps/system/lib/sitebill_krascap.php

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

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

Видимо это не очень хороший способ с точки зрения обновления движка....

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


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

Видимо это не очень хороший способ с точки зрения обновления движка....

 

Если уж быть точным - это очень не хороший способ с точки зрения обновления.

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


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

Здравствуйте. Не подскажите, что нужно прописывать для подключения select_box в шаблон standart_search_form.tpl ?  :) 
В template_search.php уже всё прописано. 

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


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

1. Создаем в папке шаблона файл

/template/fronend/имяшаблона/main/search/local_kvartira_search.php

c содержимым

<?phpclass Local_Kvartira_Search_Form extends Kvartira_Search_Form {    
function main () 
{        
parent::main();    
}
}

2. После parent::main(); дополняем

$data_model = new Data_Model();
$kvartira_model = $data_model->get_kvartira_model(true);
$this->template->assert('sale_type_list', $form_generator->get_select_box($kvartira_model['data']['sale_type']));
где sale_type_list - некая метка, по которой вы будете выводить ваш элемент в шаблоне
sale_type - это системное имя элемента, который вы хотите нарисовать
 
3. В /template/frontend/имяшаблона/standart_search_form.tpl в нужных местах расставляем вывод элемента 
{$sale_type_list}

4. В /template/frontend/имяшаблона/main/main.php находим 

$kvartira_search_form = new Kvartira_Search_Form();

и заменяем на 

require_once(SITEBILL_DOCUMENT_ROOT.'/template/frontend/имяшаблона/main/search/local_kvartira_search.php');
$kvartira_search_form = new Local_Kvartira_Search_Form();

После этих манипуляций должно работать.

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


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

 

1. Создаем в папке шаблона файл

/template/fronend/имяшаблона/main/search/local_kvartira_search.php

c содержимым

<?phpclass Local_Kvartira_Search_Form extends Kvartira_Search_Form {    function main () {        parent::main();    }}

2. После parent::main(); дополняем

$data_model = new Data_Model();
$kvartira_model = $data_model->get_kvartira_model(true);
$this->template->assert('sale_type_list', $form_generator->get_select_box($kvartira_model['data']['sale_type']));
где sale_type_list - некая метка, по которой вы будете выводить ваш элемент в шаблоне
sale_type - это системное имя элемента, который вы хотите нарисовать
 
3. В /template/frontend/имяшаблона/standart_search_form.tpl в нужных местах расставляем вывод элемента 
{$sale_type_list}

4. В /template/frontend/имяшаблона/main/main.php находим 

$kvartira_search_form = new Kvartira_Search_Form();

и заменяем на 

require_once(SITEBILL_DOCUMENT_ROOT.'/template/frontend/имяшаблона/main/search/local_kvartira_search.php');$kvartira_search_form = new Local_Kvartira_Search_Form();

После этих манипуляций должно работать.

 

Call to a member function get_select_box() on a non-object in Z:\home\test\www\template\frontend\realia\main\search\local_kvartira_search.php on line 7

post-2092-0-80955300-1405539831_thumb.pn

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


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

Ай, пардон.

Пункт 2.

После parent::main(); дополняем

$data_model = new Data_Model();$kvartira_model = $data_model->get_kvartira_model(true);$form_generator = new Form_Generator();$this->template->assert('sale_type_list', $form_generator->get_select_box($kvartira_model['data']['sale_type']));

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


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

 

Ай, пардон.

Пункт 2.

После parent::main(); дополняем

$data_model = new Data_Model();$kvartira_model = $data_model->get_kvartira_model(true);$form_generator = new Form_Generator();$this->template->assert('sale_type_list', $form_generator->get_select_box($kvartira_model['data']['sale_type']));

 

О, заработало. Большое спасибо. :)

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


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

Сейчас проверил и оказалось,что поиск не фильтрует по select_box'у,который я добавил. В чем может быть проблема? :(

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


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

Сейчас проверил и оказалось,что поиск не фильтрует по select_box'у,который я добавил. В чем может быть проблема? :(

 

Скорее всего в template_search.php не совсем верные условия. Нужно посмотреть, как вы там обрабатываете переменную.

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


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

Скорее всего в template_search.php не совсем верные условия. Нужно посмотреть, как вы там обрабатываете переменную.

Уже сам исправил.  :)

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


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

Т.к. в Php я не силён (буду исправляться), делал всё по анологии написанному.

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

 

1) Скопировал в папку шаблона /template/frontend/имя_шаблона/main/search/ файл kvartira_search.php и переименовал его на local_kvartira_search.php, куда в function main () вписал эту строчку:

$this->template->assert('daily_rent_list', $form_generator->get_checkbox($kvartira_model['data']['daily_rent_id']));

там же заменил строку

class Kvartira_Search_Form extends SiteBill {

на

class Local_Kvartira_Search_Form extends Kvartira_Search_Form {

P.S. C созданием полностью нового local_kvartira_search.php, как написано здесь http://www.etown.ru/s/topic/241-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%BD%D0%BE%D0%B2%D1%8B%D0%B5-%D0%BF%D0%BE%D0%BB%D1%8F-%D0%B2-%D0%BF%D0%BE%D0%B8%D1%81%D0%BA/page-3#entry7481 (с исправлениями), у меня не заработало

 

2) Заменил в \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();

3) В /template/frontend/имя_шаблона/main/, в файле template_search.php прописал так:

<?phpclass Template_Search extends SiteBill {    public function getParams(){        //тут мы собираем параметры                if(NULL!==$this->getRequestValue('daily_rent')){                        $params['daily_rent'] = 1;                }        return $params;    }    public function run(){                $ret=array(                        'where'=>array(),                        'params'=>array()                              );                $params=$this->getParams();                if(empty($params)){                        return $ret;                }                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'];                 $where_array=array();               //начинаем обрабатывать                 if(isset($params['daily_rent']) && isset($data_model_array['daily_rent'])){                        $where_array[]=DB_PREFIX.'_data.daily_rent=1';                }	      //отдаем в механизм компоновки запроса                return array(                        'where'=>$where_array,                        'params'=>$params                              );        }}

4) В stsandart_search_form.tpl вывел пока таким образом:

<tr>  <label class="control-label" for="inputType">                    Снять посуточно                </label><td>{$L_daily_rent}</td><td><div class="select_box_td"><input type="checkbox" name="daily_rent"{if isset($smarty.request.daily_rent)} checked="checked"{/if} value="1" /></div></td></tr><br>

P.S. так почему-то не заработало:

{$daily_rent_list}

Отсуда вопрос: чем отличаются эти две вставки?

 

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

 

Ещё один минус именно этой схемы, что если пользователь трогает ползунок по-умолчанию с "Ценой" и ставит чекбокс "Снять посуточно" => Ничего не удаётся найти по этому запросу

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


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

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']));}}

3. Тут все верно

4. В шаблон выводится так

В {$daily_rent_list} лежит уже готовый чекбокс (<input... />). Нужно только вставить в нужное место.

То, что вывели вы - это как раз вариант без привлечения Local_Kvartira_Search_Form.

 

 

Ещё один минус именно этой схемы, что если пользователь трогает ползунок по-умолчанию с "Ценой" и ставит чекбокс "Снять посуточно" => Ничего не удаётся найти по этому запросу

 

Это не зависит от схемы. Тронули ползунок - сменили лимиты цен - наложилось новое условие фильтрации.

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


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

Спасибо!

Если нет надобности наследовать целый Kvartira_Search_Form, так как лучше и проще сделать? У меня всё сейчас висит в Notepad++ => всё быстро обратимо! Просто, в будущем я думал ещё вводить другие поля для поиска, такие как тот же WiFi, наличие кондиционера, расстояния до моря и т.п.))) Поэтому и зацепил его сразу! А пока, так сказать, потренеровался на Посуточной Аренде))

Изменено пользователем YUR@

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


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

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

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

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

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

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

Войти

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

Войти сейчас