CGI :: FastTemplate – використання шаблонів в Perl, Perl, Програмування, статті

Jason Moore, Пров. Green Kakadu
Webscript.ru

Для чого потрібні шаблони в CGI скриптах? Для того, щоб життя було радісною! Причому радісною вона буде як у програміста, так і у вебмастера, ну а також у того бідолахи, який скачав безкоштовний CGI скрипт не може підігнати його зовнішній вигляд під свій дизайн (адже не в кожного вистачить відваги відредагувати чужий, незнайомий і чужий всього людського код скрипта)! Шаблони дозволяють кожному займатися своєю справою: у програміста буде акуратний код, без різних HTML нагромаджень, а у вебмастера будуть статичні html документи, з якими він може робити все що завгодно не пристаючи до програміста і тим більше (!) не колупаючись своїми кривими рученятами в кодах. Натрапив я недавно на модуль CGI :: FastTemplate, який справив на мене незабутнє враження своєю простотою і функціональністю, от я і перевів документацію до цього модулю ..

Модуль: CGI::FastTemplate

Автор: Jason Moore <jmoore@sober.com>

Переклад на російську: Green Kakadu <gnezdo.webscript.ru> Спеціально для WebScript.Ru

Завантажити модуль можна тут: CGI-FastTemplate-1.09.tar.gz або звідси: CGI-FastTemplate

WebScript.Ru – Каталог безкоштовних Perl CGI і PHP скриптів

Гніздо: каталог для вебмайстрів – Найбільш популярні і цікаві посилання для вебмайстрів, дизайнерів і веб програмістів.

Про що ви дізнаєтеся ..

Освоївши основні функції цього модуля, ви зможете витворяти щось подібне:

use CGI::FastTemplate;

$tpl = new CGI::FastTemplate();

$tpl = new CGI::FastTemplate(“/path/to/templates”);

CGI::FastTemplate->set_root(“/path/to/templates”); ## папка до шаблонів

$tpl->set_root(“/path/to/templates”); ## або так

$tpl->define( main => “main.tpl”,

              row => “table_row.tpl”,

              all => “table_all.tpl”,

              );

$tpl->assign(TITLE => “I am the title.”);

my %defaults = ( FONT => “<font size=+2 face=helvetica>”,

                         EMAIL => ‘jmoore@sober.com’,

                          );

$tpl->assign(%defaults);

$tpl->parse(ROWS => “.row”);

## ‘.’ додавання до вже наявного значенням

$tpl->parse(CONTENT => [“row”, “all”]);

$tpl->parse(CONTENT => “main”);

$tpl->print();

## виводиться значення, утворене останніми викликом parse ()

$tpl->print(“CONTENT”);

## те ж саме, тому що останній виклик parse () застосовувався до CONTENT

$ref = $tpl->fetch(“CONTENT”);

## створюємо посилання на результати обробки CONTENT,

## тепер $ $ ref можна використовувати для запису вмісту CONTENT в файл

Як це працює?

Шаблон – це звичайний html документ, що містить будь-змінні. В процесі розбору шаблону скриптом, ці змінні замінюються відповідними значеннями, і результат цієї обробки – вже повноцінний HTML документ, який і отримує клієнт. Самий найпростіший шаблон, з однією змінною (‘$ NAME’), може бути наприклад таким:

Привіт $ NAME. Як ся маєш?

Після обробки, замість $ NAME з’явиться якесь значення (наприклад, ім’я відвідувача, а може кілька десятків кілобайт тексту – все залежить від вас!).

Відмінності CGI :: FastTemplate від йому подібних ..

Швидкість.

FastTemplate не використовує функцію eval, А розбір (парсинг) здійснюється при використанні простих регулярних виразів. Крім того, цей модуль здійснює найпростішу заміну змінної на її значення, при цьому в шаблонах не можуть використовуватися небудь логічні структури – вся логіка повинна міститися в коді. Цей модуль названий ‘Fast’ не просто так!

