Идеальный шаблонизатор

Статус
В этой теме нельзя размещать новые ответы.

ustas

Элекомист №1
Dagdamor
Если ты о быстродействии, то разочарую тебя - нативный шаблонизатор все равно уделает такой кеш по скорострельности

каким образом?
скомпилированный шаблон отличается от простого php кода?
 

Dagdamor

Новичок
ustas
Ты-то почему задаешь этот вопрос :)
Ты сам выкладывал сравнение скорости работы различных шаблонизаторов не так давно. Насколько я помню, именно нативный шаблонизатор оказался самым быстрым. Просто потому, что он быстрее проанализирует исходный шаблон и преобразует его во что надо. Если есть кеширование - он может закешировать шаблон не в виде PHP кода, а в своем собственном представлении, все равно это будет в результате быстрее, чем отработка опкодов. Согласен?
 

CatManZero

Новичок
Автор оригинала: pachanga
...чтобы он не отвлекал программистов или банально не накосячил в шаблонах.
Странно... У нас такое происходит очень редко.

Конечно, найти человека с базовыми знаниями php проще, чем с xslt...

Но, по-моему, объяснить как работает <xsl:for-each> и <xsl:value-of/> тому же самому базовому phpисту не должно составить труда...

В общем, в этом направлении мне кажется лучше спор не затевать...
 

ustas

Элекомист №1
Dagdamor
скорость выполнения одинакова, платим только загрузкой обьекта.
повторный вызов - разница в доли миллисекунд.

объект тоже ведь занимает время обработки.
 

dark-demon

d(^-^)b
я тут потихоньку продолжаю изобретать велосипед :)

пусть нам надо образовать примерно такое меню:
PHP:
<div id="mmenu">
	<div class="caps">главное меню</div>
	<ul>
		<li><a href="/news/">новости</a></li>
		<li><a href="/phorum/">форум</a></li>
		<li class="j-off">
			<div class="caps j-baken"><a href="/gallery/">галерея</a></div>
			<ul>
				<li><a href="/gallery/girls/">девушки</a></li>
				<li><a href="/gallery/auto/">машинки</a></li>
				<li class="j-off">
					<div class="caps j-baken"><a href="/gallery/animals/">зверьки</a></div>
					<ul>
						<li><a href="/gallery/animals/hedgehog/">ёжики</a></li>
						<li><a href="/gallery/animals/tarantula/">тарантулы</a></li>
					</ul>
				</li>
			</ul>
		</li>
	</ul>
</div>
пусть данные у нас представлены в следующем компактном виде:
PHP:
<menu title="главное меню">
	<item title="новости" uri="/news/" />
	<item title="форум" uri="/phorum/" />
	<submenu title="галерея" uri="/gallery/">
		<item title="девушки" uri="/gallery/girls/" />
		<item title="машинки" uri="/gallery/auto/" />
		<submenu title="зверьки" uri="/gallery/animals/">
			<item title="ёжики" uri="/gallery/animals/hedgehog/" />
			<item title="тарантулы" uri="/gallery/animals/tarantula/" />
		</submenu>
	</submenu>
</menu>
применим несколько модифицированный XSLT (назовём его YSLT):

PHP:
<t:template match="/mmenu">
	<t:template name="m:maybelink" match="[@uri]" mode="self-data">
		<a href="{@uri}">{@title}</a>
	</t:template>
	<div id="mmenu">
		<div class="caps">
			<m:maybelink>{@title}</m:maybelink>
		</div>
		<ul>
			<t:template match="submenu">
				<li class="j-off">
					<div class="caps j-baken">
						<m:maybelink>{@title}</m:maybelink>
					</div>
					<ul>
						<t:apply-templates />
					</ul>
				</li>
			</t:template>
			<t:template match="item">
				<li>
					<m:maybelink>{@title}</m:maybelink>
				</li>
			</t:template>
			<t:apply-templates />
		</ul>
	</div>
</t:template>
шаблоны могут располагаться не только в корневом элементе, что позволяет вкладывать их друг в друга. каждый шаблон доступен только внутри того элемента в котором определён.
<t:apply-templates /> применяет все доступные в даной точке шаблоны для которых не указан аттрибут mode ко всем детям.
для шаблона можно указать расширенное имя (например, m:maybelink) и потом вызывать его не через call-template, а в сокращённом виде: <m:maybelink>{@title}</m:maybelink>
если для шаблона указан аттрибут match, то будет проведена проверка указанного в нём условия и если совпадения не произошло - обработка будет произведена как буд-то вызова шаблона и не происходило: {@title}
xpath выражения допустимы как в аттрибутах, так и в текстовых узлах: <a href="{@uri}">{@title}</a>
 

С.

Продвинутый новичок
Шаблон получился более сложный и громоздкий, чем выходнoй HTML. Что-то наверное еще не так.

Ты усложнил себе задачу:
PHP:
    ...
    <ul> 
        <li><a href="/news/">новости</a></li> 
        <li><a href="/phorum/">форум</a></li> 
        <li class="j-off">  <!--ТАК НЕ НАДО!-->
            <div class="caps j-baken"><a href="/gallery/">галерея</a></div> 
            <ul> 
            ...
