Вывод результатов поиска по разделу и по определенному шаблону
Иногда встречаются сайты, содержащие два или несколько разделов, принципиально отличающихся по дизайну. То есть фактически это несколько подсайтов в одном. При этом возникает задача разграничить поиск на сайте по имеющимся разделам. То есть, если мы ищем какие-либо слова на сайте, находясь в одном из разделов, то результаты поиска должны выдаваться в дизайне данного раздела и поиск должен происходить только по страницам этого раздела сайта. Рассмотрим задачу на примере сайта, содержащего два раздела: "Лето" и "Зима".
По умолчанию результаты поика выводятся по основному шаблону. Чтобы результаты выводились по разным шаблонам создадим страницы в структуре: /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