По всем вопросам пишите на webmaster@info-pages.com.ua. Вы можете свободно использовать/размещать/перепечатывать статьи сайта всего лишь указав ссылку на источник.
Что такое smarty и как его использовать
Использование smarty для создания сайта
Размещено: 01 декабря 2008
Как написано в Википедии smarty - это компилирующий обработчик шаблонов для PHP, один из инструментов, позволяющих отделить прикладную логику и данные от представления.
А, говоря простым языком, это означает следующее. Как Вы знаете, сайт состоит из различных информационных блоков (новости, навигационное меню, реклама, ссылки) и просто графической обшивки (дизайна). Даже сам основной контент сайт, это всего лишь блок, который содержит индивидуальный текст для каждой странички сайта.
Теперь представьте себе, каждый такой блок хранится в обычной переменной, а переменная вставляется в обычную html страничку, и в результате получается уникальная страничка. А уникальна она тем, что в каждую страничку вставляется переменная, которая отличное от предыдущей странички значение.
Таким образом и работает шаблонная технология smarty. У Вас есть шаблон страницы, красиво оформленной html странички, но без текстового наполнения. Текст Вы можете, например, получать из базы данных, заносить его в переменную, потом переменную вставлять в оформленную html страничку и выдавать ее пользователю. Что же тут особенного, а то, что для создания красивого сайта, Вам понадобится лишь одна или несколько универсальных страничек, красиво оформленных, а создавать на основе ее Вы можете 1000-чи уникальных информационных страниц сайта.
Давайте, рассмотрим небольшой пример созданного сайта на основе шаблонной технологии Smarty и Вам все станет понятно.
Тест-платформой сделаем бесплатно скачанный шаблон с уже готовыми рисунками и библиотекой css. Сайт, который мы собираемся сделать будет выглядеть примерно как на рисунке слева. Как Вы видите на рисунке, сайт будет состоять из навигационного меню (слева, вверху), новостного блока (слева, внизу) и контентной (текстовой) части (справа, ниже). Таким образом, наш шаблон будет состоять из всех элементов, кроме вот этих блоков. На каждой страничке сайта будет свой уникальный контент. А что касается новостей и навигационного меню, то хотя они и будут повторятся, однако они могут динамически изменятся, например, добавятся свежие новости, или появится новое подменю.
Итак, пример динамического сайта с использованием smarty будет состоять 3-x шагов:
1 шаг - создать папку с библиотекой smarty, которую надо подключить;
2 шаг - написать код php, в котором будут наши переменные и которые в последствие будут вставляться в шаблон, а также подключить библиотеку Smarty;
3 шаг - создать сам шаблон, куда все будем вставлять.
Для того, чтобы Вы не тратили свое время на перекопированние кода, который наведен ниже, можете скачать уже (в готовом примере работает три первые ссылки в главном меню и генерируется блок новостей) и изучить его так сказать изнутри. Проект требует установленного web-сервера и php. Создайте какую-то тестовую папку на Web-сервере и настройте виртуальный хост. Проект будет состоять из набора следующих папок и файлов:
[..] [smarty_library] - это папка с библиотекой smarty, переписываем всю ее сюда; [tpl] - папка с шаблонами; [cache] [configs] [templates] [index.tpl]
- это наш основной шаблон страницы [news.tpl]
- это вспомогательный шаблон страницы [templates_c] [images] - папка с рисунками; [css] - папка с css стилями; [index.php] - непосредственно наш индексный файл.
Ну что ж, давайте сделаем первый шаг навстречу сайту и установим библиотеку smarty.
Для начала работы со smarty, скачайте его последнюю версию на официальном сайте . Пакет smarty абсолютно бесплатный, так что кряк искать не придется :)
Если вы скачали и распаковали пакет, там будет всякого добра полно, но Вам непосредственно нужны все файлы и папки в папочке libs (это и есть библиотека smarty, все остальное на не нужно).
Ее содержание будет выглядеть вот так:
[..] [internals] [plugins] [Config_File.class.php] [debug.tpl] [Smarty.class.php] - этот файл мы будем подключать для вызова библиотеки Smarty [Smarty_Compiler.class.php]
Перекопируйте все это, со всем содержимым внутри, в папку нашего проекта [smarty_library]. Далее создайте папку [tpl], а в ней подкаталоги
Теперь переходим ко второму шагу и создаем файл [index.php]. Содержимое файла будет следующее:
$smarty->template_dir='tpl/templates/';//указываем путь к шаблонам
$smarty->compile_dir='tpl/templates_c/';
$smarty->config_dir='tpl/configs/';
$smarty->cache_dir='tpl/cache/';
$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, для этого мы прописываем путь к библиотеке, создаем объект и прописываем для объекта пути к шаблонам.
Папки 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 будет Вам знакома. А если еще не успели, то Вы должны знать, что 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">
Вы видите обычную страничку html, а в ней {$keywords} такого рода символы. Эти символы, согласно синтаксиса библиотеки smarty, ее переменные. Их значение мы устанавливаем в файле [index.php] таким вот способом:
$smarty->assign('keywords',$arr_meta_tags['keywords']);//где keywords означает {$keywords} в шаблоне
Ну вот, пожалуй и все, еще раз напоминаю, что Вы можете готовый и работающий вышеприведенный пример сайта с использованием шаблонной технологии smarty (в готовом примере работает три первые ссылки в главном меню и генерируется блок новостей).
Ко всему выше добавлю что использование smarty значительно облегчит Вашу задачу по созданию своего сайта. Сделав один шаблон, Вы можете создавать на основе немного множество интересных страниц сайта. А использование дополнительных шаблонов, дает Вам возможность любую конструкцию Ваших страниц. Удачи!
Есть движок, написанный на Smarty - это ShopScript, скачать, разобраться, все станет ясно. ЧПУ делается прописыванием rewrite_mod в htaccess и потом или сделать подключаемую функцию, которая розпарсит строку или через класс.
Насчет совета с подключеним массивов делать так всегда. Только совет использовать isset в шаблоне это неверно, все нужно делать в обработчике. В шаблон всегда должны передаваться значение переменной массива, а в шаблоне только вывод значение, меньше кода. Для того и созданы шаблоны чтобы код отделить от дизайна.
12:04 20.01.12
lex
спасибо, мда опыта просто не хватает
22:40 17.12.09
admin
Вам нужно определится со структурой сайта:
1. вариант - в корне сайта лежит индексный файл index.php, который запускается всегда когда обращаются к серверу. Далее этот файл/скрипт с помощью функци include/require подключает другие скрипты. В зависимости от полученных данных они выполняют код, передают данные в шаблон и выводят на экран результат.
Все ссылки создаются вида: index.php?...
либо используйте rewrite_mod.
2. вариант - создаются папки с ассоциативным названием (например, news, contact, articles и т.д.) в каждой папке есть свой index.php который в свою очередь подключает нужные скрипты и выдает ответ.
Все ссылки получаются типа: /news/index.php?..
Я бы вам рекомендовал использовать первый вариант, так как второй вариант более подходит для сайтов использующих ООП.
21:36 17.12.09
admin
в самом начале страницы выводит скорее всего, потому что в файле "process.php" у Вас идет вывод.
На этом этапе $arr_meta_tags['content'] = include("process.php"); уже пошел вывод информации. И такое выражение тоже довольно интересное. Так никто не пишет. В файле "process.php" присвойте любой переменной значение (например $test), потом просто подключите include_once("process.php");
и далее пишите так: $arr_meta_tags['content'] = $test; Потому у Вас и дизайн выводится внизу, так как Вы вывели данные до их обработки в smarty.
21:25 17.12.09
lex
и еще не могу понять в каую папку запехивать скрипты что бы они работали через сайт т.к. приведенный фрагмент создает форму при клике на кнопку которой браузер перходит на страничку со скриптом
17:48 17.12.09
lex
угу понятно, а вот допустим пример
if (!empty($_REQUEST['page']) && $_REQUEST['page'] == "quote_form.php") {
$arr_meta_tags['content'] = include("process.php");}
вставил вот таую штучку, что бы вывести страницу на php, выводит но только почему то в самом начале страницы а потом лишь идет дизайн, как быть?
17:21 17.12.09
admin
связать токо через php, в php брать данные из mysql и вставлять в smarty
если надо без дополнительного скрипта можете использовать {php}{/php}
12:55 16.12.09
lex
В целом все понятною Спасибо за урокю А подсказать не можете, как его с базой майскьюл связать?
23:41 15.12.09
Andy
сорри за критику, понимая что это всего-навсего пример, рискну сказать, что в таком виде лучше не делать. во-первых, в шаблон можно передавать массив, и соответственно в скрипте выполнить
$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} и т.д.
кроме того, во избежание ошибок наверное правильнее было бы проверять в шаблоне существование выводимой переменной: {if isset($a)}{$a}{/if} ...
17:11 20.11.09
admin
все правильно, обычно я так и делаю, работать с массивом это профессионально, но это понятный пример для тех, кто еще не работает с массивами. А если сделать так: $smarty->assign($arr_meta_tags); то на выходе мы получим те же переменные, что и в примере ($title, $keywords и т.д.).
18:07 20.11.09
VicAMMON
Потрясающий урок, все описано кратко, понятно, доступно, но в полной мере.
Автору уважуха !!! ;)
20:54 26.05.09
maxmax
класный пример)
06:38 21.04.09
Hapster
полностью согласен с bonemurder"ом. Тем более, что столкнулся с очень похожей задачей. Автору большое спасибо - побольше таких уроков
01:58 21.04.09
atwa
СПАСИБО
Мне как нубу в системах управления сайтами этот пример очень помог ^_____^ буду рекомендовать.
11:17 09.04.09
bonemurder
очень дельный пример)))меня просто, мягко говоря, задолбало изучение документации для бывалых программеров))) как говорицца для чайников...я бы хотел получить у вас платную консульацию, так как я обычный начинающий дизайнер, который повелся на рекламу шоп-скрипта(простоты и гибкости изменения шаблонов под инет магазин)...у меня задача несколько усложнена внедрением поисковой формы в инет магазин по категориям(а я деревянный как стекло)..заранее благодарен
23:30 10.02.09
admin
добавить ссылку можно точно также как и текст, просто пропишите вместо него, например <a href="#">текст ссылки</a>, а вообще скачайте пример и детально посмотрите что и как делается, другого такого примера Вы больше навряд ли найдете
22:49 02.02.09
Джек
круто конечно, а как добавить ссылку, но только чтобы она была на одной странице?