Мысли по поводу шаблонизатора

Конечно каждому свое, но как по мне, шаблоны в ЛС сделаны не очень удобно. А не удобность заключается в излишней разбросанности «кусков», которые сложно контролировать при переносе верстки в шаблон. Что я предлагаю? Чтобы не быть многословным, посмотрите в сторону шаблонов Joomla! Имхо — просто рай для верстальщиков. А какие-то сторонние куски можно оставить в виде модулей (собственно в Joomla! так и реализовано).

Это лишь информация к размышлению. Просто по мне, это бы реально на порядок повысило скорость верстки под ЛС.

зы. хз как там в смарти, ибо всегда юзаю собственные нативные шаблонизаторы.
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 комментариев

avatar
можно в топике описать отличия и т.п.? чтоб было понятно на пальцах, не всем же ставить жумлу
  • ort
  • +3
avatar
Ну вообще он имеет ввиду, что весь стандартный скелет шаблона джумлы это один элементарный листинг. В едином файле. Дополнительное добавляется по средством самих устанавливаемых модулей.
Сугубо личное мнение — разделение на множество tpl удобнее и поуниверсальнее, правда раньше сам же считал по-другому, когда для phpbb верстал что-то).
avatar
Совершенно согласен.

Именно из-за шаблонизатора джумлы я от нее отказался. У нее html разбросан по всему движку, это просто трындец какой-то. Всё на таблицах, шаблон приходится подгонять под таблицы джумлы.

Я на джумле сделал около 30 сайтов, и каждый раз чертыхался на нее. Баста, с джумлой и ей подобными покончено!
avatar
1.5 пробовали?
avatar
Пробовал. После этого и понял, что мне с Джумлой не по пути.
avatar
каждому своё :)
avatar
не сказал бы что joomla — рай для верстальщика, впрочем при должном навыке всё делается легко и быстро… кстати, со smarty такая же история
  • pmb
  • 0
avatar
Не знаком с Joomla, но рай для верстальщика по-моему это шаблоны в MODx.
avatar
Согласен, коллега :-)
avatar
Добавил листинг шаблона.
avatar
зы. хз как там в смарти

А не мешало бы узнать, прежде чем советовать
avatar
Это не проблема, если захотеть реализовывать. И это лишь повод для «подумать», не более :) Да и высказал своё мнение.
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
avatar
<jdoc:include...

{include file=...


ИМХО смарти удобнее в верстке, а шаблон можно на свой манер организовать… отдельными кусками или скелетом…
avatar
Вы суть не поняли… Я говорил именно про скелет, а как инклюдить модули — абсолютно неважно.
avatar
скелет в ЛС это по сути два файла — header.tpl и footer.tpl
avatar
Да, и это стоит склеить. Тут считай вся логика меняется в таком случае.
avatar
зы. посмотрите всё же готовые шаблоны джумлы, ради интереса. Всё очень аккуратно и независимо…
avatar
согласен с топик стартером, шаблоны джумлы поприятнее делать чем шаблоны смарти.

зы: чтобы народ не путался: топикстартер привел листинг файла index.php для шаблона joomla 1.5.x =), файлик этот не единственный в шаблоне, есть еще templateDetails.xml, где объявляются позиции под модули, ну и разумеется файлы css и картинки :)
avatar
А так же настраиваемые параметры шаблона (например меняем CSS при хождении по пунктам меню) и т.д.
Я говорю про шаблон как таковой.
avatar
ну все равно templateDetails.xml стоило упомянуть, раз он отвечает за позиции
avatar
Добавил в пост.
avatar
ИМХО, но удобнее всего делать шаблон для DLE. Фактически, голый HTML, сиди и клепай в дримвейвере. Даже новичок сможет легко сделать под себя:)
avatar
А тут чем не голый html? Шаблонизатор потому и шаблонизатор, чтобы отделать отображение от логики.
avatar
Я правильно понимаю — если мне в джумле нужно сделать несколько шаблонов для разных страниц, которые отличаются только «телом», то в каждом из них я должен прописать хеад, шапку, футер и прочие повторяющиеся вещи?
avatar
шаблон делается один, а за тело отвечает
<jdoc:include type="component" />
, который будет выводить содержимое разных компонентов.
avatar
тогда не вижу принципиальной разницы.
один из моих шаблонов в смарти:
{include file='header.tpl'}
		
