Разработка сайтов на UMI.CMS
Знать UMI.CMS в совершенстве невозможно.
Даже сами разработчики знают о ней не все...

UMi

Ursa Minor

PDA-версия. Часть 2. Подключаем шаблон дизайна в зависимости от параметров в адресной строке

Переходим ко второй части страстей человеческих.

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

Хочется простоты, чтобы нужный шаблон дизайна подключался сам в зависимости от типа клиента.

Не мудрствуя лукаво, возьмем за обрацец Яндекс и создадим поддомен pda.основной_домен, делаем его алиасом к основному. 
Осталось решить вопрос с шаблонами....

Собственно, забегая вперед, результат:
http://russianlaw.net/law/general/ - простая версия
http://pda.russianlaw.net/law/general/ - PDA

Как мы видим, это одна и та же страница.

 

Сразу скажу, что будем править системные классы. Мы люди простые и php в шаблонах нас не пугает;)

 

Решение подсказали сами разработчики. Изучая исходный код наткнулся на недокументированный метод getPrintableTpl. Как он работает. Допустим, имеем шаблон tpls/content/inner.tpl  Теперь создаем рядом шаблон tpls/content/inner.print.tpl  Далее, вызываем страницу с параметром в строке запроса ?print=1. Наслаждаемся видом страницы в шаблоне для печати))

Вот она, простота! У нас будут шаблоны вида имя_шаблона.pda.tpl

Увы, радость моя была недолгой... Возможно, разработчики и пребывают в блаженном неведении о своем детище, но уверяю - оно не работает. И работать не может в принципе. Объясняю почему:

Вызов метода помещен в класс шаблонизатора, поэтому вызывается про отработке каждого макроса. По приведенному выше примеру, если у вас на странице вызывается, скажем, %catalog ....()% по шаблону inner (имя шаблона совпадает с шаблоном страницы), то метод подменит этот шаблон и заставит ЮМИ пытаться вывести каталог по шаблону tpls/catalog/inner.print.tpl, которого там, естественно, нет.

Облом(

Рассуждаем логически... В чем ошибка? В том, что метод вызывается всегда. А должен только однажды в той точке, где идет обработка шаблона контента. Ищем эту точку и находим ее в /libs/root-src/index.php

<?php

} else {
$cmsController->parsedContent = macros_content();
$templatePath = $config->includeParam('templates.tpl') . 'content/' . $templateName;
}

?>

И добавляем туда следующие строки:

 

<?php

} else {
$cmsController->parsedContent = macros_content();
/* START */
$currTemplater = $tplTemplater;

if(isPDA()) {//проверяем в какой мы версии

//формируем путь к новому шаблону и проверяем его существование
$sNewTplPath = substr($templateName, 0, strrpos($templateName, '.')) . '.pda.tpl';
$templateName = file_exists('tpls/content/'.$sNewTplPath) ? $sNewTplPath : $templateName;

}
/* END */
$templatePath = $config->includeParam('templates.tpl') . 'content/' . $templateName;
}

?>

 

Теперь пишем функцию, isPDA. Она разбирает адресную строку и ищет pda. в начале:

<?php
function isPDA(){
$domain = getServer('HTTP_HOST');
 $re = '/(?:www.)?(pda)?.имя_домена/i';
preg_match($re, $domain, $poc);
if(isset($poc[1]) and ($poc[1] == 'pda'))return true;
else return false;
}
?>

 

Куда бы ее поместить... В принципе, все равно куда, главное чтобы библиотека позволяла функциям быть в глобальной области. Исходя из этого запихнул ее в /libs/lib.php

Собственно, все)

Новости

30.10.2016

Обновлено описание макроса для вывода всех элементов справочника UMI.CMS с учетом версии 14.

 

21.07.2015

Памятка по обновлению до debian 8.1. Приятно вкусить все плюшки PHP 5.6

11.11.2014

Как выполнить SQL-запрос из bash-скрипта. Памятка

11.11.2014

Как отследить нагрузку сайта на сервер.

06.11.2014

Заготовка для галереи изображений с прокруткой. Не знаю, когда дойдут руки довести ее до вида плагина, поэтому открываю как есть. Можно доработать.

05.11.2014

Выкладываю как заготовку свой слайдер изображений на mootools

Все обновления