Разные шаблонизаторы. Плюсы и минусы.

BubenPupen

Новичок
Ну так что, кто-нибудь приведет мне примеры, где Smarty лучше чем native php ?
 

HraKK

Мудак
Команда форума
diamond_krnl
В IE7 выскакиевает ошибка и закрывается
 

Фанат

oncle terrible
Команда форума
BubenPupen
примеры эти стандартные, всем давно известные.
вот только надо понимать, что именно в них Smarty лучше чем native php. И только в них. А не в целом.
А то назовешь оди нпример человеку - он тут же бегает и кричит, что смарти всегда лучше пхп.
или наоборот, его не устраивает в сеобхемлющесть и однозначность превосходства.
 

BubenPupen

Новичок
Фанат
вот только надо понимать, что именно в них Smarty лучше чем native php. И только в них. А не в целом.
Ну это то понятно, но с другой стороны, если таких примеров превосходства много, то можно говорить и о превосходстве самого шаблонизатора.

примеры эти стандартные, всем давно известные.
Я совсем недавно заинтересовался шаблонами, не озвучишь парочку ? Или может быть статья есть какая-то сравнительная.
 

Фанат

oncle terrible
Команда форума
статей, как раз, нету вообще.
потому что статьи пишут в основном лохи, впервые два дня назад увидевшие шаблон.

пример хрестоматийный - ограничение верстальщику доступа к коду
пример недавний - вывод дерева. на чистом пхп надо писать рекурсивную функцию В ШАБЛОНЕ.
 

BubenPupen

Новичок
Фанат
пример хрестоматийный - ограничение верстальщику доступа к коду
Да, проблема имеет место быть.
Если настолько не доверять верстальщикам, то можно придумать решение.
Допустим, сделать так, чтобы он мог заливать шаблоны только через форму, те в свою очередь проверялись на допустимые функции и если проверка пройдена перемещать шаблоны в рабочую директорию.

пример недавний - вывод дерева. на чистом пхп надо писать рекурсивную функцию В ШАБЛОНЕ.
Хм, это смотря какое дерево.

Данные
PHP:
$tree = array(
                      array('level' => 0, 'value' => 'Новости'),
                      array('level' => 1, 'value' => 'Вчера'),
                      array('level' => 1, 'value' => 'Сегодня'),
                      array('level' => 2, 'value' => '1'),
                      array('level' => 2, 'value' => '2'),
                      );
Шаблон
PHP:
<? foreach($tree as $item): ?>
    <?=str_repeat("    ", $item['level'])?>- <?=$item['value']?><br />
<? endforeach; ?>
Вывод
PHP:
- Новости
    - Вчера
    - Сегодня
        - 1
        - 2
 

Фанат

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

BubenPupen

Новичок
Фанат
я считаю, что набор используемых в шаблоне операторов пхп сдолжен быть жёстко ограничен.
в противном случае получится всё тот же винегрет
Ты про str_repeat ? Можно ее засунуть в хэлпер.
PHP:
<?=$html->repeat("    ", $item['level'])?>
А дерево в той теме какое было ? Похожее ?
Помоему, если дерево "отсортировано", то чтобы его вывести рекурсия не обязательна.
 

Фанат

oncle terrible
Команда форума
не обязательна, но код в результате начинает очень мало отличаться от чистого, без хтмл, кода на пхп.
 

BubenPupen

Новичок
Фанат
не обязательна, но код в результате начинает очень мало отличаться от чистого, без хтмл, кода на пхп.
Ну не знаю, не знаю. Например, обычный вывод древовидных комментариев:

PHP:
<? foreach($comments as $comment): ?>
<div class="comment" style="padding-left: <?=$comment['level']*10?>">
    <?=$comment['text']?>
</div>
<? endforeach; ?>
Не вижу тут ничего плохого.
Можно создать переменную $padding и вычислять ее до div'a

-~{}~ 05.02.07 03:46:

Ну, с выводом дерева мы разобрались, еще какие-нибудь примеры будут ?
 

hermit_refined

Отшельник
Ну, с выводом дерева мы разобрались, еще какие-нибудь примеры будут ?
это вы просто такой вывод сделали.
если потребуется вложенными дивами или списками - код помонструозней будет.
Если настолько не доверять верстальщикам, то можно придумать решение.
тут дело не столько в недоверии, сколько в разграничении епархий.
есть такие верстальщики, которым только дай возможность - запросы к базе начнут фигачить. вполне предсказуемого качества.
кроме того, приятно иной раз иметь уверенность, что после обработки шаблона все переменные и настройки скрипта останутся теми же самими, что и до. причем это не размышления, а опыт части впустую потраченного мною времени и нервов ;-)
 

С.

Продвинутый новичок
Фанат, если не расширать множество операторов (см. дерево) и не позволять генерить какие-то части HTML (см. input), то как раз винегрет и получится. Либо ничего не получится, потому что пользоваться будет неудобно. Ты же сам в это уже уперся. Надо просто это как-то идеологизировать и создать методику. Модель движка, наконец.

Я начинал это делать, но в связи с насущными задачами не смог выдержать парадигму и ударился во все тяжкие.
 

Angerslave

Новичок
Мне лично сложно переориентироваться и если я в шаблоне начну юзать PHP, то встанет перед подсознанием вопрос: а почему я должен раздваивать код, выносить какую-то логику из контроллера, когда можно написать функцию, которая не будет заниматься выводом конкретно HTML, а будет выводить массив к примеру, затем подставляя его в шаблон... Поэтому я сначала выбрал xtpl, но когда встала задача сделать вывод страниц, я перешёл на смарти. Сознанию проще, когда заходя в файл шаблона ты включаешь "шаблонный язык" и понимаешь, что городить запросы к базе здесь не стоит, а заходя в скрипт включается мышление программиста, и понимаешь, что здесь оператор echo использовать не стоит... ИМХО
 

jonjonson

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

Angerslave

Новичок
Честно говоря немного непривычно, что в смарти можно ставить условия. То есть в xtpl просто определяешь нужные блоки и в контроллёре вызываешь парсинг... Но в шаблоне смарти именно логика вывода, это ещё нормально, но когда в шаблоне начинаются определения функций, это, имхо, перебор.
 

Фанат

oncle terrible
Команда форума
С.
в связи с насущными задачами не смог выдержать парадигму и ударился во все тяжкие.
Ты полагаешь это временной трудностью.
А это может быть системным недостатком.
Создатели Смарти ведь ударились. А там тоже не дураки сидят.

-~{}~ 05.02.07 12:56:

BubenPupen
Хороший пример. уважаю.
я делал с <ul>, а там необходимость закрывать тег приводила к усложнению кода.

-~{}~ 05.02.07 12:59:

Angerslave
встанет перед подсознанием вопрос: а почему я должен раздваивать код,
этот вопрос должен встать ДО того, как ты вообще начнёшь пользоваться шаблонами.

Система шаблонов - это не мент с дубинкой, который бьёт тебя по рукам, если ты хочешь слишкоммного логики засунуть в шаблон. Если ты сам для себя не решишь разделять логику приложения и логику представления, за тебя это не сделает никто - и даже шаблонизатор

-~{}~ 05.02.07 13:05:

Честно говоря немного непривычно, что в смарти можно ставить условия. То есть в xtpl просто определяешь нужные блоки и в контроллёре вызываешь парсинг
хохо.
думать, что в XTPL отсутствует логика - все равно, что думать, будто спрятался от охотника, сунув глову в песок.

Те самые абстрактные блоки, которые имеются в шаблоне, ПО СУТИ СВОЕЙ являются теми же самыми операторами - циклов, условных переходов, инклюдов.
пример:
Код:
<!-- BEGIN: row -->
<tr>
<td>{ROW_NR}</td>
<td>{DATA.ID}</td>
<td>{DATA.NAME}</td>
<td>{DATA.AGE}</td>
</tr>
<!-- END: row -->
это же самый, что ни на есть, оператор цикла!

а
Код:
<!-- BEGIN: books -->
{author}{title}
<!-- END: books -->
<!-- BEGIN: nobooks -->
<p>There are no books to display.</p>
<!-- END: nobooks -->
- это условный переход в чистом виде!

НО! при этом на них нигде не написано, что первый - это цикл, а второй - условный переход. Мы можем об этом только догадываться. получается, логика в шаблоне есть, но какая-то нечёткая.

отсюда мы делаем два вывода:
1. Логика в таких шаблонах ЕСТЬ. Никуда она не девается. Cоставитель шаблона должен чётко понимать, что будет делать вставляемый им блок. То есть, должен иметь представление о базовых понятиях программирования.
2. Жуткое неудобство заключается в том, что из синтаксиса оператора непонятно - что он делает.
То есть, элементарно снижается читабельность программы, реализующей логику отображения.

Получается, что мы занимаемся самообманом, и при этом ещё и делаем себе же хуже.
 

AmdY

Пью пиво
Команда форума
фанат прав, имел дело с этим <!-- BEGIN: row --> ... <!-- END: row -->, в некоторых местах использовал как IF, но без пхп кода, попробуй догадайся почему я так сделал.
 
Сверху