Статьи Новости Контакты

03.10.2008
Петр Агофонов

Пользовательские функции в Smarty

описание пользовательских функций Smarty

Любой шаблонный механизм призван разделить труд дизайнера и нелегкую работу программиста, так сказать, развести их по разные стороны процесса создания веб-сайта. Однако, когда над проектом работает один человек и крайне важны сроки сдачи работы и не так важен дизайн, возникает вопрос: каким же образом можно упростить себе жизнь, чтобы потом заказчик имел возможность самостоятельно изменить дизайн приложения так, как ему будет угодно? Собственно, именно для такого случая и был создан шаблонный механизм Smarty. Сегодня речь пойдет лишь о небольшой части возможностей этого приложения, а именно — о функциональности встроенных пользовательских функций.

Фактически уже только само название функций — пользовательские — дает понять, что они призваны облегчить жизнь пользователю системы. Поэтому и состав, и назначение описываемых в этой статье методов класса Smarty достаточно характерно отображают суть своего названия. Большинство функций этого типа призвано упрощать жизнь пользователю системы, то есть дизайнеру.

Пользовательская функция assign

Чтобы присвоить значение какой-либо переменной во время работы скрипта, можно использовать функцию присвоения. Запись этой функции внешне достаточно простая:

{assign var="имя" value="значение"}

Эта простота, в свою очередь, накладывает некоторые ограничения на работу функции. Вы можете использовать для записи сложных выражений обратные кавычки, в которых записывать нужные вам операнды и переменные. К большому сожалению, в последней на момент написания статьи версии Smarty нет никакой возможности использовать функции PHP. Вот пример записи, использующей операцию сложения переменных шаблона:

{assign var="newvar" value=`$newvar + $array[loop].value`}

После выполнения шаблона вы имеете возможность получить значение присвоенной внутри него assign-переменной с помощью метода get_template_vars().

Пользовательская функция counter

Для организации вывода счетчика в циклах можно воспользоваться функцией counter. Она позволяет, например, вывести порядковый номер записи в таблице. Можно задавать начальное значение счетчика, шаг его изменения, направление счета (увеличение или уменьшение), необходимость вывода счетчика или простое присвоение его значения внутренней переменной.

Следующий пример задает счетчик и сразу же насколько раз выводит его с заданным интервалом:

{counter start=1 skip=2}<br/>
{counter}<br/>
{counter}<br/>

Пользовательская функция cycle

Функция cycle предназначена для вывода чередующихся значений. Такая странная формулировка совершенно необходима для того, чтобы понять, что на самом деле cycle не организует никакого цикла. Она всего лишь требуется для того, чтобы выводить значения одно за другим, будучи вызванной каким-либо способом в самом шаблоне.

Для инициализации списка значений, которые используются для перебора, можно использовать строку, содержащую данные, разделенные запятыми. Таким образом, например, очень просто задать вывод чередующихся значений, например, при необходимости выделить строки таблицы разными цветами. Следующий пример как раз и покажет, каким образом подсветить разные строки таблицы разным цветом.

Конечно же, чтобы следующие примеры заработали, совершенно необходимо, чтобы у вас был установлен сам Smarty. В двух словах — следует создать три каталога: smarty, в который следует распаковать сам класс, templates_c — для временных значений и templates — в этом каталоге будет находиться файл шаблона index.tpl.

Итак, для начала в скрипте index.php выполняем подготовительные действия и создаем массив из нескольких чисел, который передаем в шаблон, с помощью метода assign().

Файл index.php

<?php
require_once("smarty/Smarty.class.php");
$smarty = new Smarty;
$smarty->assign("data", array(1,2,3,4,5,6));
$smarty->display("index.tpl");
?>

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

Для визуализации или, попросту, вывода в браузер необходим еще и шаблон, то есть файл index.tpl, который следует разместить в подкаталоге templates вашей тестовой программной структуры. Именно в этом файле и будут записаны инструкции, позволяющие раскрыть замечательные возможности пользовательской функции cycle.

Файл templates/index.tpl

<table width="350">
{section name=rows loop=$data}
<tr bgcolor="{cycle values="gold,yellow"}">
<td align="center">Строка: <strong>{$data[rows]}</strong></td>
</tr>
{/section}
</table>

Скрытая красота данного примера заключается в том, что он может заменить собой более сложный способ организации подобного действия с помощью операторов сравнения {if} и {/if} и непосредственного вывода текста. Чтобы использовать такой способ с {if}, необходимо точно помнить запись вызова служебной переменной Smarty, атрибуты которой содержат данные о текущем цикле, например номер текущей строки. Применение же пользовательской функции cycle позволит вам разукрасить таблицы, просто вспомнив, что эта функция имеет входной параметр values, в который надо передать список значений. Согласитесь, запомнить эту формулировку будет несколько легче. На следующей иллюстрации как раз приведен результат работы примера для браузера Firefox 3.

Вывод строк таблицы разными цветами

Несмотря на всю тривиальность данного примера, возможности пользовательской функции cycle все-таки немного шире. Например, вы можете задержать вывод значения, присвоить значение переменной, начать вывод значений с первого в списке. Кроме того, можно задавать различные символы-разделители для строкового представления списка значений. Также возможно указывать перечень чередующихся данных и непосредственно из PHP-кода, для этого в качестве параметра values в шаблон можно передать PHP-массив.

Таким образом, более просто, чем из чистого PHP, можно производить самые замысловатые манипуляции — например, формировать таблицу, в которой подсвечиваются не только строки, но и колонки. Исходные коды этого несколько более сложного примера приведены на следующих двух листингах.

Файл index.php

<?php
require_once("smarty/Smarty.class.php");
$smarty = new Smarty;
$smarty->assign("rows", array(1,2,3,4,5,6));
$smarty->assign("cols", array("col1","col2","col3","col4"));
$smarty->display("index.tpl");
?>

Файл templates/index.tpl

<table width="320">
{section name=rows loop=$rows}
{cycle name=row values="#BBB,#EEE" assign="color1" print=false}
<tr>

{section name=cols loop=$cols}
{cycle name=col values="111,FFF" assign="color2" print=false}
<td bgcolor="{$color1}{$color2}" align="center">{$cols[cols]}.{$rows[rows]}</td>
{/section}

</tr>
{/section}
</table>

В данном коде использована возможность пользовательской функции cycle прекращать вывод с помощью параметра print, а также присваивать свой вывод переменной шаблона. В итоге каждая ячейка выводимой таблицы имеет цвет, состоящий из двух частей. Первая формируется циклом с именем rows, а вторая, соответственно, циклом cols. В итоге получается сложный вывод, внешний вид которого к тому же достаточно легко настраивается.

Вывод таблицы с разными цветами и строк, и колонок

Как видите, сложность исходного кода поменялась незначительно, добавился всего лишь еще один оператор инициализации переменной шаблона. В то же время сам шаблонный файл достаточно сильно вырос в объеме. Это означает, с одной стороны, то, что гибкость Smarty дает дизайнеру массу преимуществ. Но это имеет также и оборотную сторону — реализованный шаблон иногда бывает достаточно сложен для отладки.

Отладка, или пользовательская функция debug

Для упрощения отладки сложных шаблонов в Smarty специально введена соответствующая пользовательская функция debug. Она позволяет выводить значения внутренних переменных шаблона непосредственно в ходе его выполнения. Таким образом, например, можно задать одиночный вывод отладочной информации только при первом прохождении контрольной точки:

{counter start=1 skip=1 assign="stopvar" print=false}
{if $stopvar==1}
{debug}
{/if}

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

Небольшой нюанс в работе данной пользовательской функции заключается в том, что, если в браузере по какой-либо причине отключен JavaScript, в ее вызове будет необходимо указать параметр output=html. При этом вся отладка будет направлена в то же самое окно браузера, что и вывод самого шаблона. Такая возможность будет очень полезна при отладке веб-приложений, которые работают из-под консольного браузера Lynx.

Пользовательская функция eval

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

Файл index.php

<?php
require_once("smarty/Smarty.class.php");
$smarty = new Smarty;
$smarty->assign("data", array(1,2,3,4,5,6));
$smarty->assign("rowscolor", 'bgcolor="{cycle values="gold,yellow"}"');
$smarty->display("index.tpl");
?>

Файл templates/index.tpl

<table width="350">
{section name=rows loop=$data}
<tr {eval var=$rowscolor}>
<td align="center">Строка: <strong>{$data[rows]}</strong></td>
</tr>
{/section}
</table>

Данный пример выводит все ту же таблицу с разным цветом строк, однако фактически это сделано не явно, а путем подстановки кода, который был предварительно задан в PHP-скрипте. Можно сказать, что данная функция также будет очень полезна при отладке сложных шаблонов. Ведь можно менять как сам шаблон, так и управляющий код непосредственно из самого PHP-скрипта.

В заключение

Сложность Smarty внешне завуалирована под маской простых методов и свойств, доступных начинающим дизайнерам. Однако такой мощный инструмент позволяет сделать гораздо больше. Конечно, чтобы вполне оценить всю элегантность Smarty, следует попробовать написать PHP-скрипты, которые будут выводить, например, те же данные, что и приведенные выше шаблоны. Никто не утверждает, что это невозможно. Однако в общем итоге разработка веб-приложения с использованием Smarty может быть выполнена намного быстрей, чем без него. И особенно это заметно при длительном изучении шаблонизатора, что подразумевает в том числе и ознакомление с возможностями встроенных пользовательских функций.




Скоро на сайте

  • Wordpress

    Серия статей о плагинах к движку WordPrress
  • AJAX

    Проекты и продукты, ориентированные на AJAX
  • Новые сервисы Google

    Обзор новых сервисов Google
 

Copyright © 2003—2018 Все права защищены

При использовании материалов сайта ссылка на hostinfo.ru обязательна

  • хостинг от .masterhost
  • Rambler's Top100