Шаблонный движок

WP

^_^
Magiys
Шаблон - исходный код программы выполняющей логику представления.
 

Духовность™

Продвинутый новичок
что есть шаблон в истинном значении?
Шаблон - это программа, выполняющая логику представления. Вот пример шаблона на языке PHP:

PHP:
Привет, меня зовут <b><?=$name?><b>!

Я живу в городе <?=$town?>. У меня много друзей:

<ul>
<? foreach($friends as $friend): ?>
     <li><?=$friend?></li>
<? endforeach; ?>
<ul>

<? if($girls): ?>
   ...и подруг!
<? else: ?>
   а вот подруг нет(((
<? endif; ?>
Переменные $name, $town, $friends и $girls генерирует программа - т.е. логика приложения. Шаблон же - логика представления. Все.
 

dark-demon

d(^-^)b
Magiys, шаблон - это такая штука с дырками. в дырки ты можешь подставлять свои значения в том числе и результат отработки других шаблонов.

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

PHP:
/search?<tmpl_if name="keyword">keyword=<tmpl_var name="keyword">&</tmpl_if><tmpl_if name="range">range=<tmpl_var name="range">&</tmpl_if>
и так далее десяток пунктов.

в то время как с такой задачей обычный язык программирования справляется куда лучше:
PHP:
$url= '/search?';
foreach( $params as $name => $val ) $url.= $name . '=' . $val . '&';
языки программирования для того и придуманы, чтобы на них реализовывать логику, не зависимо от того к какому слою приложения она относится.

-~{}~ 19.01.08 12:47:

наверняка каждый согласится, что сложной логике в шаблоне не место, а где ей место-то?
 

dark-demon

d(^-^)b
я уже даже не говорю про проблему "поставили шаблон не от той версии программы и потеряли часть функционала, ибо вся логика была зашита в шаблоне"
 

Духовность™

Продвинутый новичок
dark-demon
Хороший пример. Это камень в чьей огород?

У меня для подобных целей есть специальный набор функция с префиксом tpl_. Причем, функций в этом наборе и десятка не наберется. Только крайние случаи, типа формирование строки навигации и примеры, подобные твоему.

И именно в соответствующую функцию я бы и запихнул бы твой код. Примерно так:

PHP:
function tpl_makeSearchUrl($params)
{
    foreach ($params as $name => $val)
    {
        $url.= $name . '=' . $val . '&';
    }
}
И в шаблоне её бы и вызвал.

PHP:
<a href="/search?<?=tpl_makeSearchUrl($params)?>"></a>
-~{}~ 19.01.08 12:54:

Шаблон - это образец, специальная нотация, разметка, но никак не программа
А кто говорит о ПРОГРАММЕ? Где ты в моем шаблоне видишь программу? Это - логика представления. От неё никуда не деться. Это только что было видно в примере dark-demon.
 

dark-demon

d(^-^)b
> А кто говорит о ПРОГРАММЕ?

вот склеротик :) ты же и говоришь.


> Это - логика представления. От неё никуда не деться.

в шаблоне? не смешите мои тапочки! вот ты сам используешь внешнюю функцию-хэлпер, которую выносишь за пределы шаблона.


> У меня для подобных целей есть специальный набор функция с префиксом tpl_

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

PHP:
/search?<tmpl_if name="keyword">keyword=<tmpl_var name="keyword">&</tmpl_if><tmpl_if name="range">range=<tmpl_var name="range">&</tmpl_if>sort=<tmpl_var name="sort" default="date">&
 

Духовность™

Продвинутый новичок
dark-demon
вот ты сам используешь внешнюю функцию-хэлпер, которую выносишь за пределы шаблона
И что теперь? Как и в соседней теме, "весь SQL в функции выносить"? Вот тебе банальный пример:

PHP:
<? if ($status == 'ОК'): ?>
    <font color=green>Все хорошо</font>
<? elseif ($status == 'ALERT'): ?>
    <font color=red>Все плохо, мы все умрем</font>
<? endif; ?>
По русски это читается так: если переменная статуса равна значению ОК, то вывести сообщение зеленым цветом, если она равна значению ALERT - красным.

Вот тут есть логика. Скажи пожалуйста, какой код должен эту логику отрабатывать, если по твоему мнению от логике в шаблоне вполне можно избавиться?
 

dark-demon

d(^-^)b
ну, например, так:
PHP:
<span class="status-{status}">
    {message}
</span>
цвета, соответственно, задаются в css
 

mak_sim2001

Новичок
dark-demon
А если выводим результат поиска строчка серым строчка белым пример как можно избавится от логики в шаблоне?

-~{}~ 19.01.08 14:40:

ну, например, так:
<span class="status-{status}">
{message}
</span>
может формально тут нет логики представления но что-бы работать с таким шаблоном нужно эту логику выуживать с тех классов что обрабатывают этот шаблон. Шаблон по моему мнению и есть логика представления и где как не в шаблоне она должна присутсвовать. А писать еще кучу прослоек между логикой отображения и шаблоном как по мне то это не улучшает ни читаемость шаблона ни скорость приложения (ИМХО)
 

Magiys

Новичок
Все с вами ясно товарищи, спасибо за ответы.
P.S. У меня шаблоны видимо без логики, на основе блоков, которые включаются или выключаются. Хотя тут...
 

Духовность™

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

mak_sim2001
правильно
 

atv

Новичок
верстальщик гипотетический должен иметь возможность менять цвета. прикажете леть в код приложения?
Для того чтобы поменять цвета, ему нужно лезть в css файл, там же подставляется не цвет а класс "<span class="status-{status}">".

А вот если понадобиться добавить ещё один статус, тогда понадобятся изменения в коде,а как же, это ведь изменение функциональности.

А если выводим результат поиска строчка серым строчка белым
Опять же, задаём соответствующий класс для строки. Вообще, при использовании компонентов и событийно-ориентированного подхода, вся логика представления красиво укладывается в событие onShow, и не надо далеко ходить.
 

WP

^_^
Шаблон это не какая-то штука с дырками, это программа исполняющая логику представления. Логика может быть простая, или не содержать операторов вообще, но это тоже логика. Если понадобилось сделать "зебру" в таблице, не нужно лезть в исходный код самой программы, достаточно изменить логику представления (шаблон). Кстати, "штука с дырками", частный случай логики представления.
Но, ламерам трудно что-то объяснить, да и не нужно, главное ламеров держать на расстоянии и работать с адекватными людьми :) Поэтому холивар предлагаю закончить.
 

dark-demon

d(^-^)b
угу, а любой текст - это программа для закрашивания пикселей на экране :) и вообще, данных не существует. всё есть программы, пусть и с простой логикой без операторов...
 

