Вывод результатов поиска по разделу и по определенному шаблону
Материал из Umicms
Иногда встречаются сайты, содержащие два или несколько разделов, принципиально отличающихся по дизайну. То есть фактически это несколько подсайтов в одном. При этом возникает задача разграничить поиск на сайте по имеющимся разделам. То есть, если мы ищем какие-либо слова на сайте, находясь в одном из разделов, то результаты поиска должны выдаваться в дизайне данного раздела и поиск должен происходить только по страницам этого раздела сайта. Рассмотрим задачу на примере сайта, содержащего два раздела: "Лето" и "Зима".
По умолчанию результаты поика выводятся по основному шаблону. Чтобы результаты выводились по разным шаблонам создадим страницы в структуре: /search_summer и /search_winter - на них мы будем отображать результаты. Соответственно, шаблоны дизайна будут идентичны шаблонам внутренних страниц разделов, за исключением макроса %search insert_form('search')%, который как правило присутствует в шаблонах внутренних станиц. Его необходимо исключить.
Чтобы система перенапррявляла на созданные страницы пишем кастомный макрос classes/modules/search/__custom.php
//TODO: Write your macroses here public function search_begin(){ $id = (int) getRequest('id'); if(!$id) return false; $hierarchy = umiHierarchy::getInstance(); $all_parent = $hierarchy->getAllParents($id); $get = getRequest('search_string'); if($all_parent[1] == 2){ $this->redirect('/search_summer' . '?search_string=' . $get . '&search_branches=2'); }else{ $this->redirect('/search_winter' . '?search_string=' . $get . '&search_branches=3'); } // 2 - id раздела "Лето" // 3 - id раздела "Зима" } };
В шаблоне tpls/search/search.tpl редактируем блок 'search_form':
<div class="search"> <form method="get" action="/search/search_begin/"> <input type="text" name="search_string" value="Поиск" onfocus="javascript: if(this.value == 'Поиск') this.value = ''" onblur="javascript: if(this.value == '';) {this.value = 'Поиск'}" /> <input type="hidden" value="%pid%" name="id"/> <input type="submit" value="" class="send"/> </form> </div>
В поле "Контент" на странице /search_summer прописываем макрос для вывода результатов поиска:
%search search_do('summer')%
Создаем шаблон tpls/search/summer.tpl
<?php $FORMS = Array(); $FORMS['search_block'] = <<<END %search insert_form('summer')% <p> <b>%search_founded_total1% %total% %search_founded_total%.</b> </p> %lines% %system numpages(%total%, %per_page%)% END; $FORMS['search_block_line'] = <<<END <p> <span class="s_num">%num%.</span> <a href='%link%' umi:element-id="%id%" umi:field-name="name">%name%</a> </p> END; $FORMS['search_empty_result'] = <<<END %search insert_form('summer')% <p> Извините. По данному запросу ничего не найдено. </p> END; $FORMS['search_form'] = <<<END <div class="search"> <form method="get" action="/search_summer/"> <input type="text" name="search_string" value="%last_search_string%" onfocus="javascript: if(this.value == '%last_search_string%') this.value = ''" onblur="javascript: if(this.value == '';) {this.value = '%last_search_string%'}" /> <input type="hidden" name="search_branches" value="2" /> <input type="submit" value="" class="send"/> </form> </div> END; ?>
Аналогичный шаблон необходимо создать и для других разделов сайта - в нашем случае это будет tpls/search/winter.tpl