{if $aParams.0=='profile'}
  {include file='actions/ActionAdmin/users_profile.tpl'}
{elseif $aParams.0=='banlist'}
  {include file='actions/ActionAdmin/users_banlist.tpl'}
{else}
  {include file='actions/ActionAdmin/users_list.tpl'}
{/if}			
			
{include file='footer.tpl'}
avatar
с таким подходом только шаблоном не отделаешься, необходимо писать обработку шаблонов блоков(модулей), определяет кто за кем следует для каждой страницы и т.п. — это гора дополнительной логики и кода. В ЛС всё проще — для любой страницы можно определить любой шаблон и блоки, не обязательно повторяющие структуры скелета.
avatar
Писать кучу логики не нужно. Сейчас шаблонизатор действует по типу модулей. Я предлагаю лишь вынести каркас в единственный файл. Чорт, сложно объяснить…
avatar
header + footer = единственный каркасный файл? Как это поможет избавиться от отдельных шаблонов комментов, блоков, блогов и т.п.?
как ты сделаешь через такой единственный каркас две разные страницы: 1 — блок слева нужен, 2 — блок слева не нужен(как на страницах /page/about/)
avatar
Обработчики if else
avatar
я понимаю, что условные операторы, но где они будут?
комментарий был удален
avatar
ппц, сносите))
<?php if($this->countModules('top1')) { ?>
<div class="topbox <?php echo $this->params->get('topboxwidth'); ?> <?php echo $this->params->get('topbox12seperator'); ?> float-left">
<jdoc:include type="modules" name="top1" style="xhtml" />
</div>
<?php } ?>

avatar
что это и где?
avatar
Это в шаблоне.
avatar
вам ничего не мешает сделать несколько шаблонов для джумлы.
на самом деле тут все дело вкуса и привычки, я не вижу ничего плохого в смарти, отличный шаблонизатор. если уж вы, уважаемый ort решили его использоваться в ЛС, то и мы будем его использовать.
единственное что меня немного расстроило в смарти, это то что компилирует шаблон (не привычно) и обилие мелких файлов *.tpl, после той же джумлы не так легко перестроиться
avatar
вы путаете суть вопроса, вопрос не в шаблонизаторе(смарти, пхп-темплейт и т.п.), а в структуре шаблонов в движке, на каком они сделаны шаблонизаторе не важно.
avatar
Вы думаете что одна из самых выдающихся и известных CMS систем будет так делать?
avatar
я не думаю, я спрашиваю
avatar
По-моему ответ очевиден в таком случае.
avatar
я счиатаю, что такая структура добавляет мегоКГ гибкости в настройке, с джумлой было бы посложнее. Хотя переносить на нее верстку действительно одно удовольствие)
avatar
те несколько сайтов, что мне пришлось верстать под джумлу у меня почему-то при воспоминании вызывают зубную боль… я так и не понял удобности такой логики…

имхо имхо имхо
avatar
Нет уж увольте, лучше действительно MODx. Правда в нем логика совершенно иная работы с шаблонами.

Для примера переведу уже приведенный кусок:

<head>
        <title>[*pagetitle*]</title>
        <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="[(site_url)]/templates/masterlink/css/style.css" type="text/css" />
        <link rel="stylesheet" href="[(site_url)]/templates/masterlink/css/menu.css" type="text/css" />
        <link rel="stylesheet" href="[(site_url)]/templates/masterlink/css/icons.css" type="text/css" />
        
        <script type="text/javascript" src="[(site_url)]/templates/masterlink/js/mootools.js"></script>
        <script type="text/javascript" src="[(site_url)]/templates/masterlink/js/menu.js"></script>
        <script type="text/javascript" src="[(site_url)]/templates/masterlink/js/main.js"></script>
</head>


Вот это действительно рай! Имел много практики с Joomla, уж лучше смарти…
avatar
отличие только в синтаксисе? 0_о
[**] [()] против {}?
avatar
И в синтаксисе в том числе. Это простота использования в первую очередь.