Ефективність.

FastTemplate приймає посилання на змінні, і повертає, коли це можливо їх значення, при цьому позбавляє вас від нагромадження копій одних і тих же аргументів (хешей, скалярів і т.д.)

Гнучкість.

Модуль надзвичайно гнучкий і функціональний, він дозволяє створювати складні і вельми різноманітні HTML документи. Модуль може працювати як під UNIX, так і під NT. Ну і крім того, робота модуля не обмежується лише HTML документами, ви цілком можете використовувати його при роботі з ASCII документами (postscript, XML, email ..)

Ви можете відшукати в CPAN архіві та інші шаблонні модулі:

Module HTML::Template (S/SA/SAMTREGAR/HTML-Template-0.04.tar.gz)

Module Taco::Template (KWILLIAMS/Taco-0.04.tar.gz)

Module Text::BasicTemplate (D/DC/DCARRAWAY/Text-BasicTemplate-0.9.8.tar.gz)

Module Text::Template (MJD/Text-Template-1.20.tar.gz)

Module HTML::Mason (J/JS/JSWARTZ/HTML-Mason-0.5.1.tar.gz)

FastTemplate – інструкції з експлуатації.

Роботу з модулем FastTemplates можна умовно розбити на чотири етапи:

  1. define – визначення / опис необхідних шаблонів
  2. assign – призначення відповідностей
  3. parse – розбір / обробка шаблонів.
  4. print – висновок результатів обробки

А тепер про кожному пункті та про основні методи їх реалізації детальніше ..

define (Хеш)

На цьому етапі ми визначаємо які шаблони будемо використовувати і даємо їм імена, які і будуть використовуватися замість імен самих файлів. Зверніть увагу, що імена файлів-шаблонів з’являються тільки на цьому етапі, define(), І більше вони ніде не фігурують, надалі, для виклику того чи іншого шаблону ми використовуємо присвоєні їм імена.

my $tpl = new FastTemplate();

$tpl->define( main => “main.tpl”,

                 
footer => “footer.tpl”,

                 
);

Це необхідний етап! Можливо, в разі найпростіших прикладів (наприклад, той який зараз наведено), це здається не потрібним і зайвим, але при великій кількості шаблонів (а швидше за все так у вас і буде!) надзвичайно зручно відразу присвоїти всім своїм шаблонам імена через функцію define (), а потім просто посилатися на них.

Підказка: Шаблон, якому ви поставили у відповідність ім’я, використовуючи функцію define(), не завантажується відразу ж на згадку, Тому сміливіше описуйте через define(), Все шаблони, які ви збираєтеся де-небудь і коли-небудь задіяти – реально, ваш шаблон буде завантажений лише тоді, коли його необхідно буде задіяти, і не раніше!

define_nofile (Хеш) синонім: define_raw (Хеш)

Іноді не хочеться створювати окремий файл-шаблон для відображення деяких стандартних видів змінних. Наприклад, ви створили стрічку новин, і самі “гарячі” новини ви бажаєте виділити інакше: зробити заголовки пожирніше, але не хочете для цього створювати окремий шаблон (хоча все-таки рекомендується створювати), так ось подібний трюк ви можете здійснити використовуючи метод define_nofile(), А виглядає це так:

my $tpl = new FastTemplate();

$tpl->define_nofile( new => ‘<b>$ITEM_NAME</b> <BR>’,

                 
old => ‘$ITEM_NAME <BR>’);

if ($new)

   {

   
$tpl->parse($ITEM => “new”);

   
}

else

   
{

   
$tpl->parse($ITEM => “old”);

   
}

Розглядаючи цей варіант, не можна не відзначити, що тепер варіант відображення “гарячої” новини (ну а вобщем випадку чогось дуже потрібного), будете налаштовувати ви, тобто програміст, а якби ви використовували для цих цілей окремий шаблон, то це завдання можна було б передоручити комусь іншому (Васі-дизайнеру, наприклад!)

Хоч використання методу define_nofile(), І є більш ефективним, ніж define() (Не треба зайвий шаблон створювати, завантажувати), але він також і більш заплутаний, тому гарненько подумайте, перш ніж будете його використовувати!

Підказка: метод define_raw (Хеш) – Синонім методу define_nofile(), Тобто одне і теж, але під різними іменами.

assign (Хеш)

Метод assign (Хеш) дозволяє присвоїти вашим змінним певні значення. Таке присвоєння необхідно для всіх змінних, зазначених в шаблонах. Існує дві різні форми методу привласнення.

Перша, проста форма assign(), Задається у вигляді хешу, тобто задаємо пари ключ / значення і ці пари копіюються в FastTemplate. Т.к. в FastTemplate – лише один хеш, то в разі присвоєння одному ключу двох різних значень, відбувається заміна одного значення на інше, наприклад:

$tpl->assign(TITLE => “king kong”);

$tpl->assign(TITLE => “godzilla”);

# # “King kong” замінюється на “godzilla”

assign (Посилання на Хеш)

Більш ефективним способом присвоєння змінним відповідних значень є створення посилань на хеши. (Це особливо зручно, якщо ми ставимо посилання на хеш, що видається нам в якості результатів звернення до бази даних.) При створенні посилання на хеш не відбувається копіювання даних. В процесі обробки шаблона (parsing), якщо в основному хеше FastTemplates не знаходить необхідні значення для змінних відбувається перевірка хешей, на які поставлені посилання. Як тільки для змінної знайдено значення, перегляд хешей зупиняється. Важливо пам’ятати, Що необхідно вчасно видаляти непотрібні посилання на хеши, інакше будуть різні недоладності

my %foo = (“TITLE” => “king kong”);

my %bar = (“TITLE” => “godzilla”);

$tpl->assign(%foo);

# # TITLE призначається значення “king kong”

$tpl->clear_href(1);

# # Видаляємо останнє привласнення посилання на хеш (% foo)

$tpl->assign(%bar);

# # TITLE призначається значення “godzilla”

$tpl->clear_href();

# # Видаляємо все присвоєння посилань на хеши

$tpl->assign(%foo);

# # TITLE призначається значення “king kong”

$tpl->assign(%bar);

# # TITLE також (!) Призначається значення “godzilla”

parse (Хеш)

Це основна функція FastTemplate, вона приймає хеш, де ключ – це ім’я мети обробки (TARGET), а друге значення – це імена шаблонів, які ми піддамо обробці, тобто це ЩО ми будемо обробляти (SOURCE). Можливі три варіанти хешей:

$tpl->parse(MAIN => “main”); ## regular

$tpl->parse(MAIN => [“table”, “main”]); ## compound

$tpl->parse(MAIN => “.row”); ## append

regular: при використанні цього способу, у нас відбувається завантаження шаблону main (якщо він не був завантажений раніше), далі відбувається підстановка (інтерполяція): всі змінні замінюються на відповідні їм значення, і результат цієї обробки зберігається в FastTemplate як значення MAIN. Якщо пізніше при обробці зустрінеться шаблон, що містить змінну ‘$ MAIN’, то вона буде замінена відповідним значенням, тобто результатом обробки шаблону main. Це дозволяє вам “вмонтувати” зміст одного шаблону в інший.

Таке впровадження зручно здійснювати використовуючи другий варіант compound,Запис

$tpl->parse(MAIN => [“table”, “main”]); ## compound

Повністю аналогічна такий:

$tpl->parse(MAIN => “table”);
$tpl->parse(MAIN => “main”);

Тільки здійснюється compound швидше.

Увага! При використанні методу compound, Необхідно, щоб у списку імен шаблонів, кожне наступне містило змінну, яка б замінювалася на дані обробки попередніх їй шаблонів. Наприклад, у наведеному вище прикладі compound, Шаблон з ім’ям main повинен обов’язково містити змінну ‘$ MAIN’, в яку будуть поміщені дані, отримані при обробці шаблону table. Якщо ж, в шаблоні main змінної $ MAIN не виявиться, то дані обробки шаблону table будуть ВТРАТИТИ!

