Как вывести список сайтов системы

Материал из Umicms
Перейти к:навигация, поиск

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

Задача

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

Решение

%custom getDomainsList()% — Выводит список сайтов системы.

Параметры: custom getDomainsList([$template = 'default'])

$template

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

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

Код макроса

public function getDomainsList($template = 'default'){
	
	list($domains_template, $domain_template) = def_module::loadTemplates('content/' . $template, 'domains', 'domain');
	
	$regedit = regedit::getInstance();                                     
	$domain_col = domainsCollection::getInstance(); 
	$domains_list = $domain_col->getList();
        $total = count($domains_list);
	
	$domain = array();
	$domains = array(); 
	
	$cms_contoller = cmsController::getInstance();
	$current_domain_id = $cms_contoller->getCurrentDomain()->getId();
	
	foreach($domains_list as $domain_item){
		$domain['attribute:host'] = $domain_item->getHost();
		$domain['attribute:id'] = $domain_col->getDomainId($domain['attribute:host']);
		if(intval($domain['attribute:id']) ==  $current_domain_id){
			$domain['attribute:is_current'] = 1;
		}
		$domain['attribute:name'] = $regedit->getVal('//settings/site_name/'. $domain['attribute:id'] . '/' . $domain_item->getDefaultLangId());
		$domain['attribute:is_default'] = $domain_item->getIsDefault();
		$domains[] = def_module::parseTemplate($domain_template, $domain);
		unset($domain['attribute:is_current']);
	}
	$domains = array('subnodes:domains' => $domains);
        $domains['total'] = $total;

	return def_module::parseTemplate($domains_template, $domains);
}

Применение в xslt

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

udata://custom/getDomainsList

XML-ответ UData

<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="custom" method="getDomainsList" generation-time="0.005113">
	<domains>
		<item host="domain1.ru" id="1" is_current="1" name="лучший сайт для..." is_default="1"/>
		<item host="domain2.ru" id="2" name="бла бла бла"/>
		<item host="domain3.ru" id="3" name="молодая, перспективная фирма"/>
	</domains>
        <total>3</total>
</udata>

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

<domains>

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

<item>

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

@host

   Домен сайта.

@id

   Идентификатор сайта.

@is_current

   Является ли сайт текущим.

@name

   Имя сайта, которое задается в модуле "Конфигурации"->"Домены"->"Свойство домена".

@is_default

   Является ли сайт основным, то есть первым в модуле "Структура".

<total>

   Количество сайтов в системе.