Как найти все страницы с похожим именем
Материал из Umicms
Версия от 15:58, 3 апреля 2014; Mad grant (обсуждение | вклад)
Актуально для версии 2.9.6
Содержание
Задача
Если Вы столкнулись с данной задачей, то решить её стандартными средствами нельзя. Необходимо написать кастомный макрос, пример оного дан ниже.
Решение
%custom getSimilarPages()% — выводит все возможные страницы контента(со всех сайтов и языковых версий) с похожим именем.
Параметры: custom getSimilarPages([$name = 'test', $template = 'default'])
$name
Имя страницы, с которым будет произведен поиск.
$template
Принимает имя шаблона, по которому выводится результат макроса, значение по-умолчанию 'default' В XSLT-шаблонизаторе не используется.
Для применения этого макроса скопируйте код макроса в файл /classes/modules/custom.php.
Код макроса
public function getSimilarPages($name = 'test', $template = 'default'){
list($items_template, $item_template, $empty_template) = def_module::loadTemplates('content/' . $template, 'items', 'item', 'empty');
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('content');
$pages->where('domain')->equals(false);
$pages->where('lang')->equals(false);
$pages->where('name')->ilike($name . '%');
$pages->order('id')->asc();
$total = $pages->length();
if($total == 0){
$empty = array();
$empty['request'] = $name;
return def_module::parseTemplate($empty_template, $empty);
}
$pages_arr = $pages->result();
$domains_col = domainsCollection::getInstance();
$langs_col = langsCollection::getInstance();
$item = array();
$items= array();
foreach($pages_arr as $page){
$item['attribute:id'] = $page->getId();
$item['attribute:name'] = $page->getName();
$item['attribute:link'] = $page->link;
$item['attribute:alt-name'] = $page->getAltName();
$item['attribute:domain'] = $domains_col->getDomain($page->getDomainId())->getHost();
$item['attribute:lang'] = $langs_col->getLang($page->getLangId())->getPrefix();
$items[] = def_module::parseTemplate($item_template, $item);
}
$items = array('subnodes:pages' => $items);
$items['total'] = $total;
return def_module::parseTemplate($items_template, $items);
}
Применение в xslt
Пример вызова
udata://custom/getSimilarPages/te
XML-ответ UData
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="custom" method="getSimilarPages" generation-time="0.037057">
<pages>
<item id="5391" name="test" link="/test/" alt-name="test" domain="domain_1.ru" lang="ru"/>
<item id="5392" name="test123" link="http://domain_2.ru/test123/" alt-name="test" domain="domain_2.ru" lang="ru"/>
<item id="5393" name="test2" link="/en/test2/" alt-name="test" domain="domain_1.ru" lang="en"/>
<item id="5394" name="test32" link="http://domain_2/en/test32/" alt-name="test" domain="domain_2.ru" lang="en"/>
</pages>
<total>4</total>
</udata>