abushyk 694 Жалоба Опубликовано: October 17, 2013 Ну да. пока я писал, вы сами додумались) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
abushyk 694 Жалоба Опубликовано: October 17, 2013 а реально ли оставить поиск только на странице категорий, а с главной убрать? Да.Для это надо дать знать шаблону по какому признаку определяется главная ли страница и в шаблоне по этому признаку не подключать шаблон с кодом формы поиска. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
koreshok 0 Жалоба Опубликовано: October 17, 2013 Да.Для это надо дать знать шаблону по какому признаку определяется главная ли страница и в шаблоне по этому признаку не подключать шаблон с кодом формы поиска.вот тут для меня немного сложновато.. только познаю азы...делал такое на DLE, но там все проще, через [aviable main] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
abushyk 694 Жалоба Опубликовано: October 17, 2013 Это вопрос даже не технический, а логический.Можно просто разбирать переменную $_SERVER['REQUEST_URI'] и если она не имеет вида site.ru/seo_alias/another_part/ или site.ru/something.html считать, что это главная. тут надо просто пройтись по сайту и посмтреть, что творится с адресами в строке браузера, что бы более-менее четко определиться. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
XTRO 154 Жалоба Опубликовано: March 10, 2014 Если наладите вывод, напишите, я напишу лекцию о том, как обрабатывать эти "ручнодобавленные" переменные.очень хотелось бы продолжение банкета вывод есть, в GET передаётся. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
alex-boa 0 Жалоба Опубликовано: March 27, 2014 вот тут для меня немного сложновато.. только познаю азы...делал такое на DLE, но там все проще, через [aviable main]В Smarty для этого есть зарезервированная переменная http://www.etown.ru/s/topic/633-добавление-в-шаблонный-файл-php-кода/#entry5909Можно создать условие для любой страницы сайта.А проверочное условие для главной ещё проще: {if $geodata_on_home}код{/if}Ну, или {if !$geodata_on_home}код{/if} если материал на главной не нужен. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
alex-boa 0 Жалоба Опубликовано: March 27, 2014 Если наладите вывод, напишите, я напишу лекцию о том, как обрабатывать эти "ручнодобавленные" переменные.Вроде сделал всё, как предписано, но селект появился в форме без опшенов, пустой.И как насчёт продолжения... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
alex-boa 0 Жалоба Опубликовано: April 9, 2014 Ну так как, настроил кто-нибудь поиск в стандартной форме с дополнительными полями? Поделитесь...Первую часть с добавлением поля в форму поиска сделал. Как теперь инициировать поиск по этому полю? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
TopRaN 235 Жалоба Опубликовано: April 9, 2014 если все сделать по инструкции написанной на 1 странице то все подключантся и работает http://realtyluga.ru/ в поиске раздел населенный пункт Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
alex-boa 0 Жалоба Опубликовано: April 9, 2014 я так поминаю, что вы создавали дополнительный справочник… для функционирования поиска это обязательно? вроде без справочника не работает поиск (у меня в выпадающем списке 3-4 неизменяемых значения, справочник мне не нужен)и кроме того у меня в поиске будут чекбоксы.и ещё меня интригует обещание abushykЕсли наладите вывод, напишите, я напишу лекцию о том, как обрабатывать эти "ручнодобавленные" переменные. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
TopRaN 235 Жалоба Опубликовано: April 9, 2014 я так поминаю, что вы создавали дополнительный справочник… для функционирования поиска это обязательно? вроде без справочника не работает поиск (у меня в выпадающем списке 3-4 неизменяемых значения, справочник мне не нужен)и кроме того у меня в поиске будут чекбоксы.и ещё меня интригует обещание abushyk если вы хотите выбирать как в том случае (где много деревень) то лучше делать справочник, если 1-5 параметров то можно select_box, ну а с чекбоксами попроще. Делаем проверку нажаты они в админке или нет. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
abushyk 694 Жалоба Опубликовано: April 11, 2014 Итак, мы имеем набор полей: 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_typeif(isset($params['floor_type']) && isset($data_model_array['floor_type'])){$where_array[]=DB_PREFIX.'_data.floor_type='.$params['floor_type'];}Все аналогично предыдущему за исключением того, что тут мы просим сравнить поле floor_type записи, которое хранит ключ указанного типа покрытия, с переданным в запросе. Для ранжированного sea_distanceif(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 все єто будет выглядеть в конце. 3 YUR@, Дмитрий Кондин и XTRO reacted to this Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
alex-boa 0 Жалоба Опубликовано: June 11, 2014 Спасибо. Но я же немного по-другому сделал.Правил файлы:apps/system/lib/frontend/grid/front_grid_constructor.phpapps/system/lib/admin/data/data_manager.phpapps/system/lib/sitebill_krascap.phpapps/system/lib/frontend/grid/grid_constructor.phpЕсли интересно подробнее, могу описать, но там итак понятно, если посмотреть аналогию с уже имеющимися с поиске чекбоксами и выпадающими списками.Видимо это не очень хороший способ с точки зрения обновления движка.... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
abushyk 694 Жалоба Опубликовано: June 11, 2014 Видимо это не очень хороший способ с точки зрения обновления движка.... Если уж быть точным - это очень не хороший способ с точки зрения обновления. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
PrimeTeam 0 Жалоба Опубликовано: July 16, 2014 Здравствуйте. Не подскажите, что нужно прописывать для подключения select_box в шаблон standart_search_form.tpl ? В template_search.php уже всё прописано. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
abushyk 694 Жалоба Опубликовано: July 16, 2014 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(); После этих манипуляций должно работать. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
PrimeTeam 0 Жалоба Опубликовано: July 16, 2014 1. Создаем в папке шаблона файл/template/fronend/имяшаблона/main/search/local_kvartira_search.phpc содержимым<?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 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
abushyk 694 Жалоба Опубликовано: July 16, 2014 Ай, пардон.Пункт 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'])); Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
PrimeTeam 0 Жалоба Опубликовано: July 16, 2014 Ай, пардон.Пункт 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'])); О, заработало. Большое спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
PrimeTeam 0 Жалоба Опубликовано: July 17, 2014 Сейчас проверил и оказалось,что поиск не фильтрует по select_box'у,который я добавил. В чем может быть проблема? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
abushyk 694 Жалоба Опубликовано: July 17, 2014 Сейчас проверил и оказалось,что поиск не фильтрует по select_box'у,который я добавил. В чем может быть проблема? Скорее всего в template_search.php не совсем верные условия. Нужно посмотреть, как вы там обрабатываете переменную. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
PrimeTeam 0 Жалоба Опубликовано: July 17, 2014 Скорее всего в template_search.php не совсем верные условия. Нужно посмотреть, как вы там обрабатываете переменную.Уже сам исправил. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
YUR@ 3 Жалоба Опубликовано: July 25, 2014 Т.к. в 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.phprequire_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}Отсуда вопрос: чем отличаются эти две вставки? В итоге, вроде, всё работает, но как-то медленней, чем уже существующие чекбоксы... Возможно, что где-то что-то у меня не правильно. Поправьте пожалуйста... Ещё один минус именно этой схемы, что если пользователь трогает ползунок по-умолчанию с "Ценой" и ставит чекбокс "Снять посуточно" => Ничего не удаётся найти по этому запросу Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
abushyk 694 Жалоба Опубликовано: July 25, 2014 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. Ещё один минус именно этой схемы, что если пользователь трогает ползунок по-умолчанию с "Ценой" и ставит чекбокс "Снять посуточно" => Ничего не удаётся найти по этому запросу Это не зависит от схемы. Тронули ползунок - сменили лимиты цен - наложилось новое условие фильтрации. 1 YUR@ reacted to this Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
YUR@ 3 Жалоба Опубликовано: July 25, 2014 (изменено) Спасибо!Если нет надобности наследовать целый Kvartira_Search_Form, так как лучше и проще сделать? У меня всё сейчас висит в Notepad++ => всё быстро обратимо! Просто, в будущем я думал ещё вводить другие поля для поиска, такие как тот же WiFi, наличие кондиционера, расстояния до моря и т.п.))) Поэтому и зацепил его сразу! А пока, так сказать, потренеровался на Посуточной Аренде)) Изменено July 25, 2014 пользователем YUR@ Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах