Шаблонизатор Smarty. Мухи отдельно, котлеты отдельно

Шаблонизатор Smarty

Smarty – один из самых известных шаблонизаторов. Шаблонизатор нужен для разделения PHP-кода от HTML-кода. Если первый раз с этим сталкиваешься, преимущества такого подхода заметны не сразу, но потом ты удивляешься, как раньше мог обходиться без шаблонов.

  • Smarty довольно быстр (есть и более быстрые шаблонизаторы, но на практике узким местом в проекте является не шаблонизатор, а база данных)
  • Он эффективен, так как PHP делает за него грязную работу.
  • Никакой лишней обработки шаблонов, они компилируются только один раз. Перекомпилируются только те шаблоны, которые изменились.
  • Можно создавать пользовательские функции и модификаторы, что делает язык шаблонов чрезвычайно расширяемым.
  • Конструкции if/elseif/else/endif передаются обработчику PHP, так что синтаксис выражения {if …} может быть настолько простым или сложным, насколько вам угодно.
  • Допустимо неограниченное вложение секций, условий и т. д.
  • Встроенный механизм кеширования.

Рассмотрим примеры с использованием Smarty:

<?php     

// подключаем класс Smarty
require_once('smarty/Smarty.class.php');     

// Создаем объект класса
$smarty = new Smarty();     

// Устанавливаем папки шаблонов
// 'templates' – каталог, в котором хранятся шаблоны
// 'templates_c' - туда Smarty сохраняет скомпилированные шаблоны     

$smarty->template_dir = 'templates';
$smarty->compile_dir  = 'templates_c';      

// Получение данных их БД (в виде ассоциативного массива)
$news = $DB->query("SELECT * FROM news ORDER BY id LIMIT 0,10");     

// передаем массив в шаблонизатор
$smarty->assign('news', $news);     

/* Допустим что наша задача была в простом выводе данных в шаблон, что мы уже и сделали,
и это конечный этап – вызываем метод display() класса smarty, который выводит,
передаёт данные в шаблон, перекомпилирует (если были изменения) и выводит контент.
Методу передается имя файла шаблона, в котором как предполагается был обработан
нужным образом массив news */     

$smarty->display('news.tpl');
?>

Теперь рассмотрим непосредственно файл шаблона news.tpl, фактически это обычный html с вставками переменных и конструкций циклов. Все переменные заключены в фигурные скобки. Шаблон

<html>     

{foreach from=$news item=item}
Заголовок: {$item.title}     

Текст новости:
{item.description}     

<a href="index.php?id={$item.id}" mce_href="index.php?id={$item.id}">Подробнее...</a>
{/foreach}     

</html>

Вот собственно и все, это рабочий пример, который будет выводить 10 извлечённых нами новостей из базы данных. Может показаться, что в данном примере можно было бы обойтись обычным php с html-вставками. Но в большом проекте шаблонизатор заметно упрощает работу с проектом.

Smarty работает на любом хостинге и широко известен (довольно часто я встречал его в вакансиях). Поэтому, гораздо проще будет найти человека, работающего со Smarty нежели с другим шаблонизатором. Не нужно бояться большой документации. Никто не заставляет вас использовать весь потенциал Smarty. Вам потребуется не более 10-20% функциональности Smarty. Сам я работал еще с Blitz, но там совсем другая идеология. В нем нет многих простых фич, которые есть в Smarty. А насчет скорости приведу в пример Flickr, который использует Smarty – еще раз повторюсь, что узкое место это БД и кэширование данных.

Официальный сайт
On-line документация Smarty (на русском)
Скачать русскую документацию Smarty (pdf 0.8 Mb)

#1

Почему-то кругом статьи о смарти звучат как реклама, и используют одни и те же фразы. Но 80% реальных знакомых (не анонимов с форумов) программистов PHP негативно высказываются о нем. И если на столько уж упрощать себе жизнь, то почему бы не взять готовую цмс и не переделать под себя?

max, 9.01.2009 - 12:22
#2

Пасибо большое, давно искал

Darki, 21.03.2009 - 15:06
#3

XSLT всяко правильнее использовать... Хотя по производительности сравнивать не приходилось

Сергей, 10.05.2009 - 16:27
#4

Поддерживаю Макса: и действительно лучше взять хорошую цмску и настроить ее. А со смарти приходится работать потому что есть проекты, которые разрабатывал не я.

Vovovich, 13.07.2009 - 08:46
#5

Нормальные проекты всегда пишу с нуля (используя наработки). А каждый раз думать каким макаром поправить цмс да так чтобы работало... сматри в этом плане удобен - по крайней мере он не рекламируется и не выступает в роли цмс. Не надо путать мух с котлетами ))

Дмирий, 20.07.2009 - 10:42
#6

Бред полный эти ваши Smarty , Объясните зачем мне учить синтаксис этих Smarty причём до горя идиотский если я могу просто все это делать на PHP в самих же шаблонах , я использую только это - http://phpsavant.com/

Elvis, 5.09.2009 - 23:13
#7

Elvis - бред это Savant.
Что легче записать и что более понятно из двух примеров?

Savant
<title><?php echo $this->eprint($this->title); ?></title>

Smarty
<title>{$title}</title>

Ответ очевиден и без всякой рекламы.

Synthetic, 23.09.2009 - 12:37
#8