Теги <li> должны быть одинаковые, независимо от того простой это или сложный элемент. Визуальное оформление ветви будет задано в следующем <ul>. Так просто рациональнее.
 

dark-demon

d(^-^)b
> Шаблон получился более сложный и громоздкий, чем выходнoй HTML

обычно в подобных меню гораздо больше пунктов...
так что на практике шаблон всё же меньше.


> Теги <li> должны быть одинаковые, независимо от того простой это или сложный элемент.

нет, class="j-off" показывает, что подменю может сворячиваться и исходное её состояние - свёрнутое.
визуальная привязка только одна:
.j-off ul{ display: none }

естественно, если меню должно быть всегда развёрнуто, то никаких классов задавать не нужно.
 

ustas

Элекомист №1
если выше нарисован идеальный шаблонизатор, то в космосе хаоса меньше
 

С.

Продвинутый новичок
dark-demon, ты не можешь свернуть подменю вместе с заголовком. Как потом раворачивать?

Вот как должно быть:
PHP:
<li><a href="/news/">новости</a></li> 
<li><a href="/phorum/">форум</a></li> 
<li><a href="/gallery/">галерея</a>
           <ul class="j-off">
 

dark-demon

d(^-^)b
С., тогда ты теряешь возможность задания разного оформления для заголовка при открытом и при закрытом подменю.
например - при открытом подменю нужно, чтобы вместо иконки с закрытой папкой, была иконка с открытой, как в проводнике.
http://www.dynamicdrive.com/dynamicindex1/navigate1.htm

-~{}~ 19.10.07 22:06:

> ты не можешь свернуть подменю вместе с заголовком. Как потом раворачивать?

а заголовок у меня и не сворачивается :)
http://dark-demon.nm.ru/web/now_how/expand_menu/expand_menu.htm
 

С.

Продвинутый новичок
Давай не будем углубляться в детали. Тем более, что твой пример тоже этого не подерживает. В контрольной задаче такого требования нет. Если твой шаблон будет иметь вид типа:

PHP:
<t:template match="/mmenu"> 
        <ul> 
                <li> 
                    <a href="{@uri}">{@title}</a>
                    <t:apply-templates /> 
                </li> 
        </ul> 
</t:template>
тогда еще можно будет разговаривать.
 

dark-demon

d(^-^)b
> Тем более, что твой пример тоже этого не подерживает.

поддерживает, но не демонстрирует :)


> В контрольной задаче такого требования нет.

значит надо добавить :) нет ничего хуже, чем контрольная задача оторванная от реальности.

-~{}~ 19.10.07 22:22:

> Если твой шаблон будет иметь вид типа .. тогда еще можно будет разговаривать.

а не надо упрощать задачу из желания сделать красивый шаблон. это оставь для рекламных роликов.
 

С.

Продвинутый новичок
Мы здесь как раз про красивые шаблоны говорим, если ты еще не забыл. Сделай его для начала для упрочшенной задачи, а потом говори "хоп".
 

dark-demon

d(^-^)b
значит вы оффтопите по чёрному. идеальный шаблонизатор характеризуется шаблонами выглядящими наиболее наглядно при сколь угодно сложных условиях эксплуатации, а не только в самых примитивных.
кстати, твой концепт
PHP:
{TREE}
    <ul>
        {BRANCH}
            <li>{DATA}</li>
        {/BRANCH} 
    </ul> 
{/TREE}
с поставленной мною задачей не справится вообще...
 

С.

Продвинутый новичок
pachanga, не хватает реализации второй задачи также хорошо.


dark-demon, кончай перепираться. Уже и ежу понятно, что приведеный тобой шаблон не нагляден ни в одном глазу. Критерий наглядности тоже имеется: если засунуть шаблон в браузер без обработки, то он корректно должен выдать одну итерацию.
 

dark-demon

d(^-^)b
у меня такое ощущение, что я разговариваю со стенкой...


pachanga, как его можно применить для реализации поставленной мною задачи?
 

С.

Продвинутый новичок
dark-demon, а ты повернись лицом к народу.

Разберись сначала с HTML в своей задаче. В работающем (!) примере http://dark-demon.nm.ru/web/now_how/expand_menu/expand_menu.htm у тебя все <li> в одной ветви одинаковые, независимо от того есть вложение или нет. А в том, что ты написал на форуме бардак какой-то.
 

dark-demon

d(^-^)b
PHP:
<ul class="expmenu on"> Listing
	<li class="off"> Item 1
		<ul>
			<li>Item 1.1</li>
			<li>Item 1.2</li>
			<li>Item 1.3</li>
		</ul>
	</li>

	<li class="on"> Item 2
		<ul>
			<li>Item 2.1</li>
			<li>Item 2.2</li>
			<li>Item 2.3</li>
		</ul>
	</li>

	<li class="onoff"> Item 3
		<ul>
			<li>Item 3.1</li>
			<li>Item 3.2</li>
			<li>Item 3.3</li>
		</ul>
	</li>

</ul>
думаю спрашивать каким место ты смотрел исходники бесполезно...
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху