Пользовательские функции в Smarty. Часть 2
Любой мощный инструмент без подробной инструкции может оказаться всего лишь очередной кучей железа, которая занимает полезную площадь. Поэтому так важно уметь и знать особенности стандартного функционала, доступного в таких больших приложениях, как Smarty. Конечно же, сама система шаблонов позволяет проводить поэтапное изучение своих возможностей как разработчиком, так и дизайнером. Но в любом случае, если кто-то пробует изучать функционал Smarty, преодолеть начальные трудности будет намного легче, именно зная особенности простейших методов и функций, которые используются в шаблонах. В этой статье будет рассказано про пользовательские функции Smarty, которые отвечают за построение форм и упрощают манипуляции с веб-данными.
При создании разнообразных веб-проектов часто приходится заниматься взаимодействием своего программного решения с разнообразными источниками данных. Наиболее общий случай обработки входных массивов информации состоит в считывании содержимого файла, который размещен где-то в Сети, и дальнейшем показе его в составе собственного сайта. Именно для такого случая вам может пригодиться встроенная в Smarty функция fetch.
Возможности этой функции ограничены областью применения. Вы сможете работать с двумя наиболее распространенными протоколами доступа к файлам в Интернете — FTP и HTTP. Иными словами, вы можете спокойно показать в составе собственного сайта тот же rss-фид либо просто текстовые данные, которые ранее были расположены на одном из ftp-серверов либо страниц и автоматически показывать их на множестве сайтов, использующих Smarty. Такая возможность позволит также, например, показывать новости на всех сайтах, которые относятся к одной компании. В качестве иллюстрации возможностей данной функции можно привести следующий пример. Просто добавив такой код в шаблоне, можно добиться вывода двух стартовых страниц www.ya.ru в одном окне браузера:
{fetch file='http://www.ya.ru/' assign='text'}
{if $text}
<table>
<tr>
<td width=50%>
<div id="weather">{$text}</div>
</td>
<td width=50%>
<div id="weather">{$text}</div>
</td>
</tr>
</table>
{else}
не могу загрузить данные с другого сервера!
{/if}
Вывод с помощью функции fetch |
При работе с данной функцией в качестве параметра file можно задавать адрес ftp-сервера, причем, конечно же, можно указать как логин, так и пароль доступа в общепринятом формате URL. Правда, эти данные передаются в шаблон небезопасно и могут быть раскрыты при его модификации сторонним пользователем. Поэтому есть смысл использовать функцию fetch исключительно для передачи ftp-данных, которые являются общедоступными или уж, по крайней мере, защищенными от изменения. Конечно, это актуально в том случае, если шаблон самостоятельно не обрабатывает принятые данные.
При работе с веб-базами данных очень часто возникает вопрос: каким образом наиболее эффективно управлять разнообразными пользовательскими интерфейсами, которые включают в себя онлайн-формы? Для этого разработчики Smarty включили в состав системы сразу целую группу столь необходимых для облегчения жизни программиста и веб-дизайнера функций. Вот их краткие характеристики:
- html_checkboxes — создание групп «чекбоксов»;
- html_options — создание списка выбора;
- html_radios — функция для управления радиокнопками;
- html_select_date — создание диалога ввода даты;
- html_select_time — ввод времени.
Конечно же, всю работу по построению элементов форм, которую эти функции, собственно говоря, и призваны несколько облегчить, можно было бы выполнить и вручную, просто «прописав» весь необходимый html-код в шаблоне. Но представьте себе, например, ситуацию, когда необходимо указать, к какой категории относится материал онлайновой базы данных, и при этом заказчик считает, что он может относиться одновременно к нескольким категориям. Сразу станет очевидной необходимость наличия функций для облегчения построения форм. Ведь для создания подобных элементов управления, например, с помощью цикла придется потратить множество усилий и работать со сложными массивами данных.
В то же время просто применение дружественного интерфейса к базе данных, который имеет соответствующие методы, позволит значительно упростить как сам код, так и шаблон. Конечно же, необходимость в «правильном» классе для подготовки входных данных вызвана тем, что в составе пользовательских функций Smarty есть функции, которые способны принять входные параметры в виде ассоциативных массивов. Одной из таких функций является html_checkboxes, которая выводит массив html-флажков. Конечно, для ее корректной работы необходимо вначале подготовить входные данные. Например, для указанного выше примера с множеством категорий будет просто необходимо иметь возможность создать ассоциативный массив. Причем желательно выполнять это не с помощью цикла, перебирающего записи и заполняющего сам массив, а с помощью метода класса базы данных, причем из единственного sql-запроса. В итоге, если вы имеете такой класс и нужные методы, подготовка данных для веб-интерфейса типа «один ко многим» может быть выполнена следующим образом:
Файл index.php
<?php
require_once( "./smarty/Smarty.class.php");
require_once( "./classes/db.class.php");
$smarty = new Smarty;
$smarty->assign( "arr", $mdb->query_asc( "SELECT id,name FROM realty_mgroup" ) );
$smarty->display( "index.tpl" );
?>
В приведенном выше коде выполняется запрос к таблице базы данных (realty_mgroup), которая содержит список групп. После чего результат запроса заносится в ассоциативный массив, который неявно передается в шаблон как параметр {$arr}. Тонкость состоит в том, что первый результат запроса (id) используется в качестве ключа этого массива, а второй — в качестве значения. При этом сам шаблон, который будет выводить список флажков, каждый из которых относится к определенной категории, будет состоять всего лишь из одной строки:
Файл index.tpl
{html_checkboxes name="id" options=$arr separator="<br>"}
Можно сказать, что простота получившегося кода очень показательна. Основные усилия проектировщика будут затрачены на написание удобного интерфейса к базе данных, ну либо же на использование уже существующего стандартного класса, такого, например, как AdoDb. Причем, как вы понимаете, такой класс пишется, или же изучается, единожды. После чего в будущем разработчик сможет создавать сложные интерфейсы уже намного быстрей, чем без использования такой функции.
Для большей наглядности на следующей картинке желтым выведены названия полей группы «чекбоксов»:
Массив флажков, выведенный одной строкой шаблона |
При работе с html-формами часто бывает необходимо создавать выпадающие списки. Такая необходимость нужна в том случае, когда необходимо присвоить какому-либо параметру одно значение из нескольких возможных. Конечно же, в Smarty есть соответствующая пользовательская функция, которая позволяет упростить и эту процедуру.
Файл index.tpl
Выберите группу вашего объявления:<br>
{html_options name="id" options=$arr}
В этом примере используется... тот же программный файл для подготовки данных, что и в предыдущем примере. Единственное же отличие шаблона от предыдущего примера только в названии функции и в отсутствии параметра, показывающего разделитель для значений. При этом браузер выведет уже выпадающий список вместо группы «чекбоксов». Аналогично, собственно, работает и функция html_radios. Конечно же, есть несколько отличий между тремя функциями, которые обеспечивают ввод данных из списка. Но, по сути, они все административного характера. В программном же плане эти функции имеют очень похожие интерфейсы.
Файл index.tpl
Выберите группу вашего объявления:<br>
Выпадающий список:<br>
{html_options name="sid" options=$arr separator="<br>"}<br><br>
Радиокнопки:<br>
{html_radios name="rid" options=$arr separator="<br>"}
В этом примере выводятся радиокнопки и впадающий список, данные для их вывода используются одни те же — все из того же предыдущего примера. Вот результат работы данного шаблона:
Выпадающее меню и радиокнопки из Smarty |
Кроме возможности работы с ассоциативными массивами, пользовательские функции вывода списков позволяют также задавать входные значения в виде отдельных массивов как для значений, так и для названий. Таким образом, можно написать шаблон, который будет более удобен для использования начинающим дизайнером за счет его универсальности и разбиения входных данных на части.
Для работы с вводом даты и времени в Smarty существует две различные функции — соответственно, html_select_date и html_select_time. В них предусмотрена масса входных параметров, которые позволят настроить внешний вид выводимых полей таким образом, как вам это действительно необходимо. Вот, например, так выглядит пример вывода на редактирование первых десяти записей таблицы, содержащей поле с именем timestamp (в формате DATETIME).
Файл index.php
<?php
require_once( "./smarty/Smarty.class.php");
require_once( "./classes/db.class.php");
$smarty = new Smarty;
$i = 0;
$res = $mdb->query( "SELECT *,UNIX_TIMESTAMP(timestamp) uts FROM realty_ads LIMIT 10 " );
while ( $o = mysql_fetch_object( $res ) )
{
$arr[$i ]["obj"] = $o;
$arr[$i++]["pre"] = "rec".$o->id;
}
$smarty->assign( "records", $arr );
$smarty->display( "index.tpl" );
?>
Фактически этот код необходим только для выборки всех полей и занесения их в массив, передаваемый в Smarty. На самом деле, если такие конструкции используются постоянно, всегда есть смысл разрабатывать или использовать специальные методы класса базы данных, которые позволят передавать данные в массив в виде записи в один оператор, а не в два, как указано на предыдущем листинге.
Для вывода результатов для представленного ранее кода используется несколько более сложный шаблон, чем в предыдущих примерах. Это обусловлено необходимостью организации цикла и настройки вида поля выбора даты.
Файл index.tpl
Список дат первых 10-ти записей:<br><br>
{section name=recs loop=$records}
Дата:
{html_select_date
all_extra="style='width:50px'"
prefix= $records[recs].pre
name="sid"
time=$records[recs].obj->uts
start_year=-5
end_year=+5
}
- дата: {$records[recs].obj->timestamp} <br>
{/section}
Обратите внимание на параметры start_year и end_year, они нужны для организации ввода года. Поскольку Smarty не знает, как вы захотите варьировать этот параметр, необходимо указывать промежуток, который будет использоваться для выбора года. Кроме того, следует помнить, что фактически в контексте формы вывод пользовательской функции html_select_date будет представлять собой несколько полей. Для того чтобы сделать возможным их обработку, следует использовать префикс, который система подставит в имена соответствующих полей.
Вывод к редактированию списка дат |
Функции для создания полей даты/времени имеют целую массу входных параметров, которые просто невозможно перечислить, а необходимо просто использовать по мере надобности. Практически данные пользовательские функции являются чрезвычайно универсальными в плане форматирования, представления и организации ввода.
Работа с веб-базами является одной из наиболее востребованных задач при построении административных и пользовательских интерфейсов управления. Для того чтобы унифицировать используемые при этом методы проектирования, вполне можно использовать пользовательские функции Smarty, которые являются универсальными. Таким образом, создание похожих функций в различных проектах может быть очень ускорено за счет заимствования ранних разработок. При этом использование описанных мною простейших методов для организации интерфейсов гарантирует, что ваш шаблон будет «понят» любым специалистом в области Smarty.
Источник: hostinfo.ru