Я допустим очень оценил наличие в ЛС {$DIR_STATIC_SKIN} по сравнению с БС, где надо указывать полный путь. А про получение аватары пользователя я вообще молчу.

Но там есть конечно и другие фичи, которые весьма здорово было бы использовать. Например при генерации страницы происходит обработка сниппетов (условно — кусок какого-то кода. Допустим блок «прямой эфир») и их код выполняется только при наличии в шаблоне. Устанавливается примерно так:
[!ПрямойЭфир!]

Никаких ползаний в код.

В MODx вся логика полностью вынесена из шаблонов — вот что главное.
avatar
Но там есть конечно и другие фичи

Это уже про MODx.
avatar
а где хранится [! ПрямойЭфир!]? это насколько я понимаю тот же шаблон с наличием логики прямого эфира, так что логика никуда не девалась
avatar
Прямой эфир хранится в неком хранилище этих самых сниппетов (в некой папке). Там шаблона как правило нет, а только логика написанная на PHP.

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

Итак есть сниппет (я уж буду использовать терминологию этой CMS), в котором есть код на PHP

Когда парсер встречает его в шаблоне, то разбирает его. В записи сниппета как правило есть еще и параметры разные. В качестве одного из параметров передается сниппету и шаблон:

[!ПрямойЭфир? &tpl=`ШаблонПрямогоЭфира` &limit=`20`!]


В шаблоне используется еще одно звено — плейхолдеры, которые заменяются значениями. Допустим для нашего прямого эфира это выглядело так:
<li class="even">
	<a class="stream-author" href="[+СсылкаНаПрофиль+]">[+Логин+]</a> →
	<span class="stream-comment-icon"/><a class="stream-comment" href="[+СсылкаНаКоммент+]">[+НазваниеТемы+]</a>
	<span> [+КоличествоКомментов+]</span> в <a class="stream-blog" href="[+СсылкаНаБлог+]">[+НазваниеБлога+]</a>
</li>


Соответственно можно запросто оформление изменить или допустим включить/исключить какой-то плейсхолдер.
Ну а сниппет соответственно по своей логике уже делает обработку в цикле и выводит результат.

Если в шаблоне сниппета нет, то и обработки нет.

В MODx еще и вложенность можно использовать, то есть сниппет выдает результат, в шаблоне которого другой сниппет и он тоже обрабатывается, но это уже другая история.
avatar
а где хранятся элементы
<ul></ul>
внутри которых выводятся li?
avatar
В зависимости от задачи. В некоторых сниппетах этот «контейнер» хранится в большом шаблоне (допустим если он должен присутствовать всегда). А некоторые сниппеты используют несколько шаблонов. В том числе один из них — шаблон контейнера.

[!ПрямойЭфир? &tplOut=`Контейнер` &tplRow=`ШаблонЗаписи` &limit=`20`!]
avatar
разве это удобно? дробить и без того мелкий и унитарный шаблон(на примере прямого эфира) на несколько?
avatar
Ну а как иначе логику убрать? Если есть способ хороший, то я бы с удовольствием им воспользовался. Я предложил самый хороший вариант из того, что использовал на практике. С таким подходом я точно знаю, что могу каталог статей (программ, фотографий и т.д.) или список новостей сделать за 10-20 минут.

А вот в шаблонах ЛС времени на шаблоны уходит просто огромное количество, когда логика отличается от стандартной.
avatar
Ну или есть как вариант еще (встречал где-то) использовать один шаблон, но в нем разделение на подшаблоны контейнера и ряда:


<ul>
<--- Разделитель --->
<li class="even">
	<a class="stream-author" href="[+СсылкаНаПрофиль+]">[+Логин+]</a> →
	<span class="stream-comment-icon"/><a class="stream-comment" href="[+СсылкаНаКоммент+]">[+НазваниеТемы+]</a>
	<span> [+КоличествоКомментов+]</span> в <a class="stream-blog" href="[+СсылкаНаБлог+]">[+НазваниеБлога+]</a>
</li>
<--- /Разделитель --->
</ul>


Как-то так. Отличие по сути только в том, что файлов будет меньше, но логика все равно останется снаружи.
avatar
Главное выглядит просто и чисто в сравнении с

{foreach from=$aComments item=oComment name="cmt"}
	<li {if $smarty.foreach.cmt.iteration % 2 == 1}class="even"{/if}>
		<a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PROFILE}/{$oComment->getUserLogin()}/" class="stream-author">{$oComment->getUserLogin()}</a> →
		<span class="stream-comment-icon"></span><a href="{$oComment->getTopicUrl()}#comment{$oComment->getId()}" class="stream-comment">{$oComment->getTopicTitle()|escape:'html'}</a>
		<span> {$oComment->getTopicCountComment()}</span> в <a href="{$oComment->getBlogUrlFull()}" class="stream-blog">{$oComment->getBlogTitle()|escape:'html'}</a>
	</li>						
{/foreach}
avatar
отличия вижу только в наличии первой и последней строки, остальное тоже самое — хтмл с плесхолдерами
avatar
опять таки синтаксис, вместо include() подставляем [!!]…

а синтаксис имхо не имеет значения
avatar
Вполне возможно, что для вас не имеет. А мне вполне нравится писать короче, если это возможно.

Но я полностью согласен, что простая смена одних скобочек на другие ничего не изменит. Тут надо по другому вообще к вопросу подходить.
avatar
Вы конечно правы, MODx использует свой синтаксис, но получается он на порядок проще. Простой пример: вывод облака тегов.
Код из девелоперского шаблона livestreet:

<div class="block tags">
	<ul class="cloud">						
		{foreach from=$aTags item=oTag}
			<li><a class="w{$oTag->getSize()}" rel="tag" href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_TAG}/{$oTag->getText()|escape:'html'}/">{$oTag->getText()|escape:'html'}</a></li>	
		{/foreach}
	</ul>
</div>


Пример аналогичного кода из MODx:

[[TvTagCloud? &parent=`1` &landing=`22` &tvTags=`tags` &showCount=`1`]] 

avatar
если сравнивать то так:
{include file="tags.tpl" aTags=$aTags}
и в чем разница?
avatar
Не понимаю почему нужно сравнивать именно так.

В приведенном Вами примере, насколько я понимаю, вызывается файл шаблона tags.tpl, который нужно предварительно создать и его содержимое будет мало чем отличаться от содержания файла block.tags.tpl из девелоперского шаблона, который я взял просто для примера шаблонизации в livestreet.

Если мне нужно будет выводить еще и другое облако тегов, например общее облако тегов на главной пусть так и остается tags.tpl, и облако тегов для блога отдельно, мне нужно будет создать еще и tagsblog.tpl и тд.?

В MODx получается несколько иначе, вызов делается просто одной строкой:

[[TvTagCloud? &parent=`0, 1, 2` &landing=`22` &tvTags=`tags`]]


Результатом такого вызова будет примерно такой html (с настройками снипета по-умолчанию):

<div class="tagcloud">
  <span><a class="s1" href="#" title="Все записи с тегом «Тег 1»">Тег 1</a></span>
  <span><a class="s2" href="#" title="Все записи с тегом «Тег 2»">Тег 2</a></span>
  <span><a class="s1" href="#" title="Все записи с тегом «Тег 3»">Тег 3</a></span>
  <span><a class="s4" href="#" title="Все записи с тегом «Тег 4»">Тег 4</a></span>
</div>


Все что нужно сделать — это написать CSS.
avatar
да, подключается файл с шаблоном, его можно подключить как для главной, так и для блогов и любых других тегов, главное чтоб объект тега у всех был одинаковый по свойствам.
где хранится html? —
<div class="tagcloud">
  <span><a class="s1" href="#" title="Все записи с тегом «Тег 1»">Тег 1</a></span>
  <span><a class="s2" href="#" title="Все записи с тегом «Тег 2»">Тег 2</a></span>
  <span><a class="s1" href="#" title="Все записи с тегом «Тег 3»">Тег 3</a></span>
  <span><a class="s4" href="#" title="Все записи с тегом «Тег 4»">Тег 4</a></span>
</div>
в шаблоне? ну тогда какая разница между им и шаблоном tags.tpl?
avatar
Как будет отдаваться код, настраивается в снипете (модуле так сказать). Там обычно выбирается, если это будет соответсвовать семантике, такие настройки:
— отдавать обернутым в div, span или р
— имя CSS класс для этого элемента (по умолчанию обычно стоит имя снипета)
— для облака тегов елементы отдавать в span или списком
— классы для этих элементов
— и т.д.
В шаблоне этот html прописывать не надо.
Практически все снипеты (модули) отдают валидный и семантичный html к которому просто нужно прописать стили.

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

Конечно MODx просто использует свой шаблонизатор, но есть огромная разница в наглядности и удобстве использования.

Кстати, не знаю как сейчас, но раньше на выходные открывали доступ в админку modx.ru. Лучше всего посмотреть как все работает на живом сайте, если, конечно такая возможность еще существует, мне когда-то это помогло разобраться в этой CMS с пол-пинка.

avatar
насколько я понял куски html кода хранятся в снипетах(модулях)? Это считается нормальным? Т.е. чтоб мне их изменить(например, для ссылок в облаке тегов добавить параметр rel) нужно лезть в код снипета?
avatar
В начале каждого снипета идет документированный конфиг, в нем и выставляются параметры.
avatar
Некоторые сниппеты действительно хранят html в своем коде, но это скорее исключение, чем правило. Хорошие сниппеты имеют стандартный шаблон и возможность подключить свой собственный.

Обсуждать лучше второй вариант конечно.
avatar
Ну в MODx архитектура все же другая, поэтому напрямую их не сравнить. В ЛС данные изначально подготавливаются полностью, а потом выводятся в шаблон. Тут как не крути, а выводить будешь именно то, что подготовлено и именно поэтому требуется логика в самих шаблонах. По другому просто не разделишь данные для авторизованного пользователя, админа или гостя. Поэтому Ort и обращается постоянно непосредственно к шаблону.

MODx же подготавливает данные «на лету» по запросу и это совсем другая кухня. Хотя эта кухня нам и нравится больше :-)
avatar
ЛС также может подготавливать данные «на лету» — это реализовано в блоках(Blocks)
avatar
Вывод через Ajax предлагаю не считать за данные подготавливаемые «на лету» :-)

Да и сами блоки (какие будут выводиться) заранее задаются в коде.
avatar
я не говорю про вывод через Ajax, в ЛС есть структура, называется Block — к ней обработчик в шаблоне подключается на лету:
{insert name="block" block=`название блока` params=`параметры`} 
вставлять это можно в любом месте шаблона
avatar
Вот это уже интересно. Если там можно сложную обработку организовать, то это вообще отлично.

Тогда у меня, по сути, вопрос только к логике в шаблонах остается.
avatar
И вообще не понял, как можно сравнивать смарти и джумлу? Мягкое с теплым?
Смарти не отвечает за принцип построения шаблона.
Но поддерживаю, Джумла надо держать подальше от LS, и чем дальше тем лучше ))
avatar
Не совсем понял смысла использовать отдельные футеры хидеры.
Может быть проще использовать схему zend layout?
По-моему гораздо удобнее. Для разных типов страниц конкретно в модуле/экшене переопределяется лэйаут от стандарного
Опять же пример лэйаута

<?= $this->doctype() ?>
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head>  
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  <?=$this->headTitle()?>
  <? $this->headLink()->appendStylesheet('/css/global.css') ?>
  <? $this->headScript()->appendFile(_HTTP_JS.'utils.js')?>
  <?=$this->headLink()?>
  <?=$this->headScript()?>
</head> 
<body>
    <div id="header">
        <?=$this->render('_header.phtml'); ?>
    </div><!-- #header-->

    <div id="container">
        <div id="content">
            <?= $this->layout()->content ?>
        </div><!-- #content-->
    </div><!-- #container-->

    <div class="sidebar">
        <?= $this->layout()->menu ?>
    </div><!-- .sidebar -->

    <div id="footer">
        <?=$this->render('_footer.phtml'); ?>        
    </div><!-- #footer -->

</body>
</html>

Это конечно упрощенный несколько вариант
(Соответсвенно layout()->content и layout()->menu заполняются в каждом модуле/акшене отдельно, свои шаблоны свои данные)
Ну а смарти или не смарти тут не суть…
И никаких заморочей как у Джумлы
Помоему тут все достаточно прозрачно. Несколько таких лэйаутов и все вроде
avatar
Коли сам автор ЛС обратил внимание на эту тему, внесу свежую струю в дискуссию. Предлагаю наряду с текущим шаблонизатора обеспечить поддержку объективно более скоростного отечественного продукта "Блиц". Он успешно работает на нескольких популярных проектах, в том числе и на хабре.



