В данной статье мы рассмотрим пример макроса для поиска по сайту. У umi уже существует макросы для поиска: catalog search() — выводит фильтр по товарам и search search_do() — выводит результаты поиска по сайту. Наш макрос будет представлять из себя упрощенный вариант search search_do(). Он будет искать только по названию страниц, а также может быть ограничен определенным разделом или типом данных.
Мы будем демонстрировать пример, который работает с новой системой хранения шаблонов и новой системой расширения функционала. Все работы будут проводиться на демо сайте "demodizzy".
<?php class search_custom extends def_module {
//TODO: Write here your own macroses
public function simple_search_do($template = "default", $search_string = "", $per_page = 0, $path = NULL, $type_id = NULL, $type_module_name = NULL, $type_method_name = NULL) {
list(
$template_block, $template_line, $template_empty_result, $template_line_quant
) = self::loadTemplates("search/".$template,
"search_block", "search_block_line", "search_empty_result", "search_block_line_quant"
);
// поисковая фраза :
if (!$search_string) $search_string = (string) getRequest('search_string');
$block_arr = Array();
$block_arr['last_search_string'] = $search_string;
$search_string = urldecode($search_string);
$search_string = htmlspecialchars($search_string);
$search_string = str_replace(".", " ", $search_string);
$search_string = trim($search_string, " \t\r\n%");
$search_string = str_replace(array('"', "'"), "", $search_string);
if (!$search_string) return $this->insert_form($template);
$lines = Array();
$p = (int) getRequest('p');
if (!$per_page) $per_page = intval(getRequest('per_page'));
if (!$per_page) $per_page = $this->per_page;
$i = $per_page * $p;
$pages = new selector('pages');
// если запрошен поиск только по определенному типу
if($type_id){
if(!($type = umiObjectTypesCollection::getInstance()->getType($type_id))) trigger_error("Failed to load type", E_USER_WARNING);
$pages->types('object-type')->id($type_id);
}elseif($type_module_name && $type_method_name){
$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName($type_module_name, $type_method_name)->getId();
if($hierarchy_type_id) $pages->types('hierarchy-type')->name($type_module_name, $type_method_name);
}
// если запрошен поиск только по определенным подразделам
$arr_search_by_rels = array();
if (!$path) $path = (string) getRequest('search_branches');
$path = trim(rawurldecode($path));
if (strlen($path)) {
$arr_parents = preg_split("/[\s,]+/", $path);
foreach ($arr_parents as $parent_page) {
$parent_page_id = $this->analyzeRequiredPath($parent_page);
$pages->where('hierarchy')->page($parent_page_id)->childs(1000);
}
}
$pages->where('name')->like('%'.$search_string.'%');
$pages->limit($i, $per_page); // offset,limit
$total = $pages->length;
foreach($pages as $element) {
$line_arr = Array();
$element_id = $element->id;
$line_arr['void:num'] = ++$i;
$line_arr['attribute:id'] = $element_id;
$line_arr['attribute:name'] = $element->getName();
$line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($element_id);
$line_arr['xlink:href'] = "upage://" . $element_id;
$lines[] = def_module::parseTemplate($template_line, $line_arr, $element_id);
$this->pushEditable(false, false, $element_id);
umiHierarchy::getInstance()->unloadElement($element_id);
}
$block_arr['subnodes:items'] = $block_arr['void:lines'] = $lines;
$block_arr['total'] = $total;
$block_arr['per_page'] = $per_page;
return def_module::parseTemplate(($total > 0 ? $template_block : $template_empty_result), $block_arr);
}
};
?>
файл с макросом: /templates/demodizzy/classes/modules/search/permissions.php<?php
$permissions = Array(
'search' => Array('simple_search_do')
);
?>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet SYSTEM "ulang://i18n/constants.dtd:file">
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:umi="http://www.umi-cms.ru/TR/umi">
<xsl:template match="/result[@method = 'simple_search_do']">
<xsl:apply-templates select="document('udata://search/simple_search_do')" />
</xsl:template>
<xsl:template match="udata[@method = 'simple_search_do']">
<p>
<strong>
<xsl:text>&search-founded-left; "</xsl:text>
<xsl:value-of select="$search_string" />
<xsl:text>" &search-founded-nothing;.</xsl:text>
</strong>
</p>
</xsl:template>
<xsl:template match="udata[@method = 'simple_search_do' and items/item]">
<p>
<strong>
<xsl:text>&search-founded-left; "</xsl:text>
<xsl:value-of select="$search_string" />
<xsl:text>" &search-founded-right;: </xsl:text>
<xsl:value-of select="total" />
<xsl:text>.</xsl:text>
</strong>
</p>
<ul class="search">
<xsl:apply-templates select="items/item" mode="search-result" />
</ul>
<xsl:apply-templates select="total" />
</xsl:template>
<xsl:template match="item" mode="search-result">
<li>
<span>
<xsl:value-of select="($p*../../per_page) + position()" />.
</span>
<a href="{@link}">
<xsl:value-of select="@name" />
</a>
</li>
</xsl:template>
</xsl:stylesheet>
<form class="search" action="/search/simple_search_do/" method="get"> <input type="text" value="&search-default-text;" name="search_string" class="textinputs" onblur="javascript: if(this.value == '') this.value = '&search-default-text;';" onfocus="javascript: if(this.value == '&search-default-text;') this.value = '';" x-webkit-speech="" speech="" /> <input type="hidden" name="search_branches" value="51,49" /> <input type="submit" value="&search-default-text;" /> </form>