append – Дозволяє дані обробки шаблону додати до вже наявного значенням якої-небудь змінної. Такий спосіб зручно використовувати при генерації таблиць, коли кількість рядків таблиці – змінна величина. Варіант практичного застосування: оформлення результатів на запит до БД – тобто робиться цикл, в якому обробляється один рядок і результат обробки додається до вже отриманих значень (тобто щось зразок лічильника-накопичувача. Більш наочний приклад буде продемонстрований наприкінці документації).

strict() За замовчуванням опція включена. У разі виявлення в шаблоні змінних, які невизначені відбувається виведення попередження в STDERR, щось на зразок цього:

[CGI::FastTemplate] Warning: no value found for variable: SOME_VARIABLE

У більш нової версії 1.04 такі “невизначені” змінні будуть залишатися в документі, це зроблено з двох причин: ви зможете використовувати багаторазову обробку одного і того ж документа (тобто деякі змінні будуть визначені не відразу, а після якоїсь події), і крім того, так легше відловлювати “втрачені змінні”. Якщо ви працювали зі старою версією FastTemplate і хотіли б залишити колишнє поведінка модуля при парсінгу (тобто коли замість усіх невизначених нічого не відображалося), то вам варто використовувати функцію no_strict(), Про яку сказано трохи нижче.

Примітка. З версії 1.07 додана підтримка двох видів змінних, що вказуються в шаблоні, $ VAR і $ {VAR} – ці два записи абсолютно еквівалентні. Але у випадку, якщо змінна, зазначена в шаблоні як $ {VAR}, виявиться “Невизначеною”, то в результатах вона з’явиться як $ VAR – це невелика неузгодженість, в ідеалі, звичайно треба б вивести все як є, тобто $ {VAR}.

Примітка. Всі повідомлення про помилки виводяться через STDERR і зберігаються в логах сервера error_log. Іноді, коли щось не працює, варто туди заглядати 🙂

no_strict() Ця функція “вимикає” повідомлення про помилки при виявленні неопрелделенних змінних в шаблоні. З версії 1.04 виклик no_strict() нічого не виводить замість невиявлених змінних. За замовчуванням, вважається що включена функція strict(), Установка no_strict() повинна відбуватися при кожному зверненні до FastTemplate.

CGI :: FastTemplate :: no_strict; # # Немає

my $tpl = CGI::FastTemplate;

$ Tpl-> no_strict; # # Та

print (Скаляр)

Метод print() виводить вміст названої змінної. Якщо ніяка змінна не дається, то виводиться змінна, утворена при останньому виклику parse() .

Наприклад:

$tpl->parse(MAIN => “main”);

$ Tpl-> print (); # # виводить значення MAIN

$ Tpl-> print (“MAIN”); # # те ж саме

Якщо необхідний висновок результатів не в STDOUT (а наприклад в socket, файл), то дивіться функцію fetch().

Інші методи.

fetch (Скаляр)

Повертає посилання на оброблені дані. Наприклад:

$tpl->parse(CONTENT => “main”);

my $content = $tpl->fetch(“CONTENT”);

print $ $ content; # # висновок через STDOUT

print FILE $ $ content; # # друк в файл

clear()

Примітка. Зверніть увагу, що всі функції ‘clear’ призначені в основному для mod_perl. Для написання CGI сценаріїв вони не особливо потрібні (особливий випадок – згадуваний раніше clear_href())

Очищає службовий хеш, в якому зберігаються дані передаються при виклику функцій assign () і parse ()Часто clear () використовується в кінці mod_perl сценаріїв, наприклад:

$tpl->print();

$tpl->clear();

clear (Масив)

Якщо не передається жодного імені змінної або масиву, то будуть видалені всі змінні, які пройшли процедуру assign() або parse(), Якщо ж зазначено якесь конкретне ім’я або список змінних, то видалені будуть тільки зазначені змінні.

Наприклад:

$tpl->assign(TITLE => “Welcome”);

$ Tpl-> clear (“TITLE”); # # title тепер порожній.

Інший спосіб досягнення подібного ефекту – це просто призначення змінної порожнього значення, наприклад:

$tpl->assign(TITLE => ”);

# # Теж що і: $ tpl-> clear (“TITLE”);

clear_parse() Див clear ()

clear_href (Число)

Видаляє посилання на хеш під заданим номером у списку посилань, які ми створювали таким чином (див. також вищевикладений метод assign() ):


$tpl->assign(HASH REF);

Якщо при виконанні функції ніяких аргументів не вказано, то віддаляються всі існуючі посилання.Ця функція часто використовується при обробці результатів запитів, отриманих від БД, наприклад:

while($hash_row = $sth->fetchrow_hashref)

       {

       $tpl->assign($hash_row);

      
$tpl->parse(ROW => “.row”);

      
$tpl->clear_href(1);

      
}

clear_define()

Видаляє хеш, в якому зберігаються дані передаються при зверненні:

$tpl->define();

Примітка: хеш, який містить ВЖЕ завантажені шаблони, не видаляєтсья при використанні цього методу. Для того, щоб її таки видалити скористайтеся функцією clear_tpl

clear_tpl()  clear_tpl (Ім’я)

Якщо шаблон, використовувався хоч раз, то він буде зберігається в пам’яті. Функція clear_tpl() – Видаляє всі завантажені шаблони, а функція clear_tpl (ІМ’Я) – Видаляє лише один вказаний шаблон. Подібні функції, має сенс використовувати при виконанні великих сценаріїв, коли є багато шаблонів і потрібно економити ресурси пам’яті.

clear_all()

Очищає модуль від всіх даних. Виклик цієї функції рівнозначний одночасного звернення до всіх цих функцій:

$tpl->clear_define();

$tpl->clear_href();

$tpl->clear_tpl();

$tpl->clear_parse();

Змінні

Змінні мають такий вигляд:

$[A-Z0-9][A-Z0-9_]+

Це означає, що в шаблонах, всі змінні повинні починатися зі знака долара “$”, а наступним знаком можуть бути або заголовні латинські літери, або цифри, і знак підкреслення “_” (або те, інше і третє разом).

З версії 1.07 можливо також таке оформлення змінних $ {[A-Z0-9] [A-Z0-9_] +}, тобто ім’я змінної в фігурної дужки.

Ось приклад того, як ви можете називати свої змінні:

$FOO

$F123F

$TOP_OF_PAGE

${NEW_STYLE}

Інтерполяція (підстановка) змінних

В процесі обробки шаблонів (парсингу) відбувається перевірка всіх оброблюваних шаблонів на утримання змінних – це досить слизький момент, тому що обробник вельми “жадібний” і якщо відразу ж після вашої змінної йдуть ще якісь символи, то їх він може порахувати ім’ям однієї змінної. (Наприклад, є змінна $ MY_VAR, а в шаблоні ви напишете так: $ MY_VARWELCOME, тоді обробник порахує змінної $ MY_VARWELCOME, яка виявиться невизначеною) Будьте обережні! З версії 1.07 ви можете задавати змінні в такому вигляді $ {MY_VAR} – це дещо покращує ситуацію з вищевикладеної проблемою.

Якщо змінна, згадана в шаблоні виявляється невизначеною, то можливі такі варіанти:

1. Якщо використовується функція strict() (Використовується за замовчуванням), то все невизначені змінні залишаться в результатах обробки без змін (тобто була в шаблоні змінна $ MY_VAR, і якщо для неї ніякого значення не знайшлося, то в результаті обробки шаблонів у нас вона буде видна $ MY_VAR), при цьому прідупрежденіе про помилку буде скинути в STDERR.

