umi_tips


полезное о Umi (вестка, программинг, мелочи)


Previous Entry Share Next Entry
Глобальное переназначение default шаблонов для каталогов, новостей и т.п.
suilinad wrote in umi_tips
Материал предоставлен сайтом UMIhelp.ru

Очередной раз, разрабатывая сайт на umi, который был уже не первым (вторым, третьим, четвертым…) сайтом на этой лицензии  задался вопросом, как упростить процесс переопределения default шаблона для каталога, новостей и т.п.

В каких случаях я переопределяю default шаблоны:

  1. Если у меня 2 каталога на сайте и они должны обрабатывать объекты  и разделы каталога по разным шаблонам
  2. Тоже самое что и в пункте 1 для новостей, фотогалерей и т.д
  3. Если у меня уже есть сайт на этой лицензии и там задействован каталог, а мне нужно вывести его по другому
  4. наверно есть еще примеры, но сходу как то и не вспомнил


Суть процесса переопределения

Суть процесса переопределения в общих чертах можно описать так. Если вам необходимо создать второй каталог в системе и назначит ему другой шаблон вывода категорий и объектов, то нам необходимо:

 

  1. Создать новый шаблон для страниц типа «Раздел каталога» (назовем его catalog.tpl) с макросом %catalog category(new_default,%pid%)% вместо стандартного %content%
  2. Добавить его в список шаблонов в разделе настройки модуля «Структура»
  3. Определить для всех страниц типа «Раздел каталога» новый шаблон (catalog.tpl)…. затем
  4. Создать новый шаблон для страниц типа «Объект каталога» (назовем его catalog_inner.tpl) с макросом %catalog viewobject(new_default,%pid%)% вместо стандартного %content%
  5. Опять добавить его в список шаблонов
  6. И опять не забыть назначить его всем объектам каталога которые я создам.

Честно, меня это всегда вымораживает, и больше всего пугает что потом пользователю уже без вас работать с эти чудо каталогом. Есть несколько вариантов,  как переопределить default шаблоны для модулей влазя в код umi, но как мы все понимаем, это во-первых неправильно с точки зрения целостности системы, во-вторых затирается при обновлении. И тут неожиданно меня осенила очень простая мысль как это сделать.

Суть задумки

Она проста как я не знаю что). Мы просто вместо макроса %content% ставим свой макрос (%custom tpl_re()%), который в зависимости от определенны факторов поставляет необходимые макросы, например макрос %catalog viewobject(new_default,%pid%)%. Макрос для простоты внедрения я помещаю в custom.php. Приведу пример макроса %custom tpl_re()%

public function tpl_re() {
	$page_id = cmsController::getInstance()->getCurrentElementId();// берем id текущей страницы
	$page = umiHierarchy::getInstance()->getElement($page_id); // получаем саму страницу
	if(!$page) return '%content%'; // если такой страницы не нашлось возвращаем дефолтный макрос %content%
	$page_type_id = $page->getObject()->getTypeId(); // выясняем к какому типу данных относиться страница

	// моя таблица соответствий, где к каждому типу данных который нуждается в переопределении назначается свой макрос со своим шаблоном
	$array = array(
		799 => '%catalog viewObject(%pid%,new_catalog_default)% ',
		800 => '%catalog category(new_catalog_default,%pid%)%',
		18 => '%news lastlist(%pid%,new_news_default)%',
		23 => '%news view(%pid%,new_news_default)%',
		);

	if (array_key_exists($page_type_id,$array)) return $array[$page_type_id];
	return '%content%';
}

в принципе, многое понятно из комментариев, но вкратце все же поясню. У меня был второй сайт на лицензии, для каталога был созданы свои типы данных (из-за необходимости дополнительных полей)
«799″ для объектов каталога и «800″ для разделов каталога. Затем я заменил в inner.tpl (шаблон для большинства внутренних страниц и одновременно шаблон по умолчанию) макрос %content% на %custom tpl_re()%. И мне осталось только подправить шаблоны для новостей (new_news_default) и каталога (new_catalog_default) я мог забыть о четырех «лишних шаблонах» в системе и о том, что мне надо назначать «лишние шаблоны» каким-то страницам.

Переопределение шаблонов для подстраниц раздела сайта

Можно пойти дальше, не всегда нам надо выводить по специальному шаблону только какой-то определенный тип данных, а если у нас 2 каталога одного типа данных, но нуждающихся в разных шаблонах для разделов и объектов каталога? Тогда работаем уже не только с проверкой типа данных, а еще и с id страницы.

public function tpl_re() {
	$new_catalog_id=30;//id cataloga который необходимо вывести по новому шаблону
	$page_id = cmsController::getInstance()->getCurrentElementId();// берем id текущей страницы
	$page = umiHierarchy::getInstance()->getElement($page_id); // получаем саму страницу
	if(!$page) return '%content%'; // если такой страницы не нашлось возвращаем дефолтный макрос %content%
	$page_type_id = $page->getObject()->getTypeId(); // выясняем к какому типу данных относиться страница

	// моя таблица соответствий, где к каждому стандартному типу данных (11-тип данных "объект каталога", 9-тип данных "раздел каталога") назначается свой макрос со своим шаблоном
	$array = array(
		11 => '%catalog viewObject(%pid%,new_catalog_default)% ',
		9 => '%catalog category(new_catalog_default,%pid%)%',
		);

	if($page_id==$new_catalog_id) {
		if (array_key_exists($page_type_id,$array)) return $array[$page_type_id];
	} else {
		//проверим не является ли текущая страница подстраницей нашего каталога
		$allParents = umiHierarchy::getInstance()->getAllParents($id, true); //берем всех родителей страницы
		foreach ($array as $key_kode=>$value){
			if($value==$page_id) {
				if (array_key_exists($page_type_id,$array)) return $array[$page_type_id];
			}
		}
	}

	return '%content%';
}

Переопределение шаблонов для второго (третьего, четвертого…) домена в системе

А если задача стоит вывести например каталог по default шаблону, но у нас уже есть другой сайт на этой же лицензии, у которого тоже есть каталог и он уже занял default шаблон. Тогда можно работать с номером домена.

public function tpl_re() {
	$page_id = cmsController::getInstance()->getCurrentElementId();// берем id текущей страницы
	$page = umiHierarchy::getInstance()->getElement($page_id); // получаем саму страницу
	if(!$page) return '%content%'; // если такой страницы не нашлось возвращаем дефолтный макрос %content%
	$page_type_id = $page->getObject()->getTypeId(); // выясняем к какому типу данных относиться страница

	// моя таблица соответствий, где к каждому стандартному типу данных (11-тип данных "объект каталога", 9-тип данных "раздел каталога") назначается свой макрос со своим шаблоном
	$array = array(
		11 => '%catalog viewObject(%pid%,new_catalog_default)% ',
		9 => '%catalog category(new_catalog_default,%pid%)%',
		);

	$domain_id	= $page->getDomainId(); //получаем номер домена, к которому относиться эта страница. Номер домена вы можете посмотреть в адресной строке при редактировании информации о домене (вкладка домены, модуль каталог)
	if($domain_id==2) {
		if (array_key_exists($page_type_id,$array)) return $array[$page_type_id];
	}
	return '%content%';
}

Заключение

В общем, описанные выше примеры можно крутить как угодно? задавая любую последовательность условий для переопределения шаблона для той или иной страницы. Фишка преимущественно для разработчиков, мне, например, это сокращает время в определенных задачах.  Хотел написать  модуль, но пока руки не дошли, пользуюсь такими вот самописными макросами. Решил и с вами поделиться

 

?

Log in