Возможно, два шаблонизатора кому-то покажутся избытком, но есть в ЛС же два механизма кэширования и два способа обеспечить поиск по сайту. Так и в предлагаемом мною способе — скоростной Блиц для нагруженных сайтов на дедиках или vps, Смарти — для ресурсов с небольшой посещалкой, обычно размещаемых на шареде, на котором Блиц будет недоступен.

На мой взгляд, внедрение предложенного шаблонизатора отвечает целям и задачам, поставленным перед грядущей версией 0.4 — повышение производительности и оптимизация ЛС.
avatar
Блитз требует установки расширения для PHP.
Часто это бывает невозможно на простом хостинге. Да и далеко не каждый пользователь знает, как собственном vps/дедике установить расширения для PHP вручную.
avatar
Предвидя такое замечание, я специально указал на memcached и sphinx, которые поддерживаются ЛС, хотя их использование точно также невозможно на виртуальном хостинге.
avatar
Было бы разумным переключаться на файловый кеш в случае отсутствия на сервере memcached. Иногда перераспределить нагрузку с БД на файловую систему может быть больше полезным, нежели наоборот.
Понятное дело, что все hl-проекты будут иметь установленный memcached, но для небольших сайтов на хостингах отменять кеширование как таковое не стоит.
avatar
В ЛС есть возможность кэширования в ОЗУ или файловую систему. С учётом такого дуализма разумно было бы использовать и более производительный шаблонизатор наряду со штатным
avatar
Но синтаксис Smarty сильно отличается от Blitz.
avatar
Серьёзный проект всё равно будет разрабатывать свой дизайн — какая разница, под какой шаблонизатор писать с нуля?
avatar
Согласен. Но таким образом отбрасываются все «несерьезные» проекты. А таких потенциально больше, чем серьезных.
avatar
Почему они отбрасываются? Я же предложил поддерживать оба шаблонизатора
avatar
Поддерживать оба шаблонизатора — писать все шаблоны сразу под обоих?
avatar
Поддерживать на уровне движка. Разработчики шаблонов уже сами пусть решают, для которого из шаблонизаторов писать. Для Блица, я думаю никто не будет использовать общедоступные, так что можно продолжать писать для Смарти.

Если Орт пойдёт навстречу в этом вопросе, я готов портировать дефолтный шаблон ЛС на Блиц, чтобы желающим перейти на более производительное решение было с чем тестить движок.
avatar
без переписывания львиной доли кода движка текущий шаблон под блиц портировать невозможно
avatar
не нужно сравнивать кеширование и шаблонизаторы, у разного вида кеширования есть общий интерфейс, а шаблонизаторы смарти и блиц имеют в корне разные интерфейсы и логику работу. Чтоб заставить шаблон работать через блиц, нужно изменить не только шаблон но и переписать(читай написать заново) все экшены
avatar
Вопрос снимается, спасибо за исчерпывающий ответ.
avatar
странно, плохо себе представляю, как такое может быть )
контроллер же у нас независим от отображения… ;)
avatar
Подскажите пожалуйста что делать!!! Вот вчера хотел на своем сайте убрать ярлык джумулы на главной странице, зашел в папку МЕНЕДЖЕР ШАБЛОНОВ, дальше в свой шаблон после чего нажал РЕДАКТИРОВАТЬ HTML при редактировании убрал какой-то симвыл после чего на сайте исчезло вертикальное меню с лева и появилось следующие символы: jdoc:include type=«modules» name=«left» style=«rounded» />
avatar
Мне кажется, что если найти указанный кусок текста в шаблоне и поставить перед ним символ <, это решит проблему.

Но такие вопросы задавать надо не здесь, а на форумах по Джумле ;)
avatar
да ладно, это по-моему как раз эпик вин )))
avatar
двачируешь?
avatar
скоро ЭВМ выпишет тебе медаль за десятитысячный комментарий с этим словом!
avatar
отлично, надо поднажать. осталось совсем немного
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.