Посторим вместе

Посторим вместе

Login Form






Lost Password?
No account yet? Register

Found a mistake ?

Обнаружили ошибку на сайте ? Выделите фрагмент текста и нажмите на Shift + Enter.

Last files

Date iconJul.26

TopServer представляет собой мощный, удобный и простой в использовании сервер приложений (серверн...

Date iconMay.13

Аккуратный шаблон для Joomla (Бесплатный)

Date iconMay.13

Бесплатный шаблон для joomla

Date iconMay.13

Бесплатный шаблон для joomla

Date iconMay.06

Архив соджержит шаблон и исходники. Шаблоны представлены в виде версии HTML и Flash. Шаблон для ...

Polls

Каким cms вы пользуетесь ?

Что бы вы хотели видеть больше на нашем сайте ?

Who's Online

We have 5 guests online
    Locations of visitors to this page
Main
Шаблоны Smarty Print E-mail
Written by Master   
Friday, 23 May 2008
Smarty - один из действующих проектов PHP, его официальный сайт - smarty.php.net. Там можно скачать как сам набор классов Smarty, так и документацию к нему. Этот набор классов для обработки шаблонов - гораздо более мощный и функциональный, чем FastTemplate.Чем отличается Smarty от классов шаблонов типа FastTemplate? Прежде всего, он не отделяет полностью логику от содержания. Логика, касающаяся отображения данных, может присутствовать в шаблоне, считают разработчики Smarty. Поэтому в шаблоне Smarty могут быть условные операторы, операторы вставки файлов, операторы изменения переменных, циклы и т.п. Другая особенность Smarty - это компиляция шаблонов. Шаблоны переводятся в php-код, и интерпретатор PHP производит все

необходимые действия по подстановке значений. Для ускорения работы скомпилированные шаблоны кэшируются.
Рассмотрим некоторые основные конструкции механизма шаблонов Smarty.
Установка
Первое, с чего мы начнем, - это установка Smarty. Здесь все не так просто, как с FastTemplate. Smarty состоит не из одного php-файла с описанием класса, а из целого набора различных файлов-библиотек. Для того чтобы работать с шаблонами Smarty, нужно сделать эти библиотеки доступными для всех ваших программ. Находятся они в каталоге /libs/ дистрибутива Smarty. Файл, в котором содержится определение самого класса Smarty, называется Smarty.class.php. Чтобы проверить, доступны ли библиотеки класса Smarty, нужно написать такой скрипт:

<?
require('Smarty.class.php');
// подключаем файл с
// описанием класса Smarty
$smarty = new Smarty;
// создаем экземпляр класса Smarty
?>

Если при его исполнении появилась ошибка, то нужно попробовать один из перечисленных ниже вариантов.
1. Указать полный путь до файла описания класса.

<?
// подключаем файл с описанием класса
require('c:/users/my/Smarty/libs/
Smarty.class.php');
$smarty = new Smarty;
// создаем экземпляр класса Smarty
?>

2. Добавить директорию, где содержатся библиотеки, в include_path (в этом случае код менять не нужно).
3. Установить константу SMARTY_DIR.

<?
define("SMARTY_DIR",
"c:/users/my/Smarty/libs/");
require(SMARTY_DIR."Smarty.class.php");
$smarty = new Smarty;
?>

Теперь, после того как мы убедились, что библиотеки будут найдены, нужно создать директории, необходимые для работы Smarty, по умолчанию имеющие такие имена:
templates - директория, где мы будем хранить созданные шаблоны;
templates_c - директория, где Smarty будет хранить скомпилированные шаблоны;
configs - директория для хранения конфигурационных файлов;
cache - директория для кэша.
Эти имена задаются свойствами $template_dir, $compile_dir, $config_dir, $cache_dir класса Smarty, поэтому их можно переопределить. Рекомендуется использовать различные наборы директорий для каждого приложения, работающего с шаблонами Smarty. Доступ к перечисленным директориям осуществляется библиотекой Smarty и никогда не выполняется напрямую через web-браузер. Поэтому, чтобы избежать проблем с безопасностью, лучше всего разместить эти директории там, куда нет доступа через www.
Создадим перечисленные Smarty директории по адресу c:/smarty_dirs/book/. Заметим, что прочитать отсюда данные через браузер нельзя. Пусть наша программа (или приложение) находится по адресу /~my/tasks/book/. Для директорий $compile_dir и $cache_dir Smarty потребуется доступ на запись, так что нужно установить соответствующие им права для сетевого пользователя, с которым ваш сервер работает по умолчанию (обычно это www или nobody).
Чтобы протестировать сделанные настройки, создадим простой шаблон и программу, обрабатывающую его с использованием механизма Smarty.
index.tpl (является Smarty шаблоном и находится в директории шаблонов c:/smarty_dirs/book/templates/)

Шаблон Smarty

Привет, {$name}!

 

index.php (является кодом нашей программы и находится в директории /~my/tasks/book/ или, что то же самое, в директории c:/users/my/tasks/book/)
Листинг 15.4.2. index.php
В результате должны получить:
Привет, Вася!
Все настройки, необходимые для работы нашего приложения, можно вынести в отдельный файл и организовать их в качестве расширения класса Smarty.
Далее более подробно рассмотрим, из каких элементов могут состоять шаблоны Smarty и как их обрабатывать внутри php-скрипта. Начнем с синтаксиса шаблонов.
Smarty - не просто класс для обработки шаблонов, он определяет целый язык построения шаблонов. Мы коснемся только основных его элементов. Итак, что представляет собой шаблон Smarty? Это набор специальных конструкций (переменных, вызовов функций и методов и т.п) и html-тегов. Все элементы (теги) языка шаблонов Smarty заключаются между символами-ограничителями. По умолчанию это символы фигурных скобок "{" и "}", но их можно изменить. Все, что не заключено в такие ограничители, Smarty рассматривает как константы, не требующие обработки. В шаблоне index.tpl, приведенном выше, {$name} - это переменная, а строки "Привет," и "!" - не изменяющиеся в процессе обработки шаблона константы.
Комментарии в Smarty записываются между двумя звездочками:

Это комментарий. После обработки шаблона
он на экране не отображается

Каждый Smarty тег либо выводит значение переменной, либо вызывает какую-либо функцию. Функция записывается следующим образом:
{имя_функции атрибут1="значение1"
атрибут2="значение2"}
Переменные в шаблоне могут быть нескольких типов:

* Переменные, значение которым присваивается в php-скрипте пользователя, должны иметь перед именем знак доллара.
Например: {$first_name}

* Элементы массива, значения которых были присвоены в php-скрипте пользователя, доступны в шаблоне с помощью синтаксиса {$имя_массива.ассоциативный_ключ}.
Например: {$person.last_name}

* Элементы не ассоциативного массива доступны с помощью синтаксиса квадратных скобок: {имя_массива[числовой_индекс]}
Например: {$person[2]}

* Свойства объектов, заданные в php-скрипте, доступны в шаблоне с помощью такого синтаксиса: {имя_объекта->имя_свойства}
Например: {$person->email}

*Переменные, загруженные из конфигурационных файлов (что это такое, мы расскажем чуть позже), заключаются между символами #. Также они доступны как элементы ассоциативного массива $smarty.config.
Например: {#bodyBgColor#} или {$smarty.config.bodyBgColor}

*Кроме того, существует переменная {$smarty}, зарезервированная для некоторых специальных переменных шаблона, таких как переменные HTTP запроса, даты и времени, и т.п.

В шаблонах Smarty определен ряд модификаторов, которые можно применять к переменным, пользовательским функциям или строкам с тем, чтобы модифицировать их значения. Чтобы применить модификатор, нужно указать его название после вертикальной черты, следующей за именем переменной, функции или строкой, к которой он применяется.
Например, чтобы перевести значение переменной {$title} в верхний регистр, нужно применить к ней модификатор upper, т.е. написать следующее: {$title|upper}
Можно использовать сразу несколько модификаторов, отделяя их друг от друга прямой вертикальной чертой. Например, {$title|upper|truncate} переведет значение переменной в верхний регистр и урежет до 80 символов.
Перечислять все имеющиеся модификаторы мы не будем. Их список можно найти в документации Smarty. Скажем только, что с их помощью можно посчитать число символов, слов и параграфов, дописать строку, задать формат вывода даты и времени, сделать регулярную замену и многое другое.

Конфигурационные файлы

Конфигурационные файлы используются для того, чтобы управлять глобальными переменными, используемыми в шаблоне, с помощью одного файла. Их идея очень похожа на таблицы стилей css. Конфигурационный файл содержит набор переменных и их значения. Перед именем переменной не ставится никаких дополнительных символов типа знака доллара. Значение переменной по желанию заключают в кавычки (двойные или одинарные), если оно состоит из нескольких строк, то его заключают в тройные кавычки.

# глобальные переменные
pageTitle = "List of documents"
bodyBgColor = #000000
tableBgColor = #000000
rowBgColor = #00ff00
[Customer]
pageTitle = "Список статей"
Intro = """Это значение состоит из
нескольких строк. Поэтому его нужно
заключить в тройные кавычки."""

# скрытая секция
[.Database]
host=localhost
db=book
user=nina
pass=123

Пример 15.5. Пример конфигурационного файла
Конфигурационный файл может состоять из нескольких разделов (секций), каждая из которых имеет имя и может загружаться отдельно от остальных секций. Имя секции заключается в квадратные скобки. Кроме секций в конфигурационном файле могут содержаться глобальные переменные - они не входят ни в одну секцию и всегда загружаются при загрузке конфигурационного файла. Если загружается какая-то одна секция, то загружаются ее переменные и глобальные переменные. Если переменная существует и как глобальная переменная, и как переменная секции, то используется переменная секции. Если вы одинаково назовете две переменные внутри одной секции, то будет использоваться последняя из них. В приведенном выше примере две секции - Customer и Database, а кроме них заданы глобальные переменные pageTitle, bodyBgColor, tableBgColor и rowBgColor.
Чтобы спрятать значение переменной или секцию целиком, нужно перед ее именем поставить точку. В таком случае при загрузке конфигурационного файла эти данные нельзя будет прочесть. В примере мы сделали скрытой секцию Database, чтобы нельзя было узнать пароль и имя пользователя, применяемые для установки соединения.
Комментарии в конфигурационном файле можно обозначать символом #.
Загрузка конфигурационных файлов производится с помощью встроенной функции или метода config_load, подробнее об этом мы расскажем в следующей главе.

Методы

Для работы с шаблонами класс Smarty определяет набор методов. Рассмотрим несколько основных методов.

Метод assign
Синтаксис:
void assign (смешанное значение);
void assign (имя переменной,
смешанное значение);

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

<?php
// передаем пары имя/значение для
// переменной Name и
// Address в отдельности
$smarty->assign("Name","Вася");
$smarty->assign("Address",$addr);
// здесь $addr может быть и массивом
// передаем ассоциативный массив
$smarty->assign(array(
"city" => "Новосибирск",
"street" => "Пирогова"));
// таким образом, переменные city и street
// получат соответствующие значения
?>

Пример 15.6. Использование метода assign()

Метод append
Синтаксис:
void append (смешанное значение);
void append (имя переменной,
смешанное значение);
void append (имя переменной,
смешанное значение, слияние);

Принцип действия этого примерно такой же, как и у assign. Метод append позволяет присоединить элемент к массиву. Если вы присоединяете значение к строковой переменной, то она преобразуется в массив, и значение добавляется уже в него. Так же, как и в assign, здесь можно передавать пары ключ/значение или ассоциативные массивы, содержащие эти пары. Если указать третий аргумент слияние равным TRUE, то значение будет не присоединено в качестве еще одного элемента, а слито воедино с текущим массивом.

$smarty->append(array(
title => $title,
author => $author))

Пример 15.7. Использование метода append()
Здесь если title была строкой, то она становится массивом и к нему добавляется еще один элемент со значением $title. То же самое происходит с переменной author.

Метод config_load
void config_load(имя файла, [имя секции]);
Метод загружает конфигурационный файл и встраивает его в шаблон. Аналогично этому методу действует функция config_load.
Пример: $smarty->config_load("task.conf","Database");

Метод display
void display(шаблон);

Метод отображает шаблон. У этого метода есть еще два опциональных параметра, о которых можно прочитать в документации.

Метод fetch

string fetch(шаблон);

Этот метод возвращает обработанный шаблон в строковую переменную, вместо того чтобы выводить его на экран. У этого метода есть еще два опциональных параметра, о которых можно прочитать в документации.

Встроенные функции

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

Функция config_load
Синтаксис:
{config_load file="имя_файла" }

Эта функция используется для загрузки в шаблон переменных из конфигурационных файлов. Кроме имени загружаемого файла, у этой функции может быть еще несколько дополнительных параметров. Например, параметр section, в котором указывают имя секции для загрузки. Более подробную информацию об этих и других параметрах можно получить из документации Smarty.
Пример:
{config_load file="task.conf"}
Функция capture
Синтаксис:
{capture name="имя_блока"
assign="имя_переменной"} ...
{/capture}

Эта функция предназначена для того, чтобы собирать в переменную выходные данные шаблона вместо того, чтобы выводить их на экран. Все, что находится между {capture name="varname"} и {/capture}, будет записано в переменную с именем varname. Захваченный таким образом контент может быть использован в шаблоне посредством специальной переменной $smarty.capture.varname, где varname - значение, переданное в атрибут name функции capture. Если имя переменной не задано, будет использовано имя default.
Второй параметр assign задает имя переменной, которой будет присвоено захваченное выходное значение. Этот параметр, как и name, не обязательный.

Функция section
Синтаксис:

{section name="имя_секции"
loop="переменная_для_выч-ния_числа_итераций"
[,start="индекс_начальной_позиции"]
[, step="шаг"] [,max="максимум_итераций"]
[,show="показывать_ли_секцию"] }...
{/section}

Секция Section - это цикл для обхода элементов массива. Обязательными являются параметры name, с помощью которого задается имя секции, и loop, который представляет собой переменную, определяющую число итераций цикла. Как правило, loop - это переменная типа массив, и число итераций секции равно числу элементов этого массива. Чтобы вывести переменную внутри цикла, нужно после имени переменной указать в квадратных скобках имя секции.

{section name=art loop=$title}
Название: {$title[art]}
{/section}

Пример 15.8. Цикл для обхода элементов массива

Функция foreach
Синтаксис:

{foreach from="имя_массива"
item="имя_текущего_элемента"}
... {/foreach}

Кроме того, можно использовать дополнительные атрибуты key - имя ключа для текущего элемента массива и name - имя цикла, с помощью которого можно будет получать доступ к его свойствам. Атрибуты from и item - обязательные.
Циклы foreach являются альтернативой циклам section. Действие функции foreach очень похоже на работу цикла foreach в языке PHP.

{foreach from=$articles item=art}
Title: {$art}
{/foreach}

Пример 15.9. Цикл foreach
Циклы foreach имеют свои собственные свойства. Получить доступ к ним можно таким образом: {$smarty.foreach.foreachname.varname}, где foreachname - это имя цикла, заданное его параметром name, а varname - имя свойства.

Оператор if, elseif, else
Синтаксис:

{if выражение} блок_действий
{elseif выражение1} блок_действий1
{else} блок_действий2
{/if}

Действие оператора практически аналогично оператору if...elseif...else языка PHP. В выражениях могут использоваться следующие операторы сравнения: eq, ne, neq, gt, lt, lte, le, gte, ge, is even, is odd, is not even, is not odd, not, mod, div by, even by, odd by, ==, !=, >, < , <=, >=. Каждый из них обязательно должен быть отделен от окружающих его значений пробелами. В выражениях можно использовать круглые скобки и вызывать php-функции.

{if $name eq "Вася"}
Добро пожаловать, Вася.
{elseif $name eq "Петя"}
Добро пожаловать, Петя.
{else}
Добро пожаловать. А вы кто?
{/if}

Пример 15.10. Операторы if, elseif, else

этот пример не будет работать,
поскольку не поставлены
пробелы вокруг операторов сравнения

{if $name=="Вася" || $name=="Петя"}

...
{/if} Пример 15.11. Неработающий пример
Теперь, после знакомства с основными конструкциями Smarty, мы можем попытаться решить задачу отображения списка документов. Шаблон списка будет выглядеть следующим образом:

Smarty template index.tpl

{config_load file="task.conf" }
<html>
<head>
<title>{#pageTitle#}</title>
</head>
<body>
<ol>
{section name=art loop=$title}
<li><a href="{$fulltext[art]}">
{$title[art]}</a>
({$author[art]})
<br> <p> {$abstract[art]}
{/section}
</ol>
</body>
</html>

В файле конфигурации task.conf будем хранить название страницы и параметры для доступа к базе данных:

# глобальные переменные
pageTitle = "List of documents"
[Customer]
pageTitle = "Список статей"
[Database]
host=localhost
db=book
user=nina
pass=123

 

Скрипт (index.php), обрабатывающий написанный нами шаблон, может выглядеть таким образом:
Листинг 15.12. index.php
Как вы, скорее всего, заметили, программа получилась еще более громоздкой, чем в первых двух случаях, когда использовалась простая замена значений и шаблоны FastTemplate. Действительно, механизм Smarty гораздо более сложен, чем тот же FastTemplate, но зато и более функционален.
Заключение
Итак, в этой лекции было рассказано о том, что такое шаблоны и как их можно использовать при программировании web-приложений на языке PHP. Мы рассмотрели три способа решения задачи отображения сложного списка документов: с помощью функции регулярной замены, с помощью класса шаблонов FastTemplate и с помощью языка шаблонов Smarty. При этом мы познакомились с основными свойствами, методами и функциями классов FastTemplate и Smarty.

 

 

 

 

 

 


Views: 628

  Comments (1)
 1 Written by This e-mail address is being protected from spam bots, you need JavaScript enabled to view it , on 10:32 16.07.2008
thanks :) :zzz

Write Comment
Name:
E-mail
Comment:



Code:* Code

Last Updated ( Friday, 23 May 2008 )
 
< Prev   Next >