Мысли по поводу шаблонизатора
Конечно каждому свое, но как по мне, шаблоны в ЛС сделаны не очень удобно. А не удобность заключается в излишней разбросанности «кусков», которые сложно контролировать при переносе верстки в шаблон. Что я предлагаю? Чтобы не быть многословным, посмотрите в сторону шаблонов Joomla! Имхо — просто рай для верстальщиков. А какие-то сторонние куски можно оставить в виде модулей (собственно в Joomla! так и реализовано).
Это лишь информация к размышлению. Просто по мне, это бы реально на порядок повысило скорость верстки под ЛС.
зы. хз как там в смарти, ибо всегда юзаю собственные нативные шаблонизаторы.
UPD: По многочисленным заявкам выкладываю один из своих шаблонов Joomla!
UPD2: По заявке eugeneabrosimov выкладываю файл-информер templateDetails.xml (укоротил)
И файл параметров params.ini для управления кастомных настроек шаблона из админки:
Это лишь информация к размышлению. Просто по мне, это бы реально на порядок повысило скорость верстки под ЛС.
зы. хз как там в смарти, ибо всегда юзаю собственные нативные шаблонизаторы.
UPD: По многочисленным заявкам выкладываю один из своих шаблонов Joomla!
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<jdoc:include type="head" />
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<link rel="shortcut icon" href="images/favicon.png" type="image/png" />
<link rel="stylesheet" href="<?php echo $this->baseurl ?>/templates/masterlink/css/style.css" type="text/css" />
<link rel="stylesheet" href="<?php echo $this->baseurl ?>/templates/masterlink/css/menu.css" type="text/css" />
<link rel="stylesheet" href="<?php echo $this->baseurl ?>/templates/masterlink/css/icons.css" type="text/css" />
<script type="text/javascript" src="<?php echo $this->baseurl ?>/templates/masterlink/js/mootools.js"></script>
<script type="text/javascript" src="<?php echo $this->baseurl ?>/templates/masterlink/js/menu.js"></script>
<script type="text/javascript" src="<?php echo $this->baseurl ?>/templates/masterlink/js/main.js"></script>
</head>
<body>
<div id="main_body"> <!-- Общее тело страницы-->
<div id="header"> <!-- Шапка, фон-->
<div id="logo"></div> <!-- Логотип-->
<div id="header-text"></div> <!-- Текст в шапке -->
</div>
<div id="menu-bg"> <!-- Меню-->
<div id="nav_main"> <!-- Основное тело меню -->
<jdoc:include type="modules" name="breadcrumb" />
</div>
</div>
<div id="body-contekst"> <!-- Непосредственно тело страницы -->
<div id="lefthold"> <!-- Левая часть страницы -->
<div id="news-block">
<jdoc:include type="modules" name="breadcrumb" />
<jdoc:include type="component" /> <!-- Основное тело компонента, представлен как модуль -->
</div>
</div>
<div id="righthold"> <!-- правая часть страницы -->
<div id="sidebar_top"></div>
<div id="sidebar">
<jdoc:include type="modules" name="right" style="xhtml"/>
</div>
<div id="sidebar_bottom"></div>
</div>
<div class="divider"></div> <!-- разделитель для нижней части страницы -->
</div>
<div id="bottommodules-bg"> <!-- Нижние модули компаний -->
<jdoc:include type="modules" name="bottom" />
</div>
<div id="bottom"> <!-- Нижняя менюшка и копирайты -->
<div class="bottom-menu"> <!-- Собственно менюшка -->
</div>
<div class="copyright"> <!-- Копирайты-->
<!-- блаблабла -->
</div>
</div>
</div> <!-- Закрываем тело (подкладку) страницы -->
</body>
</html>
UPD2: По заявке eugeneabrosimov выкладываю файл-информер templateDetails.xml (укоротил)
<?xml version="1.0" encoding="utf-8"?>
<install version="1.5" type="template">
<name>yoo_beyond</name>
<version>1.5.3</version>
<creationDate>December 2007</creationDate>
<author>YOOtheme</author>
<authorEmail>info@yootheme.com</authorEmail>
<authorUrl>http://www.yootheme.com</authorUrl>
<copyright>Copyright © 2007 YOOtheme Ltd. & Co. KG</copyright>
<license></license>
<description><![CDATA[
<img src="../templates/yoo_beyond/template_thumbnail.png" align="right" style="margin: 0px 0px 10px 10px;" />
<div style="font-size: 13px;">
Beyond is the January 2008 template of the YOOtheme club.
<br /><br /><span style="color: #ff0000;"><b>NOTE: It is not free or public. This template is for members of the YOOtheme club only.</b></span>
<br /><br />YOOtheme website<br /><a href="http://www.yootheme.com/">http://www.yootheme.com</a>.
<br /><br />YOOtheme demo server<br /><a href="http://demo.yootheme.com/">http://demo.yootheme.com</a>.
<br /><br />YOOtools website<br /><a href="http://www.yootools.com/">http://www.yootools.com</a>.
</div>
<h3 style="clear: both;">Changelog</h3>
<b>1.5.3</b><br />
<div style="margin: 0px 0px 0px 10px;">
- Fixed Opera bug with menu styling<br />
</div>
<br /><br />
]]></description>
<files>
<filename>favicon.ico</filename>
...
<filename>index.php</filename>
</files>
<positions>
<position>absolute</position>
<position>topmenu</position>
<position>search</position>
<position>header</position>
<position>logo</position>
<position>menu</position>
<position>banner</position>
<position>top</position>
<position>breadcrumb</position>
<position>left</position>
<position>right</position>
<position>bottom</position>
<position>footer</position>
<position>top1</position>
<position>top2</position>
<position>top3</position>
<position>top4</position>
<position>bottom1</position>
<position>bottom2</position>
<position>bottom3</position>
<position>bottom4</position>
<position>user1</position>
<position>user2</position>
<position>user3</position>
<position>user4</position>
<position>user5</position>
<position>user6</position>
<position>user7</position>
<position>user8</position>
<position>user9</position>
<position>advert1</position>
<position>advert2</position>
<position>advert3</position>
<position>advert4</position>
<position>content1</position>
<position>content2</position>
<position>content3</position>
<position>content4</position>
<position>content5</position>
<position>content6</position>
<position>content7</position>
<position>content8</position>
<position>content9</position>
<position>debug</position>
</positions>
<params>
<param name="color" type="list" default="default" label="Template Color" description="Template color variation to use">
<option value="default">White</option>
<option value="grey">Grey</option>
<option value="turquoise">Turquoise</option>
<option value="deepblue">Deep Blue</option>
<option value="black">Black</option>
<option value="blue">Blue</option>
<option value="green">Green</option>
<option value="red">Red</option>
<option value="lilac">Lilac</option>
<option value="peach">Peach</option>
</param>
<param name="item1Color" type="list" default="default" label="Item1 Color" description="Used color when menu item1 is active">
<option value="default">Grey</option>
<option value="green">Green</option>
<option value="pink">Pink</option>
<option value="orange">Orange</option>
<option value="blue">Blue</option>
</param>
<param name="item2Color" type="list" default="blue" label="Item2 Color" description="Used color when menu item2 is active">
<option value="default">Grey</option>
<option value="green">Green</option>
<option value="pink">Pink</option>
<option value="orange">Orange</option>
<option value="blue">Blue</option>
</param>
<param name="item3Color" type="list" default="pink" label="Item3 Color" description="Used color when menu item3 is active">
<option value="default">Grey</option>
<option value="green">Green</option>
<option value="pink">Pink</option>
<option value="orange">Orange</option>
<option value="blue">Blue</option>
</param>
<param name="layout" type="list" default="left" label="Layout Style" description="Left column is aligned to the left/right">
<option value="left">Left</option>
<option value="right">Right</option>
</param>
<param name="date" type="radio" default="1" label="Show Date" description="Show/Hide the date">
<option value="0">No</option>
<option value="1">Yes</option>
</param>
<param name="styleswitcherFont" type="radio" default="1" label="Show Font Styleswitcher" description="Show/Hide the stylswitcher for font size">
<option value="0">No</option>
<option value="1">Yes</option>
</param>
<param name="styleswitcherWidth" type="radio" default="0" label="Show Width Styleswitcher" description="Show/Hide the stylswitcher for width">
<option value="0">No</option>
<option value="1">Yes</option>
</param>
<param name="fontDefault" type="list" default="font-medium" label="Default Font Size" description="Set the default font size when template is loaded for the first time">
<option value="font-small">Small</option>
<option value="font-medium">Medium</option>
<option value="font-large">Large</option>
</param>
<param name="widthDefault" type="list" default="width-wide" label="Default Width" description="Set the default width when template is loaded for the first time">
<option value="width-thin">Thin</option>
<option value="width-wide">Wide</option>
<option value="width-fluid">Fluid</option>
</param>
<param name="widthThinPx" type="text" default="780" label="Width Thin" description="Set the template width for style 'width-thin' in pixels" />
<param name="widthWidePx" type="text" default="940" label="Width Wide" description="Set the template width for style 'width-wide' in pixels" />
<param name="widthFluidPx" type="text" default="0.9" label="Width Fluid" description="Set the template width for style 'width-fluid' in percent" />
<param name="loadMootools" type="radio" default="1" label="Enable Mootools" description="Enable/Disable Mootools 1.11 javascript library">
<option value="0">No</option>
<option value="1">Yes</option>
</param>
<param name="loadJavascript" type="radio" default="1" label="Enable Javascripts" description="Enable/Disable all the templates javascripts">
<option value="0">No</option>
<option value="1">Yes</option>
</param>
</params>
</install>
И файл параметров params.ini для управления кастомных настроек шаблона из админки:
color=default
item1Color=default
item2Color=blue
item3Color=pink
item4Color=orange
item5Color=green
item6Color=default
item7Color=default
item8Color=default
item9Color=default
item10Color=default
layout=left
date=1
styleswitcherFont=1
styleswitcherWidth=1
fontDefault=font-medium
widthDefault=width-wide
widthThinPx=780
widthWidePx=940
widthFluidPx=0.9
loadMootools=1
loadJavascript=1
97 комментариев
Сугубо личное мнение — разделение на множество tpl удобнее и поуниверсальнее, правда раньше сам же считал по-другому, когда для phpbb верстал что-то).
Именно из-за шаблонизатора джумлы я от нее отказался. У нее html разбросан по всему движку, это просто трындец какой-то. Всё на таблицах, шаблон приходится подгонять под таблицы джумлы.
Я на джумле сделал около 30 сайтов, и каждый раз чертыхался на нее. Баста, с джумлой и ей подобными покончено!
А не мешало бы узнать, прежде чем советовать
ИМХО смарти удобнее в верстке, а шаблон можно на свой манер организовать… отдельными кусками или скелетом…
зы: чтобы народ не путался: топикстартер привел листинг файла index.php для шаблона joomla 1.5.x =), файлик этот не единственный в шаблоне, есть еще templateDetails.xml, где объявляются позиции под модули, ну и разумеется файлы css и картинки :)
Я говорю про шаблон как таковой.
один из моих шаблонов в смарти:
как ты сделаешь через такой единственный каркас две разные страницы: 1 — блок слева нужен, 2 — блок слева не нужен(как на страницах /page/about/)
на самом деле тут все дело вкуса и привычки, я не вижу ничего плохого в смарти, отличный шаблонизатор. если уж вы, уважаемый ort решили его использоваться в ЛС, то и мы будем его использовать.
единственное что меня немного расстроило в смарти, это то что компилирует шаблон (не привычно) и обилие мелких файлов *.tpl, после той же джумлы не так легко перестроиться
имхо имхо имхо
Для примера переведу уже приведенный кусок:
Вот это действительно рай! Имел много практики с Joomla, уж лучше смарти…
[**] [()] против {}?
Я допустим очень оценил наличие в ЛС {$DIR_STATIC_SKIN} по сравнению с БС, где надо указывать полный путь. А про получение аватары пользователя я вообще молчу.
Но там есть конечно и другие фичи, которые весьма здорово было бы использовать. Например при генерации страницы происходит обработка сниппетов (условно — кусок какого-то кода. Допустим блок «прямой эфир») и их код выполняется только при наличии в шаблоне. Устанавливается примерно так:
Никаких ползаний в код.
В MODx вся логика полностью вынесена из шаблонов — вот что главное.
Это уже про MODx.
Для полной картины тогда опишу полную цепочку, чтобы было ясно как это связано с шаблонами.
Итак есть сниппет (я уж буду использовать терминологию этой CMS), в котором есть код на PHP
Когда парсер встречает его в шаблоне, то разбирает его. В записи сниппета как правило есть еще и параметры разные. В качестве одного из параметров передается сниппету и шаблон:
В шаблоне используется еще одно звено — плейхолдеры, которые заменяются значениями. Допустим для нашего прямого эфира это выглядело так:
Соответственно можно запросто оформление изменить или допустим включить/исключить какой-то плейсхолдер.
Ну а сниппет соответственно по своей логике уже делает обработку в цикле и выводит результат.
Если в шаблоне сниппета нет, то и обработки нет.
В MODx еще и вложенность можно использовать, то есть сниппет выдает результат, в шаблоне которого другой сниппет и он тоже обрабатывается, но это уже другая история.
А вот в шаблонах ЛС времени на шаблоны уходит просто огромное количество, когда логика отличается от стандартной.
Как-то так. Отличие по сути только в том, что файлов будет меньше, но логика все равно останется снаружи.
а синтаксис имхо не имеет значения
Но я полностью согласен, что простая смена одних скобочек на другие ничего не изменит. Тут надо по другому вообще к вопросу подходить.
Код из девелоперского шаблона livestreet:
Пример аналогичного кода из MODx:
и в чем разница?
В приведенном Вами примере, насколько я понимаю, вызывается файл шаблона tags.tpl, который нужно предварительно создать и его содержимое будет мало чем отличаться от содержания файла block.tags.tpl из девелоперского шаблона, который я взял просто для примера шаблонизации в livestreet.
Если мне нужно будет выводить еще и другое облако тегов, например общее облако тегов на главной пусть так и остается tags.tpl, и облако тегов для блога отдельно, мне нужно будет создать еще и tagsblog.tpl и тд.?
В MODx получается несколько иначе, вызов делается просто одной строкой:
Результатом такого вызова будет примерно такой html (с настройками снипета по-умолчанию):
Все что нужно сделать — это написать CSS.
где хранится html? — в шаблоне? ну тогда какая разница между им и шаблоном tags.tpl?
— отдавать обернутым в div, span или р
— имя CSS класс для этого элемента (по умолчанию обычно стоит имя снипета)
— для облака тегов елементы отдавать в span или списком
— классы для этих элементов
— и т.д.
В шаблоне этот html прописывать не надо.
Практически все снипеты (модули) отдают валидный и семантичный html к которому просто нужно прописать стили.
Мне сложно обьяснить что представляют собой шаблоны лучше, чем
Конечно MODx просто использует свой шаблонизатор, но есть огромная разница в наглядности и удобстве использования.
Кстати, не знаю как сейчас, но раньше на выходные открывали доступ в админку modx.ru. Лучше всего посмотреть как все работает на живом сайте, если, конечно такая возможность еще существует, мне когда-то это помогло разобраться в этой CMS с пол-пинка.
Обсуждать лучше второй вариант конечно.
MODx же подготавливает данные «на лету» по запросу и это совсем другая кухня. Хотя эта кухня нам и нравится больше :-)
Да и сами блоки (какие будут выводиться) заранее задаются в коде.
Тогда у меня, по сути, вопрос только к логике в шаблонах остается.
Смарти не отвечает за принцип построения шаблона.
Но поддерживаю, Джумла надо держать подальше от LS, и чем дальше тем лучше ))
Может быть проще использовать схему zend layout?
По-моему гораздо удобнее. Для разных типов страниц конкретно в модуле/экшене переопределяется лэйаут от стандарного
Опять же пример лэйаута
Это конечно упрощенный несколько вариант
(Соответсвенно layout()->content и layout()->menu заполняются в каждом модуле/акшене отдельно, свои шаблоны свои данные)
Ну а смарти или не смарти тут не суть…
И никаких заморочей как у Джумлы
Помоему тут все достаточно прозрачно. Несколько таких лэйаутов и все вроде
Возможно, два шаблонизатора кому-то покажутся избытком, но есть в ЛС же два механизма кэширования и два способа обеспечить поиск по сайту. Так и в предлагаемом мною способе — скоростной Блиц для нагруженных сайтов на дедиках или vps, Смарти — для ресурсов с небольшой посещалкой, обычно размещаемых на шареде, на котором Блиц будет недоступен.
На мой взгляд, внедрение предложенного шаблонизатора отвечает целям и задачам, поставленным перед грядущей версией 0.4 — повышение производительности и оптимизация ЛС.
Часто это бывает невозможно на простом хостинге. Да и далеко не каждый пользователь знает, как собственном vps/дедике установить расширения для PHP вручную.
Понятное дело, что все hl-проекты будут иметь установленный memcached, но для небольших сайтов на хостингах отменять кеширование как таковое не стоит.
Если Орт пойдёт навстречу в этом вопросе, я готов портировать дефолтный шаблон ЛС на Блиц, чтобы желающим перейти на более производительное решение было с чем тестить движок.
контроллер же у нас независим от отображения… ;)
Но такие вопросы задавать надо не здесь, а на форумах по Джумле ;)