Шаблоны Smarty
ADO в Delphi AJAX Android C++ CakePHP CMS COM CSS Delphi Flash Flex HTML Internet Java JavaScript MySQL PHP RIA SCORM Silverlight SQL UML XML Бази даних Веб-розробка Генетичні алгоритми ГІС Гітара Дизайн Економіка Інтелектуальні СДН Колір Масаж Математика Медицина Музика Нечітка логіка ООП Патерни Подання знань Розкрутка сайту, SEO САПР Сесії в PHP Системне програмування Системний аналіз Тестологія Тестування ПЗ Фреймворки Штучний інтелект
|
Шаблоны Smarty
Ключові поняття: Smarty, templates, templates_c, Configs, cache, Имена template, template_с , config, cache, Комментарии в Smarty, Функция в Smarty, Свойства объектов, заданные в php-скрипте, Конфигурационный файл, Метод append, Функция config_load, Функция capture, Секция Section.
Шаблоны SmartySmarty - один из действующих проектов 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 ?> Если при его исполнении появилась ошибка, то нужно попробовать один из перечисленных ниже вариантов.
Теперь, после того как мы убедились, что библиотеки будут найдены, нужно создать директории, необходимые для работы Smarty, по умолчанию имеющие такие имена:
Эти имена задаются свойствами $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/) // загружаем Smarty-библиотеку и создаем экземпляр класса define("SMARTY_DIR","c:/users/my/Smarty/libs/"); require(SMARTY_DIR."Smarty.class.php"); $smarty = new Smarty; // указываем, где находятся Smarty-директории $smarty->template_dir = "c:/smarty_dirs/book/templates/"; $smarty->compile_dir = "c:/smarty_dirs/book/templates_c/"; $smarty->config_dir = "c:/smarty_dirs/book/configs/"; $smarty->cache_dir = "c:/smarty_dirs/book/cache/"; $smarty->assign("name","Вася"); // присваиваем переменной // name значение Вася $smarty->display("index.tpl"); // выводим обработанный // шаблон ?>Листинг 15.4.2. index.php В результате должны получить: Привет, Вася! Все настройки, необходимые для работы нашего приложения, можно вынести в отдельный файл и организовать их в качестве расширения класса Smarty. Далее более подробно рассмотрим, из каких элементов могут состоять шаблоны Smarty и как их обрабатывать внутри php-скрипта. Начнем с синтаксиса шаблонов. Основной синтаксисSmarty - не просто класс для обработки шаблонов, он определяет целый язык построения шаблонов. Мы коснемся только основных его элементов. Итак, что представляет собой шаблон Smarty? Это набор специальных конструкций (переменных, вызовов функций и методов и т.п) и html-тегов. Все элементы (теги) языка шаблонов Smarty заключаются между символами-ограничителями. По умолчанию это символы фигурных скобок "{" и "}", но их можно изменить. Все, что не заключено в такие ограничители, Smarty рассматривает как константы, не требующие обработки. В шаблоне index.tpl, приведенном выше, {$name} - это переменная, а строки "Привет," и "!" - не изменяющиеся в процессе обработки шаблона константы. Комментарии в Smarty записываются между двумя звездочками: {* Это комментарий. После обработки шаблона он на экране не отображается *} Каждый Smarty тег либо выводит значение переменной, либо вызывает какую-либо функцию. Функция записывается следующим образом: {имя_функции атрибут1="значение1" атрибут2="значение2"} Переменные в шаблоне могут быть нескольких типов:
Кроме того, существует переменная {$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 (имя переменной, смешанное значение); Метод используется для того, чтобы присвоить значения переменным шаблона. Можно передавать ассоциативные массивы, содержащие пары имя/значение переменных, или передавать пары имя/значение для каждой переменной в отдельности. 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_loadvoid config_load(имя файла, [имя секции]); Метод загружает конфигурационный файл и встраивает его в шаблон. Аналогично этому методу действует функция config_load. Пример: $smarty->config_load("task.conf","Database"); Метод displayvoid display(шаблон); Метод отображает шаблон. У этого метода есть еще два опциональных параметра, о которых можно прочитать в документации. Метод fetchstring 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]}Пример 15.8. Цикл для обхода элементов массива Функция foreachСинтаксис: {foreach from="имя_массива" item="имя_текущего_элемента"} ... {/foreach} Кроме того, можно использовать дополнительные атрибуты key - имя ключа для текущего элемента массива и name - имя цикла, с помощью которого можно будет получать доступ к его свойствам. Атрибуты from и item - обязательные. Циклы foreach являются альтернативой циклам section. Действие функции foreach очень похоже на работу цикла foreach в языке PHP. {foreach from=$articles item=art} Title: {$art}Пример 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, мы можем попытаться решить задачу отображения списка документов. Шаблон списка будет выглядеть следующим образом: {* Smarty template index.tpl *} {config_load file="task.conf" } В файле конфигурации task.conf будем хранить название страницы и параметры для доступа к базе данных: # глобальные переменные pageTitle = "List of documents" [Customer] pageTitle = "Список статей" [Database] host=localhost db=book user=nina pass=123 Скрипт (index.php), обрабатывающий написанный нами шаблон, может выглядеть таким образом: define("SMARTY_DIR","c:/users/nina/Smarty/libs/"); require(SMARTY_DIR."Smarty.class.php"); $smarty = new Smarty; $smarty->template_dir = "c:/smarty_dirs/book/templates/"; $smarty->compile_dir = "c:/smarty_dirs/book/templates_c/"; $smarty->config_dir = "c:/smarty_dirs/book/configs/"; $smarty->cache_dir = "c:/smarty_dirs/book/cache/"; // вышеприведенный блок лучше вынести в отдельный файл $smarty->config_load("task.conf","Database"); $host = $smarty->get_config_vars("host"); $user = $smarty->get_config_vars("user"); $pass = $smarty->get_config_vars("pass"); $db = $smarty->get_config_vars("db"); $conn = mysql_connect($host, $user, $pass) or die("Cant connect"); mysql_select_db($db); $sql = "SELECT * FROM Articles"; $q = mysql_query($sql,$conn); $num = mysql_num_rows($q); for($i=0; $i<$num; $i++){ $title = mysql_result($q,$i,"title"); $author = mysql_result($q,$i,"author"); $abs = mysql_result($q,$i,"abstract"); $full = mysql_result($q,$i,"fulltext"); $smarty->append(array( title => $title, author => $author, abstract => $abs, fulltext => $full )); } $smarty->display("index.tpl"); ?>Листинг 15.12. index.php Как вы, скорее всего, заметили, программа получилась еще более громоздкой, чем в первых двух случаях, когда использовалась простая замена значений и шаблоны FastTemplate. Действительно, механизм Smarty гораздо более сложен, чем тот же FastTemplate, но зато и более функционален.
Зверніть увагу на додаткові посиланняЯкщо вас цікавить...Головний розділСторінки, близькі за змістомзагрузка...
|
Теми розділу
Сторінки, близькі за змістом
|
Copyright © 2008—2018 Портал Знань.
При використанні матеріалів посилання, для інтернет-ресурсів — гіперпосилання, на Znannya.org обов'язкове.
Зв'язок
|
НТУУ "КПІ" Інженерія програмного забезпечення КПІ Лабораторія СЕТ |
|