|  Как написано в Википедии smarty - это компилирующий обработчик шаблонов для PHP, один из инструментов, позволяющих отделить прикладную логику и данные от представления. 
А, говоря простым языком, это означает следующее. Как Вы знаете, сайт состоит из различных информационных блоков (новости, навигационное меню, реклама, ссылки) и просто графической обшивки (дизайна). Даже сам основной контент сайт, это всего лишь блок, который содержит индивидуальный текст для каждой странички сайта.
 
Теперь представьте себе, каждый такой блок хранится в обычной переменной, а переменная вставляется в обычную html страничку, и в результате получается уникальная страничка. А уникальна она тем, что в каждую страничку вставляется переменная, которая отличное от предыдущей странички значение.
 
Таким образом и работает шаблонная технология smarty. У Вас есть шаблон страницы, красиво оформленной html странички, но без текстового наполнения. Текст Вы можете, например, получать из базы данных, заносить его в переменную, потом переменную вставлять в оформленную html страничку и выдавать ее пользователю. Что же тут особенного, а то, что для создания красивого сайта, Вам понадобится лишь одна или несколько универсальных страничек, красиво оформленных, а создавать на основе ее Вы можете 1000-чи уникальных информационных страниц сайта.
 
Давайте, рассмотрим небольшой пример созданного сайта на основе шаблонной технологии Smarty и Вам все станет понятно.
Тест-платформой сделаем бесплатно скачанный шаблон с уже готовыми рисунками и библиотекой css. Сайт, который мы собираемся сделать будет выглядеть примерно как на рисунке. Как Вы видите на рисунке, сайт будет состоять из навигационного меню (слева, вверху), новостного блока (слева, внизу) и контентной (текстовой) части (справа, ниже). Таким образом, наш шаблон будет состоять из всех элементов, кроме вот этих блоков. На каждой страничке сайта будет свой уникальный контент. А что касается новостей и навигационного меню, то хотя они и будут повторятся, однако они могут динамически изменятся, например, добавятся свежие новости, или появится новое подменю.
 
Итак, пример динамического сайта с использованием smarty будет состоять 3-x шагов:
 
Для того, чтобы Вы не тратили свое время на перекопированние кода, который наведен ниже, можете скачать уже готовый пример (в готовом примере работает три первые ссылки в главном меню и генерируется блок новостей) и изучить его так сказать изнутри. Проект требует установленного web-сервера и php. Создайте какую-то тестовую папку на Web-сервере и настройте виртуальный хост. Проект будет состоять из набора следующих папок и файлов:1 шаг - создать папку с библиотекой smarty, которую надо подключить;
2 шаг - написать код php, в котором будут наши переменные и которые в последствие будут вставляться в шаблон, а также подключить библиотеку Smarty;
3 шаг - создать сам шаблон, куда все будем вставлять.
 
[..]
  [smarty_library] 				- это папка с библиотекой smarty, переписываем всю ее сюда; 
  [tpl] - папка с шаблонами; 
  [cache] 
  [configs] 
  [templates] 
  [index.tpl]
- это наш основной шаблон страницы 
  [news.tpl]
- это вспомогательный шаблон страницы 
  [templates_c] 
  [images] - папка с рисунками; 
  [css] - папка с css стилями; 
  [index.php] - непосредственно наш индексный файл. 
Ну что ж, давайте сделаем первый шаг навстречу сайту и установим библиотеку smarty.
 
Для начала работы со smarty, скачайте его последнюю версию на официальном сайте http://www.smarty.net/download.php. Пакет smarty абсолютно бесплатный, так что кряк искать не придется :) Если вы скачали и распаковали пакет, там будет всякого добра полно, но Вам непосредственно нужны все файлы и папки в папочке libs (это и есть библиотека smarty, все остальное на не нужно). 
 
Ее содержание будет выглядеть вот так:
 
[..]
  [internals] 
  [plugins] 
  [Config_File.class.php] 
  [debug.tpl] 
  [Smarty.class.php] - этот файл мы будем подключать для вызова библиотеки Smarty 
  [Smarty_Compiler.class.php] 
 Перекопируйте все это, со всем содержимым внутри, в папку нашего проекта  [smarty_library]. Далее создайте папку  [tpl], а в ней подкаталоги
 
