Вывод результатов поиска по разделу и по определенному шаблону

Материал из 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