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

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

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

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

Функция fetch
При создании разнообразных веб-проектов часто приходится заниматься взаимодействием своего программного решения с разнообразными источниками данных. Наиболее общий случай обработки входных массивов информации состоит в считывании содержимого файла, который размещен где-то в Сети, и дальнейшем показе его в составе собственного сайта. Именно для такого случая вам может пригодиться встроенная в 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
Вывод с помощью функции fetch

При работе с данной функцией в качестве параметра file можно задавать адрес ftp-сервера, причем, конечно же, можно указать как логин, так и пароль доступа в общепринятом формате URL. Правда, эти данные передаются в шаблон небезопасно и могут быть раскрыты при его модификации сторонним пользователем. Поэтому есть смысл использовать функцию fetch исключительно для передачи ftp-данных, которые являются общедоступными или уж, по крайней мере, защищенными от изменения. Конечно, это актуально в том случае, если шаблон самостоятельно не обрабатывает принятые данные.

html функции
При работе с веб-базами данных очень часто возникает вопрос: каким образом наиболее эффективно управлять разнообразными пользовательскими интерфейсами, которые включают в себя онлайн-формы? Для этого разработчики Smarty включили в состав системы сразу целую группу столь необходимых для облегчения жизни программиста и веб-дизайнера функций. Вот их краткие характеристики:
  • html_checkboxes — создание групп "чекбоксов";
  • html_options — создание списка выбора;
  • html_radios — функция для управления радиокнопками;
  • html_select_date — создание диалога ввода даты;
  • html_select_time — ввод времени.
Конечно же, всю работу по построению элементов форм, которую эти функции, собственно говоря, и призваны несколько облегчить, можно было бы выполнить и вручную, просто "прописав" весь необходимый html-код в шаблоне. Но представьте себе, например, ситуацию, когда необходимо указать, к какой категории относится материал онлайновой базы данных, и при этом заказчик считает, что он может относиться одновременно к нескольким категориям. Сразу станет очевидной необходимость наличия функций для облегчения построения форм. Ведь для создания подобных элементов управления, например, с помощью цикла придется потратить множество усилий и работать со сложными массивами данных.

Функция html_checkboxes
В то же время просто применение дружественного интерфейса к базе данных, который имеет соответствующие методы, позволит значительно упростить как сам код, так и шаблон. Конечно же, необходимость в "правильном" классе для подготовки входных данных вызвана тем, что в составе пользовательских функций 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_options
При работе с 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

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

Ввод даты и времени
Для работы с вводом даты и времени в 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.





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

  • Wordpress

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

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

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

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

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

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