2. Якщо використовується функція no_strict(), То замість всіх невизначених змінних буде вставлено пусте місце [”]

Прояснимо все вищесказане на прикладі:

Припустимо, у нас є такі значення для змінних:

$FOO = “foo”;

$BAR = “bar”;

$ONE = “1”;

$TWO = “2”;

$UND = “_”;

Запис Змінній в шаблоні Висновок після обробки Примітки
$FOO foo
$FOO-$BAR foo-bar
$ONE_$TWO 2 $ ONE_ невизначена! При використанні no_strict()
$ONE_$TWO $ONE_2 при зверненні strict()
$ONE$UND$TWO 1_2 все нормально
${ONE}_$TWO 1_2 але так симпатичніше!
$$FOO $foo
$25,000 $25,000

А тепер спробуємо!

Цей скрипт-приклад, побудує HTML сторінку, яка складається з таблиці. У таблиці буде складатися з трьох пронумерованих рядків. Визначимо, які шаблони нам необхідні: для того, щоб легше було змінити кількість рядків у таблиці, зробимо окремий шаблон для одного рядка, ще один шаблон для таблиці, і ще один основний, куди буде вписана сама таблиця.

Ось, html коди цих шаблонів(Кожен з них необхідно зберегти в окремому файлі)

Шаблон 1:

<!– NAME: main.tpl –>

<html>

<head><title>$TITLE</title>

</head>

<body>

$MAIN

</body>

</html>

<!– END: main.tpl –>

Шаблон 2:

<!– NAME: table.tpl –>

<table>

$ROWS

</table>

<!– END: table.tpl –>

Шаблон 3:

<!– NAME: row.tpl –>

<tr>

<td>$NUMBER</td>

<td>$BIG_NUMBER</td>

</tr>

<!– END: row.tpl –>

А тепер напишемо скриптик …

## START ##

use CGI::FastTemplate;

my $tpl = new CGI::FastTemplate(“/path/to/template/files”);

$tpl->define( main => “main.tpl”,

                  
table => “table.tpl”,

                  
row => “row.tpl”,

                  
);

$tpl->assign(TITLE => “FastTemplate Test”);

for $n (1..3)

              
{

              
$tpl->assign( NUMBER => $n,

              
BIG_NUMBER => $n*10);

              
$tpl->parse(ROWS => “.row”);

              
}

$tpl->parse(MAIN => [“table”, “main”]);

$tpl->print();

## END ##

В результаті роботи скрипта ми одержимо такий код:


<!– NAME: main.tpl –>

<html>

<head><title>FastTemplate Test</title>

</head>

<body>

<!– NAME: table.tpl –>

<table>

<!– NAME: row.tpl –>

<tr>

<td>1</td>

<td>10</td>

</tr>

<!– END: row.tpl –>

<!– NAME: row.tpl –>

<tr>

<td>2</td>

<td>20</td>

</tr>

<!– END: row.tpl –>

<!– NAME: row.tpl –>

<tr>

<td>3</td>

<td>30</td>

</tr>

<!– END: row.tpl –>

</table>

<!– END: table.tpl –>

</body>

</html>

<!– END: main.tpl –>

Можливо, ви після всього цього подумаєте: “А навіщо городити город, коли можна просто вставити кілька HTML тегів прямо в код скрипта?” Так можна і так, тільки чи буде це простіше? Вам, може бути, але що робити дизайнеру, якого не приваблюють perl коди? А яка морока у вас буде при створенні скрипта з підтримкою декількох мов, або якщо знадобиться вибір між текстовим і графічним дизайном для одного і того ж сайту? Модуль FastTemplate дозволяє вам повністю відокремити дизайн від технічного виконання – хіба це не здорово?

COPYRIGHT

Copyright (c) 1998-2001 Jason Moore <jmoore@sober.com>. All rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Artistic License for more details.

Автор: Jason Moore <jmoore@sober.com>

Переклад на російську: Green Kakadu <gnezdo.webscript.ru

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*