Самостоятельное создание сайта
Самостоятельная раскрутка и продвижение сайта

Использование smarty

   Как написано в Википедии smarty - это компилирующий обработчик шаблонов для PHP, один из инструментов, позволяющих отделить прикладную логику и данные от представления.
   А, говоря простым языком, это означает следующее. Как Вы знаете, сайт состоит из различных информационных блоков (новости, навигационное меню, реклама, ссылки) и просто графической обшивки (дизайна). Даже сам основной контент сайт, это всего лишь блок, который содержит индивидуальный текст для каждой странички сайта.
   Теперь представьте себе, каждый такой блок хранится в обычной переменной, а переменная вставляется в обычную html страничку, и в результате получается уникальная страничка. А уникальна она тем, что в каждую страничку вставляется переменная, которая отличное от предыдущей странички значение.
   Таким образом и работает шаблонная технология smarty. У Вас есть шаблон страницы, красиво оформленной html странички, но без текстового наполнения. Текст Вы можете, например, получать из базы данных, заносить его в переменную, потом переменную вставлять в оформленную html страничку и выдавать ее пользователю. Что же тут особенного, а то, что для создания красивого сайта, Вам понадобится лишь одна или несколько универсальных страничек, красиво оформленных, а создавать на основе ее Вы можете 1000-чи уникальных информационных страниц сайта.
   Давайте, рассмотрим небольшой пример созданного сайта на основе шаблонной технологии Smarty и Вам все станет понятно.

   Тест-платформой сделаем бесплатно скачанный шаблон с уже готовыми рисунками и библиотекой css. Сайт, который мы собираемся siteсделать будет выглядеть примерно как на рисунке слева. Как Вы видите на рисунке, сайт будет состоять из навигационного меню (слева, вверху), новостного блока (слева, внизу) и контентной (текстовой) части (справа, ниже). Таким образом, наш шаблон будет состоять из всех элементов, кроме вот этих блоков. На каждой страничке сайта будет свой уникальный контент. А что касается новостей и навигационного меню, то хотя они и будут повторятся, однако они могут динамически изменятся, например, добавятся свежие новости, или появится новое подменю.

   Итак, пример динамического сайта с использованием smarty будет состоять 3-x шагов:
   1 шаг - создать папку с библиотекой smarty, которую надо подключить;
   2 шаг - написать код php, в котором будут наши переменные и которые в последствие будут вставляться в шаблон, а также подключить библиотеку Smarty;
   3 шаг - создать сам шаблон, куда все будем вставлять.

   Для того, чтобы Вы не тратили свое время на перекопированние кода, который наведен ниже, можете скачать уже готовый пример (в готовом примере работает три первые ссылки в главном меню и генерируется блок новостей) и изучить его так сказать изнутри. Проект требует установленного web-сервера и php. Создайте какую-то тестовую папку на Web-сервере и настройте виртуальный хост. Проект будет состоять из набора следующих папок и файлов:

[..]
file[smarty_library] - это папка с библиотекой smarty, переписываем всю ее сюда;
file[tpl] - папка с шаблонами;
     file [cache]
     file [configs]
     file [templates]
          file [index.tpl] - это наш основной шаблон страницы
          file [news.tpl] - это вспомогательный шаблон страницы
     file [templates_c] - НЕ ЗАБУДЬТЕ ПРАВА ПОСТАВИТЬ 777 (для записи)
file[images] - папка с рисунками;
file[css] - папка с css стилями;
file[index.php] - непосредственно наш индексный файл.

   Ну что ж, давайте сделаем первый шаг навстречу сайту и установим библиотеку smarty.

   Для начала работы со smarty, скачайте его последнюю версию на официальном сайте http://www.smarty.net/download.php. Пакет smarty абсолютно бесплатный, так что кряк искать не придется :) Если вы скачали и распаковали пакет, там будет всякого добра полно, но Вам непосредственно нужны все файлы и папки в папочке libs (это и есть библиотека smarty, все остальное на не нужно).

   Ее содержание будет выглядеть вот так:
[..]
file[internals]
file[plugins]
file[Config_File.class.php]
file[debug.tpl]
file[Smarty.class.php] - этот файл мы будем подключать для вызова библиотеки Smarty
file[Smarty_Compiler.class.php]

   Перекопируйте все это, со всем содержимым внутри, в папку нашего проекта file [smarty_library]. Далее создайте папку file [tpl], а в ней подкаталоги

   Теперь переходим ко второму шагу и создаем файл file [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, а потом встраиваются в основной шаблон . Давайте посмотрим из чего состоит дополнительный шаблон file [news.tpl]:

{foreach from=$news item=new}

<div style="font-size:12px;padding-bottom:16px;">
<span style="font-size:11px;">{$new.date}>

<span style="font-weight:bold;">{$new.title}>

{$new.text}<br>
<span style="font-size:10px;"><a href="#">подробнее</a></span>
</div>

{/foreach}

   Если Вы уже знакомы с языками программирования и работой с массивами, то команда foreach будет Вам знакома. А если еще не успели, то Вы должны знать, что smarty поддерживает небольшой перечень логических структур управления и среди них такие как: if и foreach. Команда foreach работает с массивами и означает что с каждым элементом массива (в данном случае $news) выполнить нижеследующий код. И таким образом, внутренняя переменная new будет в порядке очереди каждым элементом массива $news. Чтобы все понять комплексно, еще раз вернемся назад и посмотрим на такую цепочку в файле file [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. Давайте посмотрим содержимое файла file [index.tpl]:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<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>



<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, ее переменные. Их значение мы устанавливаем в файле file [index.php] таким вот способом:
$smarty->assign('keywords',$arr_meta_tags['keywords']);//где keywords означает {$keywords} в шаблоне.

Ну вот, пожалуй и все, еще раз напоминаю, что Вы можете скачать полностью готовый и работающий вышеприведенный пример сайта с использованием шаблонной технологии smarty (в готовом примере работает три первые ссылки в главном меню и генерируется блок новостей).
Ко всему выше добавлю что использование smarty значительно облегчит Вашу задачу по созданию своего сайта. Сделав один шаблон, Вы можете создавать на основе немного множество интересных страниц сайта. А использование дополнительных шаблонов, дает Вам возможность любую конструкцию Ваших страниц. Удачи!

1349
3.7 111
Рейтинг: +3.7 , голосов 111
Вы еще не голосовали!
Добавить комментарий (комментариев: 15)
Удалить ответ

Ваш почтовый ящик никогда не будет опубликован
Трудно разобрать цифры? Нажмите на рисунок, чтобы обновить.
#1 25/11/2013 22:44 Oksana
reply
Вы бы не могли подсказать, как правильно подключить к $arr_meta_tags['content'] файл php, в котором находится уже форма. чтобы она выводилась на место текста в Вашем примере, а не вверху, как это происходит сейчас. Заранее, спасибо
#2 12/04/2013 15:58 Alex
reply
да, статья действительно очень полезная и классная (и может даже лучшая из подобных), но.. Но только непонятно главное - как же всё-таки исп..рабо..функционирует таки этот smarty (на уровне сервера), каков механизм. Т.е., как сейчас понял, прочитав, - достаточно создать все эти папки, положить  smarty/index.php/index.tpl/пр.подстраницы туда - и вуаля - всё заработало, контент с сайта пошел.. А вот чего-то и нифига-/
Это я к тому что вот у меня сайт из пару страниц (уже давно, кто-то сделал) на smarty+PHP+sql и возникла необходимость добавить всего лишь ещё одну страничку, полностью идентичную прочим, просто с другим заголовком. Так вот простое добавление page6.php в корень (в доп. к прочим пяти) и page6.tpl в [templates] — н и ч е г о не дало-// (сервер выдает чистую страницу). Т.е. явно нужны какие-то ещё шаманские пляски и биение в бубен -((
12/04/2013 18:54 admin
1. Сначала в файле page6.php указываете название основного шаблона (в примере это "index.tpl")
    $smarty->display("index.tpl");
2. Потом внутри шаблона подключаете подшаблон "page6.tpl"
    {include file='page6.tpl'}
Ccылка в помощь http://www.smarty.net/docsv2/en/language.function.include.tpl
13/04/2013 04:07 Alex
а вот и нифига :) Там используется какой-то другой механизм, без этих 'include', ибо во всех прочих (работающих) файлах (из одного из которых и был, методом копирования, создан новый page6.tpl): 
1) во всех  *.php функция 'display' используется только для отображения её самой (напр, в page2.php - $sm->display("page2.tpl") и всё, также и в прочих)
2) во всех *.tpl функция  'include file' нигде ене употребляется...

(т.е. еслиб было так - я бы уж "по аналогии" как-нибудь уж разобрался бы,. но там используется какой-то другой мехаанизм, довольно загадочный.. зы: а "клеить" к одной странице этот новый - довольно странно если во всех прочих (и рабочих) ипользуется другой)
14/04/2013 01:47 Alex
т.е., собственно интересно, — как "запустить" компилятор, чтобы он таки сгененрировал страницу ***.tpl.php из моего шаблона что в [templates] в — [templates_c] ? (..ведь, насколько понимаю, эта система так должна действовать)
15/04/2013 18:48 Alex
љ. а могли бы такой простой момент и подсказать.. Проблема-то (как и догадывался), плевая. Ну, что флаг $compile_check должен быть активирован (true) это да, но и (главное) - права у пользоватей папки кеша [templates_c]  - ДОЛЖНЫ БЫТЬ ДОСТУПНЫ ДЛЯ ЗАПИСИ. вот всё, епть.
11/07/2013 23:19 Alex
ага, спасибо за ответ, но там проблема была совсем в другом - в невозможности компилятору записать сгенерированную страницу по причине ограниченных прав на Запись для папки [templates_c]....
..Вы я вижу уже поставили дополнение/уточнение по этому поводу, в статью, но неск. невнятно, лучше так: "для этой папки обязательно  должны быть установлены права и на Чтение и на Запись (т.е. т.н. "режим 777")"   ..надеюсь это поможет и прочим пользователям=) (ибо с подобной проблемой, как понял по форумам, народ нередко сталкивается и недоумевает/вопрошает и... а я сам кстати догадался об этом случайно, по контексту, а конкретно так никто и не помог/)
#3 23/02/2013 07:01 Cris
reply
Огромное спасибо! Статья очень полезная и классная
#4 20/01/2012 12:04 Сергей
reply
Есть движок, написанный на Smarty - это ShopScript, скачать, разобраться, все станет ясно. ЧПУ делается прописыванием rewrite_mod в htaccess и потом или сделать подключаемую функцию, которая розпарсит строку или через класс. Насчет совета с подключеним массивов делать так всегда. Только совет использовать isset в шаблоне это неверно, все нужно делать в обработчике. В шаблон всегда должны передаваться значение переменной массива, а в шаблоне только вывод значение, меньше кода. Для того и созданы шаблоны чтобы код отделить от дизайна.
#5 17/12/2009 22:40 lex
reply
спасибо, мда опыта просто не хватает
#6 17/12/2009 17:48 lex
reply
и еще не могу понять в каую папку запехивать скрипты что бы они работали через сайт т.к. приведенный фрагмент создает форму при клике на кнопку которой браузер перходит на страничку со скриптом
17/12/2009 21:36 admin
Вам нужно определится со структурой сайта:

1. вариант - в корне сайта лежит индексный файл index.php, который запускается всегда когда обращаются к серверу. Далее этот файл/скрипт с помощью функци include/require подключает другие скрипты. В зависимости от полученных данных они выполняют код, передают данные в шаблон и выводят на экран результат.
Все ссылки создаются вида: index.php?... либо используйте rewrite_mod.

2. вариант - создаются папки с ассоциативным названием (например, news, contact, articles и т.д.) в каждой папке есть свой index.php который в свою очередь подключает нужные скрипты и выдает ответ.
Все ссылки получаются типа: /news/index.php?..

Я бы вам рекомендовал использовать первый вариант, так как второй вариант более подходит для сайтов использующих ООП.
#7 17/12/2009 17:21 lex
reply
угу понятно, а вот допустим пример if (!empty($_REQUEST['page']) && $_REQUEST['page'] == "quote_form.php") { $arr_meta_tags['content'] = include("process.php");} вставил вот таую штучку, что бы вывести страницу на php, выводит но только почему то в самом начале страницы а потом лишь идет дизайн, как быть?
17/12/2009 21:25 admin
в самом начале страницы выводит скорее всего, потому что в файле "process.php" у Вас идет вывод. На этом этапе $arr_meta_tags['content'] = include("process.php"); уже пошел вывод информации.
И такое выражение тоже довольно интересное. Так никто не пишет. В файле "process.php" присвойте любой переменной значение (например $test), потом просто подключите include_once("process.php");
и далее пишите так: $arr_meta_tags['content'] = $test;
Потому у Вас и дизайн выводится внизу, так как Вы вывели данные до их обработки в smarty.
#8 15/12/2009 23:41 lex
reply
В целом все понятною Спасибо за урокю А подсказать не можете, как его с базой майскьюл связать?
16/12/2009 12:55 admin
связать токо через php, в php брать данные из mysql и вставлять в smarty
если надо без дополнительного скрипта можете использовать {php}{/php}
#9 20/11/2009 17:11 Andy
reply
сорри за критику, понимая что это всего-навсего пример, рискну сказать, что в таком виде лучше не делать. во-первых, в шаблон можно передавать массив, и соответственно в скрипте выполнить
$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} ...
20/11/2009 18:07 admin
все правильно, обычно я так и делаю, работать с массивом это профессионально, но это понятный пример для тех, кто еще не работает с массивами.
А если сделать так: $smarty->assign($arr_meta_tags); то на выходе мы получим те же переменные, что и в примере ($title, $keywords и т.д.).
#10 26/05/2009 20:54 VicAMMON
reply
Потрясающий урок, все описано кратко, понятно, доступно, но в полной мере. Автору уважуха !!! ;)
#11 21/04/2009 06:38 maxmax
reply
класный пример)
#12 21/04/2009 01:58 Hapster
reply
полностью согласен с bonemurder"ом. Тем более, что столкнулся с очень похожей задачей. Автору большое спасибо - побольше таких уроков
#13 09/04/2009 11:17 atwa
reply
СПАСИБО
Мне как нубу в системах управления сайтами этот пример очень помог ^_____^
буду рекомендовать.
#14 10/02/2009 23:30 bonemurder
reply
очень дельный пример)))меня просто, мягко говоря, задолбало изучение документации для бывалых программеров))) как говорицца для чайников...я бы хотел получить у вас платную консульацию, так как я обычный начинающий дизайнер, который повелся на рекламу шоп-скрипта(простоты и гибкости изменения шаблонов под инет магазин)...у меня задача несколько усложнена внедрением поисковой формы в инет магазин по категориям(а я деревянный как стекло)..заранее благодарен
#15 02/02/2009 19:49 Джек
reply
круто конечно, а как добавить ссылку, но только чтобы она была на одной странице?
02/02/2009 22:49 admin
добавить ссылку можно точно также как и текст, просто пропишите вместо него, например текст ссылки, а вообще скачайте пример и детально посмотрите что и как делается, другого такого примера Вы больше навряд ли найдете

Дополнительно

заказать разработку интернет магазина

» С чего начать сайт?

» Установка программ

» Пример создания сайта

» Хостинг и домен

» Оптимизация сайта

» Раскрутка сайта

» Заработок web-мастера

» Примеры PHP/Javascript

» Блог и мои записки

Последние новости

Статьи по рейтингу

» Особенности покупки контента 5.0 1
» Выбор хостинга 4.8 5
» Поисковые системы 4.7 9
» Курс молодого web-мастера 4.6 21
» Где взять бесплатные ссылки 4.5 11
» Что такое сниппеты 4.5 6
» Addstudio - SEO модуль 4.5 4
» Отладка js и CSS 4.4 14
» Стратегия дохода на Sape.ru 4.3 3
» Каталоги и биржи статей 4.3 4

Дополнительно

создание сайтов с портфолио услуг создание сайтов Киев