Как я понял самый большой + смарти это то что подборкой дизайна может заниматься один чел., версткой в готовый шаблон другой а програмить пхп третий и они не будут особо мешать друг другу. Оснобенно для тех кто не знает пхп вполне реально самому натянуть шкурку на свой сайт и не лезть в пхп. Сам только начинаю в это вникать. Посмотрим что получится..

one_man, 29.03.2010 - 03:14
#9

гораздо больше чем смарти мне понравился twig http://twig.kron0s.com/

Дмитрий, 4.04.2010 - 19:33
#10

Когда учил php - СМАРТИ совсем не понял, думаю зачем мне это, мне проще вообще без шаблонизатора...
Потом с увеличением сложности проекта понял что чегото не хватает...
А когда тебе еще потом нужно свой код дать кому-то доработать....

Вот через год поробовал смарти снова - а веть жесткая штука. Ничего сложного там нет вообще, а жизнь сильно упрощает.
Мне особенно пригодилось, когда дизайн за время написания сайта раз 10 меняли. Тут СМАРТИ просто по царски упростил такие манипуляции.

Kolya612, 27.07.2010 - 18:46
#11

-----------------------------------------
#7
-----------------------------------------
Elvis - бред это Savant.
Что легче записать и что более понятно из двух примеров?

Savant
eprint($this->title); ?>

Smarty
{$title}

Ответ очевиден и без всякой рекламы.
-----------------------------------------
еще проще:

к чему лишнее?

php, 7.08.2010 - 16:08
#12

-----------------------------------------
#7
-----------------------------------------
Elvis - бред это Savant.
Что легче записать и что более понятно из двух примеров?

Savant
//eprint($this->title); ?>

Smarty
{$title}

Ответ очевиден и без всякой рекламы.
-----------------------------------------
еще проще:

к чему лишнее?

php, 7.08.2010 - 16:11
#13

А по моему, если разрабатывать проект с нуля, заниматься разметкой и оптимизацией - Smarty самое то. Он прост и эффективен (по словам авторов). Нужно попробовать.

halfhope, 28.10.2010 - 11:57
#14

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

Сергей, 1.11.2010 - 12:12
#15

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

ChudoChudo, 14.11.2010 - 11:28
#16

"Шаблонизатор нужен для разделения PHP-кода от HTML-кода" - да, действительно нужен. Но вот сама идея разделения PHP и HTML кода сама по себе ущербна - переменные создаются в одном файле ($smarty->assign('news', $news)), потом передаются в шаблон, там верстальщик обязательно знает о внутреннем устройстве этих переменных, где массив, где просто строка, какие ключи массива и т.д. - т.е. верстальщику уже приходится думать о PHP коде и заглядывать в php сценарий. Тут же попутно ему это все нужно втиснуть в базовый синтаксис smarty, т.е. - +1 язык, на котором нужно думать. Нельзя отделять мух от котлет! Меняет что-то программист - должна меняться и часть шаблона smarty, обрабатывающая этот код; понадобилась верстальщику дополнительная переменная - он долбит программиста. Так что лучше с умом подойти к структуре проекта, использовать встраивание HTML-кода, чем вместо писать {$item.id}.

akeiro, 14.11.2010 - 13:54
#17

Смарти штука очень полезная, одно только бесит - когда используешь JQuery прямо в коде приходится использовать {literal}{/literal}. Мелочь, вроде бы не страшно, но лень великая и страшная вещь при борьбе с которой страдают нервы в основном.

Дмитрий, 5.01.2011 - 22:07
#18

Некоторые CMS используют Smarty, например ShopCMS. Практически не нужно изучать саму CMS, но нужно знать Smarty!

yakmax, 9.01.2011 - 22:52
#19

да хватит вам ерундой заниматься. Учить смарти, что там учить? как циклы или условные конструкции писать? или как плагин написать? страшные мучение!!!

в нем без проблем разберется любой, кто даже не знает php. А кто знаком, вообще проблем не будет!

romka, 5.06.2011 - 22:00
#20

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

Eisenmann, 27.06.2011 - 20:56
#21

More posts of this quliaty. Not the usual c***, please

Elida, 18.07.2011 - 22:51
#22

Shoot, so that's that one spupoess.

Destrie, 20.07.2011 - 16:50
#23

Заспамили тему, говоруны. Да пищите на чем угодно, какое кому дело до ваших комплексов? Тут разбирается конкретное применение.
Откуда взялось $DB ?

forenc, 8.12.2011 - 23:02
#24

это класс для работы с MySQL
http://ekimoff.ru/42/

admin, 9.12.2011 - 00:30
#25

о admin на высоте! Спасиба. А применение этой библиотеки не влияет на скорость обработки?

forenc, 11.12.2011 - 19:18
#26

Использую Smarty уже 5 лет, сделал не одну сотню сайтов - полёт нормальный :)))

SaintRain, 10.02.2012 - 15:58
#27

Попросили подработать сайт, который сделан на Smarty.
До этого не приходилось иметь с ним дело, так вот -
заняло у меня времени меньше часа ( установил БД и разбирался с таблицами и вносил изменения). Изменил 2 файла
логику и представление. Не думаю, что верстальщик справился бы сам. Разделение логики и представления всегда надуманно, лишь подпасть под категорию MVC.

bracomp, 13.04.2012 - 06:42
#28

Разделение логики от представления(MVC) - шаг от создания сайта "на коленке" к серьезному проекту. Вы потому и смогли разобраться за "меньше часа" что было разделение.

Антон, 3.08.2013 - 20:58
Оставить комментарий