Как найти все страницы с похожим именем

Материал из Umicms
Версия от 08:39, 4 апреля 2014; Mad grant (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

Актуально для версии 2.9.6

Задача

У Вас есть необходимость прямо на странице реализовать переход на аналогичную страницу в другой языковой версии или на другом сайте, в рамках мультисайтовости. Если Вы столкнулись с данной задачей, то решить её стандартными средствами нельзя. Необходимо написать кастомный макрос, пример оного дан ниже.

Решение

%custom getSimilarPages()% — выводит все возможные страницы контента(со всех сайтов и языковых версий) с похожим именем.

Параметры: custom getSimilarPages($name = , [$template = 'default', $domain_id = false, $lang_id = false])

$name

  Имя страницы, с которым будет произведен поиск. Поиск производится по первому вхождению искомой строки.

$template

  Принимает имя шаблона, по которому выводится результат макроса, значение по-умолчанию 'default' В XSLT-шаблонизаторе не используется.

$domain_id

  Принимает id домена, на котором нужно искать страницы, можно указать несколько id через знак ";". По-умолчанию поиск проходит по всем доменам системы.

$lang_id

  Принимает id языка, на котором нужно искать страницы, можно указать несколько id через знак ";". По-умолчанию поиск проходит по всем языкам.

Для применения этого макроса скопируйте код макроса в файл /classes/modules/custom.php.

Код макроса

public function getSimilarPages($name = '', $template = 'default', $domain_id = false, $lang_id = false){
                    
	if($name == ''){
           return 'give me string to search';
	}
	
	list($items_template, $item_template, $empty_template) = def_module::loadTemplates('content/' . $template, 'items', 'item', 'empty');
	
	if($domain_id !== false){
           $domain_id = preg_replace('/\s/', '', $domain_id);		
	   $domain_id = explode(';', $domain_id);
	}
	
	if($lang_id !== false){
	   $lang_id = preg_replace('/\s/', '', $lang_id);		
           $lang_id = explode(';', $lang_id);
	}
	
	$pages = new selector('pages');
	$pages->types('hierarchy-type')->name('content');
	$pages->where('domain')->equals($domain_id);
	$pages->where('lang')->equals($lang_id);
	$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//1;2/1;2/

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="test2" domain="domain_1.ru" lang="en"/>
		<item id="5394" name="test32" link="http://domain_2/en/test32/" alt-name="test32" domain="domain_2.ru" lang="en"/>
	</pages>
	<total>4</total>
</udata>

Элементы и атрибуты

<pages>

   Ветвь, содержащая элементы item — страницы.

<item>

   Элемент, описывающий отдельную страницу.

@id

   Идентификатор страницы новости.

@link

   Ссылка на страницу полного текста новости.

@name

   Имя страницы.

@alt-name

   Псевдостатический адрес страницы.

@domain

   Домен сайта, на котором находится страница.

@lang

   Префикс языковой версии, на которой находится страница.   

<total>

   Количество найденных страниц.

Применение в tpl

Пример вызова макроса

%custom getSimilarPages('test', 'default')%

Используемые шаблоны

Макрос оперирует шаблонами, находящимися в каталоге /tpls/content/. Вывод макроса осуществляется по шаблону, указанному в параметре template. Вы можете не указывать этот параметр, тогда для вывода будет использован шаблон по умолчанию — default.tpl.

Используемые блоки шаблона

items

   Выводит список страниц, отрисованных с помощью блока item.

%total%

   Выводит количество найденных страниц.

%items%

   Выводит список страниц, отрисованных с помощью блока item.

item

   Отвечает за вывод отдельной страницы, полученной в результате работы макроса.

%id%

   Выводит id страницы.

%link%

   Выводит uri страницы.

%name%

   Выводит имя страницы.

%alt-name%

   Выводит имя страницы.

%domain%

   Домен сайта, на котором находится страница.

%lang%

   Префикс языковой версии, на которой находится страница.   

empty

   Выводится в том случае, если ничего найдено.

%request%

   Выводит $name, который был передан в макрос.