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

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

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

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

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

Функция html_image
Назначение пользовательских функций это в первую очередь, конечно же, дать свободу для изменения шаблона пользователем. Поэтому в их состав включены достаточно забавные вещи. Например, такой непонятной на первый взгляд гостьей в этом ряду функций является html_image, которая предназначена для вывода изображений. Вы спросите, зачем это нужно, ведь проще вставить тег <img  src=.... Однако не все так просто, как кажется на первый взгляд. Достаточно представить требование дизайнера указывать в изображениях их размеры, что может понадобиться для сохранения дизайна страницы, — и сразу стает понятен тайный смысл наличия этой функции в Smarty. Вот небольшой пример вставки картинки в шаблон:

{html_image  file="http://ya.ru/logo.png"  alt="Вечно  этот  яндекс  меняет  логотипы!"  href="http://ya.ru/"  border=0}  
{html_image  file="http://ya.ru/logo.png"  }  

Этот код покажет следующий результат, для удобства рядом с картинками расположены и их html-представления.

html_image в шаблоне и в браузере
html_image в шаблоне и в браузере

Как видите, мы не указывали размеров, Smarty их "сам" взял из закачанных файлов. Кроме того, обратите внимание на вставленную интерпретатором шаблона гиперссылку, где идет речь о первой строке примера. Вероятно, такое представление картинок в шаблоне все же несколько организованней, хотя при этом и менее верно в плане SEO, чем простое <a  href=...><img  src=...>.

Функция html_table
Табличный дизайн — один из наиболее практичных видов организации информации на веб-странице. Как правило, он отлично показывается во всевозможных браузерах. Именно поэтому он снискал всеобщее признание, и, как это ни странно, в Smarty встроена специальная функция для создания html-таблиц. Фактически пользователю предоставляется удобная возможность показа таблицы каких-либо значений. Например, если необходимо вывести статистику либо другие данные, которые удобно представить в таблице, данная функция значительно упростит вам жизнь. Вот пример вывода данных о текущей базе данных. В примере будет использована пустая база последней версии WP (2.6.2. — на момент написания статьи).

Программная часть   
<?php  
    require_once(  "./smarty/Smarty.class.php");  
    require_once(  "./classes/db.class.php");  
    $smarty  =  new  Smarty;  
    $smarty->assign(  "config_mysql_base",    $config_mysql_base  );  
    $res  =  $mdb->query(  "SHOW  TABLES  "  );  
    while  (  $arr_q  =  mysql_fetch_array(  $res  )    )  
    {  
        $table  =  $arr_smarty[]    =  $arr_q[0];  
        $o  =  $mdb->query_obj(  "SELECT  count(*)  c  FROM  $table"  );  
        $arr_smarty[]    =  $o->c;  
    }  
    $smarty->assign(  "arr",  $arr_smarty  );  
    $smarty->display(  "index.tpl"  );  
?>  

Небольшие комментарии к коду. Вначале выполняется запрос к базе данных о составе таблиц. Далее в массив $arr_smarty заносятся имя таблицы и количество записей в ней. Шаблон должен всего лишь вывести таблицу. При этом указывается, что в ней две колонки.

Шаблон   
{html_table  loop=$arr  cols="Таблица,записей"  caption="БД  $config_mysql_base"}    

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

html_table показывает состав базы WP 2.6.2
html_table показывает состав базы WP 2.6.2

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

Программная часть   
...  
$smarty->assign(  "tr_attr",    array(  "bgcolor=#eeeeee","bgcolor=#dddddd"  )  );  
...  

Шаблон   
{html_table    
  loop=$arr    cols="Таблица,записей"    caption="БД  $config_mysql_base"    
  tr_attr="$tr_attr"    table_attr="border=1  style='font-size:11;font-family:verdana;'"  
}  

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

html_table с оформлением
html_table с оформлением

Функция mailto
Функция mailto служит для создания ссылок на электронный адрес. Как известно, размещение своей электронной почты в Сети в текстовом виде является потенциальной угрозой. Вы можете начать получать спам, вирусы и другую нежелательную корреспонденцию. Чтобы защититься от таких явлений, Smarty позволяет заменять вывод простой гипертекстовой ссылки mailto: на JavaScript код, который, собственно, и выполняет сам вывод. Настройка функции на такой вывод осуществляется с помощью присвоения параметру encode одного из следующих значений — javascript или javascript_charcode. Таким образом, прямой парсинг веб-страницы, которая будет содержать такую ссылку, будет несколько затруднен.

  
{mailto  subject="По  поводу  следующей  статьи:"  address="hostinfo@hostinfo.ru"  encode="javascript"}  

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

Код, созданный mailto
Код, созданный mailto

Функция math
Видимо, в надежде на php-код сам smarty-шаблон мало приспособлен для математических расчетов. Чтобы как-то компенсировать пользователям этот неприятный момент, в состав системы добавлена функция math. С ее помощью можно выполнять несложные математические действия, используя математические знаки и целый ряд функций, полный список которых приведен в документации. Например, следующим образом можно выполнить расчет процентов по банковскому вкладу с помесячной капитализацией:

Программная часть   
<?php  
    require_once(  "./smarty/Smarty.class.php");  
    $smarty  =  new  Smarty;  
  
    for  (  $i=1  ;  $i<=12  ;  $i++)  
        $arr[]  =  $i;  
  
    $smarty->assign(  "arr",  $arr  );  
    $smarty->display(  "index.tpl"  );  
?>  

Шаблон   
{assign  var=perc              value=12}  
{assign  var=summ              value=1000}  
Расчет  процентов  с  помесячной  капитализацией  %<br>  
Сумма  вклада:{$summ}  
Проценты  за  год:{$perc}  
<hr>  
{section  loop=$arr  name=month  }  
  {math  equation="y+y*(x/(12*100))"  x=$perc  y=$summ  assign=summ}  
  {math  equation="y*(x/(12*100))"  x=$perc  y=$summ  assign=perc_m}  
  Месяц:{$arr[month]}  Проценты:{$perc_m|string_format:"%.2f"}  Сумма:{$summ|string_format:"%.2f"}<br>  
{/section}  

Следует отметить, что функция math достаточно ресурсоемкая. Причиной тому является внутренняя реализация, которая использует интерпретатор php-кода в строковом оформлении (eval). Поэтому пользоваться ею следует действительно в тех случаях, когда нет иного выхода. И гораздо лучшим выбором по критерию использования ресурсов системы может стать перенос подобных расчетов в php-код.

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





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

  • Wordpress

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

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

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

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

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

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