Теперь переходим ко второму шагу и создаем файл  [index.php]. Содержимое файла будет следующее:
 
 <?php /*********************** подключаем библиотеку smarty ***********************/ define('SMARTY_DIR','smarty_library/');require(SMARTY_DIR.'Smarty.class.php'); $smarty = new Smarty ();//объект smarty $smarty->template_dir='tpl/templates/';//указываем путь к шаблонам$smarty->compile_dir='tpl/templates_c/';$smarty->config_dir='tpl/configs/';$smarty->cache_dir='tpl/cache/';  /***************************** создаем переменные php ************************/ $arr_meta_tags['title'] = "Мой личный хостинговый сайт";$arr_meta_tags['keywords'] = "хостинг, площадка, хостинг-услуги";$arr_meta_tags['description'] = "Лучший хостинговый сайт предоставит хостинг-услуги по оптимальным ценам";$arr_meta_tags['content'] = "Хостинг - это услуга, по размещению вашего сайта на сервере, за которым следят квалифицированные специалисты, поддерживающие его работоспособность 24 часа в сутки и 7 дней в неделю. Не многие хостинг-компании способны предоставить хорошие условия, и только единицы могут дать приемлемое для вас соотношение цены и качества. Таковой компанией является Hostland."; $arr_meta_tags['news'] = array ('1' => array('date' => '09/12/2008', 'title' => 'Смена банковских реквизитов', 'text' => 'Уважаемые клиенты, обращаем Ваше внимание на то, что с 29 октября 2008 года у нас сменились реквизиты.'), '2' => array('date' => '11/12/2008', 'title' => 'Обновление линейки тарифных планов', 'text' => 'Теперь на всех наших тарифах еще больше места, еще больше доменов.')); /********************************** производим анализ ************************/ if (!empty($_REQUEST['page']) && $_REQUEST['page'] == "about") {$arr_meta_tags['content'] = "С каждым днем растет число сайтов созданных для развлечений - это сайты об играх, фан сайты, сайты досуга, в том числе <домашние> страницы и т.д. Никогда еще не было так просто, чем сегодня, открыть свой сайт. И если для бизнес проектов важным аспектом выбора хостинга является стабильность и надежность, то для некоммерческих, мало бюджетных сайтов главным оставалось и остается - доступность, т.е. невысокая цена. Мы предлагаем уникальное решение, делая свои услуги доступным для всех пользователей сети и даем гарантии качества и надежности.";}  if (!empty($_REQUEST['page']) && $_REQUEST['page'] == "our_clients") {$arr_meta_tags['content'] = "Уважаемые клиенты, уважаемые пользователи!Коллектив компании Hostland.Ru от всей души поздравляет Вас с наступающим новым годом.Этот год был очень насыщенным для нашей компании, мы славно потрудились, но многое впереди!Мы поздравляем Вас, желаем всем успехов в бизнесе, благополучия в семье и крепкого здоровья! С НОВЫМ ГОДОМ!";} /************* передаем значение переменных php в переменные smarty *************/ $smarty->assign('title',$arr_meta_tags['title']);$smarty->assign('keywords',$arr_meta_tags['keywords']);$smarty->assign('description',$arr_meta_tags['description']);$smarty->assign('news',$arr_meta_tags['news']);$smarty->assign('content',$arr_meta_tags['content']); $news_tpl = $smarty->fetch("news.tpl");$smarty->assign('blok_news',$news_tpl); /*********************** запускаем показ шаблона smarty ************************/ $smarty->display("index.tpl");  ?>
 
Давайте, кратко пройдемся по содержимому файла. Итак, начинается файл с подключения библиотеки smarty, для этого мы прописываем путь к библиотеке, создаем объект и прописываем для объекта пути к шаблонам. 
 
Папки templates_c, configs и cache являются системными для библиотеки, а детально про это Вы можете почитать в документации FAQ Smarty.
 
Далее мы создаем текстовые переменные, из которых информация будет вставляться в шаблон. На практике всю информацию Вы будете хранить в отдельных файлах или в базах данных. 
 
Под анализом данных в примере подразумевается проверка поступлений с помощью методов Get или Post переменной 'page' со значениями, которые обозначают какую страницу запросил пользователь. В данном примере будут создаваться 3 уникальные странички - это "Главная", "Про нас", "Наши клиенты". Остальные Вы сможете создать немного разобравшись и модернизировав этот пример.
 
И, наконец, самая интересная часть - передача значений переменных php в переменные smarty. Как видите, делается это простой операцией: $smarty->assign('description',$arr_meta_tags['description']), где description - это будущее имя переменной smarty, а $arr_meta_tags['description'] сама переменная php.
 
Остановимся на таком моменте, посмотрите на эту функцию: $news_tpl = $smarty->fetch("news.tpl"). Знаете что она делает? Присваивает переменной php уже готовый блок новостей. Как же он появился, ведь у нас была лишь переменная php массива с новостями? А все очень интересно, smarty позволяет создавать множество дополнительных шаблонов, которые создаются с помощью функции fetch, а потом встраиваются в основной шаблон . Давайте посмотрим из чего состоит дополнительный шаблон  [news.tpl]:
 
 {foreach from=$news item=new} <div style="font-size:12px;padding-bottom:16px;"><span style="font-size:11px;">{$new.date}</span><br><span style="font-weight:bold;">{$new.title}</span><br>{$new.text}<br><span style="font-size:10px;"><a href="#">подробнее</a></span></div> {/foreach}
 