atv

Новичок
Шаблон это не какая-то штука с дырками, это программа исполняющая логику представления.
Это шаблонизатор является программой, а "Шаблон - это образец, специальная нотация, разметка, но никак не программа".

Хотя, "ламерам трудно что-то объяснить, да и не нужно, главное ламеров держать на расстоянии и работать с адекватными людьми" :D
 

Духовность™

Продвинутый новичок
atv
В своем примере я привел код-пример, что бы любители "специальной нотации" ответили на вопрос, как быть при такой тривиальной задаче. Оказалось, что имена CSS-классов должна генерировать логика приложения. А шаблонезатор - тупой уродец, задача котрого - заменять $var на {var}.

Если бы я так писал программы, генерируя имена CSS-классов в PHP, меня бы давно выгнали пинками под зад.

Но я о другом - скажи пожалуйста, а если мы хотим WAP-сайт сделать (читай - другая разметка, упрощенная)? Что придется делать? Писать идентичную программу для получения точно таких же данных, что мы получаем, кода пишем программу для web?

-~{}~ 20.01.08 22:39:

Для того чтобы поменять цвета, ему нужно лезть в css файл, там же подставляется не цвет а класс "<span class="status-{status}">".

А вот если понадобиться добавить ещё один статус, тогда понадобятся изменения в коде,а как же, это ведь изменение функциональности.
Вот жесть то! :D А если верстальщику нужно изменить ИМЯ КЛАССА -- поменять status-ок на new-status-ок, он должен звать программиста, что бы тот ему сделал изменения? Тогда в чем суть таких шаблонов, если все опять завязано на программисте?

Я фигею от товарищей, которые считают, что в шаблоне не должно быть логики. ОТ ЛОГИКИ В ШАБЛОНЕ НИКУДА НЕ ДЕТЬСЯ - зарубите это себе на носу.
 
Сверху