Если Вы уже знакомы с языками программирования и работой с массивами, то команда foreach будет Вам знакома. А если еще не успели, то Вы должны знать, что smarty поддерживает небольшой перечень логических структур управления и среди них такие как: if и foreach. Команда foreach работает с массивами и означает что с каждым элементом массива (в данном случае $news) выполнить нижеследующий код. И таким образом, внутренняя переменная new будет в порядке очереди каждым элементом массива $news. Чтобы все понять комплексно, еще раз вернемся назад и посмотрим на такую цепочку в файле  [index.php]:
 
 $arr_meta_tags['news'] = array ('1' => array('date' => '09/12/2008', 'title' => 'Смена банковских реквизитов', 'text' => 'Уважаемые клиенты, обращаем Ваше внимание на то, что с 29 октября 2008 года у нас сменились реквизиты.'), '2' => array('date' => '11/12/2008', 'title' => 'Обновление линейки тарифных планов', 'text' => 'Теперь на всех наших тарифах еще больше места, еще больше доменов.')); //создаем массив из новостей$smarty->assign('news',$arr_meta_tags['news']);//создаем массив $news (она же переменная smarty) с новостями$news_tpl = $smarty->fetch("news.tpl");/*обработали дополнительный шаблон, с каждым элементом и подэлементом массива выполнили код и занесли в переменную php уже готовый блок новостей*/
 
Если Вы еще не поняли, как обрабатывать дополнительные шаблоны, оставьте это на потом, в первое время можно обойтись и без этого.
 
Следующим и последним третьим шагом будет создание основного шаблона, в котором в определенных местах будут находится переменные smarty. Давайте посмотрим содержимое файла  [index.tpl]:
 
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>{$title}</title><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><META HTTP-EQUIV="Pragma" content="no-cache"><META HTTP-EQUIV="Expires" Content="Mon, 28 Mar 1999 00:00:01 GMT"><meta name="Document-state" content ="Dynamic"><meta name="description" content="{$description}"><meta name="keywords" lang="ru" content="{$keywords}"><meta name=Robots content="all"> <link href="css/style.css" rel="stylesheet" type="text/css"> </head> <body> <div id="wrap"><div id="conteiner"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tr valign="top"><td width="235" style="background:url(images/lbg.gif); background-position:right; background-repeat:repeat-y;"> <div class="company_name">Web-хостинговые услуги</div><div class="company_name_shadow">Web-хостинговые услуги</div><img src="images/p2.jpg" alt="image"><div class="lmenu"><a href="?page=main">Главная</a> <a href="?page=about">Про нас</a> <a href="?page=our_clients">Наши клиенты</a><a href="#">Площадки</a><a href="#">Наши цены</a><a href="#" style="background:url(images/lbullet2.gif);background-repeat: no-repeat;background-position: 14px 8px;">Контакты</a> </div><div class="lblock"><h2>Поcледние новости</h2> {$blok_news} </div> </td><td ><table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td><img src="images/p1.jpg" alt="" width="515" height="267"></td></tr><tr><td class="body_txt"><h1>Приветствуем Вас на нашем хостинговом сайте!</h1> {$content} <br></td></tr></table></td></tr></table></div></div><div id="footer"><div class="bottom_menu"><a href="#">Главная</a> <a href="#">Про нас</a> <a href="#">Наши клиенты</a><a href="#">Площадки</a><a href="#">Наши цены</a><a href="#">Контакты</a></div><div class="bottom_addr">© 2008 Company Name. Все права защищены.</div></div> </body></html>
 
Вы видите обычную страничку html, а в ней {$keywords} такого рода символы. Эти символы, согласно синтаксиса библиотеки smarty, ее переменные. Их значение мы устанавливаем в файле  [index.php] таким вот способом: $smarty->assign('keywords',$arr_meta_tags['keywords']);//где keywords означает {$keywords} в шаблоне
 
В шаблон можно передавать массив, и соответственно в скрипте лучше выполнить 
 
 $smarty->assign('meta_tags',$arr_meta_tags); 
вместо 
 
 $smarty->assign('title',$arr_meta_tags['title']); $smarty->assign('keywords',$arr_meta_tags['keywords']); $smarty->assign('description',$arr_meta_tags['description']); $smarty->assign('news',$arr_meta_tags['news']); $smarty->assign('content',$arr_meta_tags['content']);
 
А в шаблоне подтянуть значения: {$meta_tags.content} и т.д. Если же сделать так:
 
 $smarty->assign($arr_meta_tags); 
то на выходе мы получим те же переменные, что и в примере ($title, $keywords и т.д.).  
 
Кроме того, во избежание ошибок правильнее проверять в шаблоне существование выводимой переменной: {if isset($a)}{$a}{/if} ... 
 
Ко всему выше добавлю что использование smarty значительно облегчит Вашу задачу по созданию своего сайта. Сделав один шаблон, Вы можете создавать на основе немного множество интересных страниц сайта. А использование дополнительных шаблонов, дает Вам возможность любую конструкцию Ваших страниц. Удачи!
 |