|
|
У smarty включено декілька вбудованих функцій. Вбудовані функції інтегровані в мову шаблонів. Не можна створювати призначені для користувача функції з такими ж назвами або як-небудь змінювати вбудовані функції.
{capture}
{config_load}
{foreach},{foreachelse}
{if},{elseif},{else}
{include}
{include_php}
{insert}
{ldelim},{rdelim}
{literal}
{php}
{section},{sectionelse}
{strip}
{capture}
{capture} використовується для того, щоб отримати результати виведення в певну змінну, замість того, щоб вивести результати оглядачу. Будь-який вміст між {capture name="foo"} та {/capture} записується у змінну, що вказана в атрибуті name. Після цього цей вміст можна використати в шаблоні за допомогою спеціальної змінної $smarty.capture.foo, де "foo" - значення атрибуту "name". Якщо атрибут "name" не вказаний, то використовується "default". Кожна команда {capture} повинна мати пару {/capture}. Команда {capture} підтримує вкладеність.
Приклад 7-1. Збереження виведення шаблону
{* ми не хочемо виводити рядок таблиці, якщо вміст не відображається *}
{capture name=banner}
{include file='get_banner.tpl'}
{/capture}
{if $smarty.capture.banner ne ''}
<table>
<tr>
<td>
{$smarty.capture.banner}
</td>
</tr>
</table>
{/if}
Приклад 7-2. збереження вмісту в змінну
Цей приклад також демонструє функцію popup
{capture name=some_content assign=popText}
.... some content ....
{/capture}
<a href="#" {popup caption='Help' text=$popText}>help</a>
Див. також: $smarty.capture, {eval}, {fetch}, fetch() и {assign}.
{config_load}
{config_load} використовується для завантаження конфігураційних змінних (#variable#) з конфігураційних файлів в шаблон
Ім'я атрибуту |
Тип |
Обов'язковий |
По замовчуванню |
Опис |
file |
string |
Так |
Не визначений |
Ім'я config файлу для завантаження |
section |
string |
Ні |
Не визначений |
Ім'я секції для завантаження |
scope |
string |
Ні |
local |
Спосіб обробки області видимості завантажених змінних. Повинен бути одінм з local, parent або global. local означає, що змінні завантажені в контекст локального шаблону. parent означає, що змінні завантажені в контекст як локального, так і батьківського шаблону. global означає, що змінні доступні з будь-якого шаблону. |
global |
boolean |
Ні |
No |
Чи доступні змінні з батьківського шаблону. Аналогічний scope=parent. ЗАУВАЖЕННЯ: Цей атрибут перекривається атрибутом scope, але все ще підтримується. Якщо scope вказаний, то це значення ігнорується. |
Приклад 7-3. config_load
example.conf
#це коментар конфігураційного файлу
# глобальні змінні
pageTitle = "Main Menu"
bodyBgColor = #000000
tableBgColor = #000000
rowBgColor = #00ff00
#секція змінних customer
[Customer]
pageTitle = "Customer Info"
і шаблон
{config_load file="example.conf"}
<html>
<head>
<title>{#pageTitle#|default:"No title"}</title>
</head>
<body bgcolor="{#bodyBgColor#}">
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
<tr bgcolor="{#rowBgColor#}">
<td>First</td>
<td>Last</td>
<td>Address</td>
</tr>
</table>
</body>
</html>
Конфігураційні файли можуть також містити секції. Ви можете завантажувати змінні з певної секції, вказавши атрибут 'section'.
Зауваження: Секції файлів конфігурації і вбудована функція section не мають нічого спільного, окрім схожої назви.
Приклад 7-4. функція config_load з секцією
{config_load file='example.conf' section='Customer'}
<html>
<head>
<title>{#pageTitle#|default:"No title"}</title>
</head>
<body bgcolor="{#bodyBgColor#}">
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
<tr bgcolor="{#rowBgColor#}">
<td>First</td>
<td>Last</td>
<td>Address</td>
</tr>
</table>
</body>
</html>
Див. $config_overwrite для масивів конфігураційних змінних.
Див. також: Конфігураційні файли, Конфігураційні змінні $config_dir, get_config_vars() і config_load().
{foreach},{foreachelse}
Цикли {foreach} є альтернативою циклам {section}. {foreach} використовується для проходу по єдиному асоціативному масиву. Синтаксис {foreach} набагато простіший за синтаксис {section}, але, з другого боку, його можна використовувати тільки для одного масиву. Кожен тег {foreach} повинен мати пару {/foreach}. Обов'язковими параметрами є from та item. Ім'я циклу {foreach} може бути будь-яким, що складається з букв, цифр і знаків підкреслення. Цикли {foreach} можуть бути вкладеними і імена вкладених {foreach} повинні бути унікакльнимі між собою. Параметр from (зазвичай - масив значень) визначає кількість ітерацій циклу {foreach}. {foreachelse} виконується в тому випадку, якщо параметр from не містить значень.
{if},{elseif},{else}
Конструкція {if} в Smarty така ж гнучка, як і конструкція if в PHP, тільки з декількома додатковими можливостями для шаблонів. Кожен тег {if} повинен мати пару {/if}. {else} та {elseif} теж допустимі. Досутпні всі кваліфікатори і функції з PHP, такі як ||, or, &&, and, is_array() і т.д.
Нижче слідує список кваліфікаторів, які повинні бути відокремлені від інших елементів пропусками. Зверніть увагу, що об'єкти в [квадратних дужках] є необов'язковими. Іноді вказані еквіваленти в PHP.
Кваліфікатор |
Альтернативи |
Приклад синтаксису |
Опис |
Еквівалент PHP |
== |
eq |
$a eq $b |
дорівнює |
== |
!= |
neq |
$a neq $b |
не дорівнює |
!= |
> |
gt |
$a gt $b |
більше |
> |
< |
lt |
$a lt $b |
менше |
< |
>= |
gte, ge |
$a ge $b |
більше або дорівнює |
>= |
<= |
lt, lte |
$a le $b |
менше або дорівнює |
<= |
=== |
|
$a === 0 |
перевірка ідентичності |
=== |
! |
not |
not $a |
заперечення |
! |
% |
mod |
$a mod $b |
залишок від ділення |
% |
is [not] div by |
|
$a is not div by 4 |
можливе ділення без залишку |
$a % $b == 0 |
is [not] even |
|
$a is not even |
[не]парне |
$a % 2 == 0 |
is [not] even by |
|
$a is not even by $b |
[не]парне значенню |
($a / $b) % 2 == 0 |
is [not] odd |
|
$a is not odd |
[не]непарне |
$a % 2 != 0 |
is [not] odd by |
|
$a is not odd by $b |
[не]непарне значенню |
($a / $b) % 2 != 0 |
Приклад 7-8. Оператор {if}
{if $name eq "Fred"}
Welcome Sir.
{elseif $name eq "Wilma"}
Welcome Ma'am.
{else}
Welcome, whatever you are.
{/if}
{* приклад з логікою "або" *}
{if $name eq "Fred" or $name eq "Wilma"}
...
{/if}
{* те ж, що й вище *}
{if $name == "Fred" || $name == "Wilma"}
...
{/if}
{*
наступний приклад НЕ працюватиме, кваліфікатори умов слід
відокремлювати від навколишніх елементів пропусками
*}
{if $name=="Fred" || $name=="Wilma"}
...
{/if}
{* дужки дозволені *}
{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
...
{/if}
{* ви також можете використовувати функції php *}
{if count($var) gt 0}
...
{/if}
{* перевіряє парність значень *}
{if $var is even}
...
{/if}
{if $var is odd}
...
{/if}
{if $var is not odd}
...
{/if}
{* перевіряє, чи ділиться $var на 4 без залишку *}
{if $var is div by 4}
...
{/if}
{*
перевіряє, чи є $var кратним двом, наприклад
0=кратне, 1=кратне, 2=некратне, 3=некратне, 4=кратне, 5=кратне і т.д.
*}
{if $var is even by 2}
...
{/if}
{* 0=кратне, 1=кратне, 2=кратне, 3=некратне, 4=некратне, 5=некратне и т.д. *}
{if $var is even by 3}
...
{/if}
{* ------- if з функціями PHP ------- *}
{* check for array. *}
{if is_array($foo) }
...
{/if}
{* перевірка на існування *}
{if isset($foo) }
...
{/if}
{include}
Теги include використовуються для включення інших шаблонів в поточний. Будь-які змінні, доступні в поточному шаблоні, доступні і в тому, що включається. Тег include повинен мати атрибут "file", який указує шлях до ресурсу шаблону.
Опциональний атрибут assign указує, що результат виконання include буде занесений в змінну замість відображення.
Ім'я атрибуту
|
Тип
|
Обов'язковий
|
За умовчанням
|
Опис
|
file
|
string
|
Так
|
Не визначено
|
Ім'я файлу шаблону для включення
|
assign
|
string
|
Ні
|
Не визначено
|
Ім'я змінної, в яку присвоюється виведення шаблону
|
[var ...]
|
[var type]
|
Ні
|
Не визначено
|
Змінні, передані в локальну область шаблону, що включається
|
Приклад 7-9. Функція {include}
<html>
<head>
<title>{$title}</title>
</head>
<body>
{include file='page_header.tpl'}
{* тіло шаблону *}
{include file="$tpl_name.tpl"} <-- замінить $tpl_name його вмістом
{include file='page_footer.tpl'}
</body>
</html>
Ви також можете передати змінні в шаблон, що підключається, у вигляді атрибутів. Будь-яка змінна, передана в шаблон, що підключається, доступні тільки в області видимості файлу, що підключається. Передані змінні мають перевагу перед існуючими змінними з аналогічними іменами.
Приклад 7-10. передача змінних в {include}
{include file='header.tpl' title='Main Menu' table_bgcolor='#c0c0c0'}
{* тут іде тіло шаблону *}
{include file='footer.tpl' logo='http://my.example.com/logo.gif'}
де header.tpl може бути
<table border='1' width='100%' bgcolor='{$table_bgcolor|default:"#0000FF"}'>
<tr>
<td>
<h1>{$title}</h1>
</td>
</tr>
</table>
Приклад 7-11. {include} і присвоєння змінній
Цей приклад присвоїть вміст nav.tpl змінній $navbar, яка потім виводиться зверху і знизу сторінки.
<body>
{include file='nav.tpl' assign=navbar}
{include file='header.tpl' title='Main Menu' table_bgcolor='#effeef'}
{$navbar}
{* тут тіло шаблону *}
{include file='footer.tpl' logo='http://my.example.com/logo.gif'}
{$navbar}
</body>
Для підключення файлів поза текою $template_dir можна вказувати файл за допомогою ресурсів.
Приклад 7-12. Приклади ресурсів шаблонів в include
{* абсолютні шляхи *}
{include file='/usr/local/include/templates/header.tpl'}
{* абсолютні шляхи (те ж саме) *}
{include file='file:/usr/local/include/templates/header.tpl'}
{* абсолютні шляхи в windows (ОБОВ'ЯЗКОВО використовуйте префікс "file:") *}
{include file='file:C:/www/pub/templates/header.tpl'}
{* підключення шаблону з ресурсу з ім'ям "db" *}
{include file='db:header.tpl'}
{* підключення шаблону із змінним ім'ям - наприклад $module = 'contacts' *}
{include file="$module.tpl"}
{* не працюватиме, оскільки в одинарних лапках не працює підстановка змінних *}
{file='$module.tpl'}
{include_php}
Технічне зауваження: include_php достатньо застаріла в Smarty, ви можете досягти такої ж функціональності за допомогою власних функцій шаблону. Єдина причина для використання {include_php} - це серйозна необхідність відокремити PHP-функцію від директорії plugins або коду вашого додатку. Див. приклади складних шаблонів для додаткової інформації.
Ім'я атрибуту
|
Тип
|
Обов'язковий
|
По замовчуванню
|
Опис
|
file
|
string
|
Так
|
Не визначено
|
Ім'я php файлу, що підключається
|
once
|
boolean
|
Немає
|
true
|
Указує підключати файл чи ні, якщо він вже був одного разу підключений
|
assign
|
string
|
Немає
|
Не визначено
|
Назва змінної, якою буде присвоєне виведення include_php
|
Теги include_php використовуються для підключення PHP-скрипта в шаблон. Якщо режим security включений, то PHP-скрипт повинен бути розташований в директорії $trusted_dir. Тег include_php повинен мати атрибут "file", який указує шлях до PHP-файлу, що підключається, або відносний до $trusted_dir, або абсолютний шлях.
За умовчанням, PHP-файли підключаються тільки один раз, навіть якщо викликаються кілька разів в шаблоні. Можна вказати, що файл повинен бути підключений кожного разу, вказавши атрибут once. Встановлений once як хибність (false) указує, що файл повинен бути підключений незалежно від того, чи був він підключений раніше.
Можна вказати опціональний атрибут assign, який указує ім'я змінної, в яку буде присвоєно виведення include_php, замість відображення.
Об'єкт smarty доступний в PHP-файлі, що підключається, як $this.
Приклад 7-13. Функція {include_php}
load_nav.php
<?php
// завантажує змінні з БД MySQL та присвоює їх шаблону
require_once("MySQL.class.php");
$sql = new MySQL;
$sql->query("select * from site_nav_sections order by name",SQL_ALL);
$this->assign('sections',$sql->record);
?>
index.tpl
{* абсолютний шлях, або відносний до $trusted_dir *}
{include_php file="/path/to/load_nav.php"}
{foreach item="curr_section" from=$sections}
{$curr_section.name}<br />
{/foreach}
Див. також {include}, {php}, {capture}, Ресурси і Складні шаблони
{insert}
Тег {insert} дуже схожий на тег {include}, за винятком того, що {insert} НЕ кешуєтся, коли кешування включене. Він буде виконаний при кожному зверненні до шаблону.
Ім'я атрибуту
|
Тип
|
Обов'язковий
|
За умовчанням
|
Опис
|
name
|
string
|
Так
|
n/a
|
Ім'я функції вставки (insert_name)
|
assign
|
string
|
Немає
|
n/a
|
Ім'я змінної, якою буде привласнений вивід
|
script
|
string
|
Немає
|
n/a
|
Ім'я php файлу, який буде підключений перед викликом функції вставки
|
[var ...]
|
[var type]
|
Немає
|
n/a
|
Змінні, передавані у функцію вставки
|
Припустимо, ви маєте шаблон з банером вверху сторінки. Банер може містити будь-яку суміш HTML, зображень, flash і т.д., тобто не можна використовувати просто статичне посилання, і ми не хочемо, щоб код банера кешировался з рештою сторінки. Тоді використовуємо тег insert: шаблон знає значення #banner_location_id# і #site_id# (узяті з конфігураційного файлу) і повинен викликати функцію, щоб отримати код банера.
Приклад 7-14. Функція {insert}
{* приклад вставки банеру *}
{name="getBanner" lid=#banner_location_id# sid=#site_id#}
В даному прикладі ми використовуємо ім'я "getBanner" і передаємо параметри #banner_location_id# і #site_id#. Smarty спробує викликати функцію insert_getBanner() у вашій PHP програмі, передавши значення #banner_location_id# і #site_id# першим параметром у вигляді асоціативного масиву. Всі імена функцій вставки повинні починатися з "insert_" для запобігання можливим конфліктам імен. Функція insert_getBanner() повинна обробити передані змінні і повернути результат. Він буде відображений в шаблоні замість тега insert. В даному випадку Smarty викличе функцію insert_getBanner(array("lid" => "12345","sid" => "67890")); і виведе результат на місці тега insert.
Якщо вказаний атрибут "assign", то виведення функції вставки буде привласнено вказаній змінній замість відображення.
ЗАУВАЖЕННЯ: привласнення виведення тега insert змінної шаблону не дуже корисно, коли кешування включене.
Якщо вказаний атрибут "script", то вказаний PHP-файл буде підключений (тільки одного разу) перед викликом функції вставки. Це зручно, коли функція може не сущетсвовать, і повинен бути підключений PHP-файл, щоб визначити функцію. Шлях до файлу повинен бути або абсолтним, або відносним відносно $trusted_dir. Коли security активована, то PHP-файл повинен бути в теці $trusted_dir.
Об'єкт Smarty передається у функцію як другий параметр. Так ви можете використовувати і модифікувати інформацію з об'єкту Smarty у функціях вставки.
Технічне Зауваження: Деякі частини шаблону можна не кешувати. Якщо активовано кешування, то тег {insert} однак не буде кешовано. Він буде викликаний кожного разу при генерації сторінки, навіть з кешованних сторінок. Це корисно для таких речей, як банери, опитування, прогнози погоди, результати пошуку, області зворотного зв'язку і т.д.
{ldelim},{rdelim}
{ldelim} і {rdelim} використовуються для запобігання обробці роздільників, якими по замовчуванню є "{" і "}". Ви також можете використовувати блок {literal} {/literal} для запобігання обробці блоків тексту. Див. також $smarty.ldelim
Приклад 7-15. {ldelim},{rdelim}
{* будуть виведені роздільники в шаблоні *}
{ldelim}funcname{rdelim} is how functions look in Smarty!
Результат виконання даного прикладу:
{funcname} is how functions look in Smarty!
Інший приклад з використанням javascript
<script language="JavaScript">
function foo()
{ldelim}
... code ...
{rdelim}
</script>
виведе
<script language="JavaScript">
function foo()
{
... code ...
}
</script>
{literal}
Теги {literal} дозволяють сприймати блоки даних буквально. Зазвичай вони використовуються разом з javascript або таблицями стилів, в яких фігурні дужки конфліктують з синтаксисом роздільників. Ваш текст усередині тегів {literal} {/literal} не інтерпретується, а виводиться "як є". Якщо вам потрібно вставити теги шаблонів в блок {literal}, слід піти по іншому шляху і використовувати {ldelim} {rdelim} для екранування окремих роздільників.
Приклад 7-16. Теги literal
{literal}
<script type="text/javascript">
<!--
function isblank(field)
{
if (field.value == '')
{ return false; }
else
{
document.loginform.submit();
return true;
}
}
// -->
</script>
{/literal}
{php}
Тег php дозволяє вставляти PHP-код прямо в шаблон. Він не буде будь-як змінений, незалежно від налаштувань $php_handling. Цей тег тільки для досвідчених користувачів, оскільки зазвичай не потрібний.
Приклад 7-17. теги {php}
{php}
//Робота з скриптом PHP
// з шаблону
include('/path/to/display_weather.php');
{/php}
Технічне зауваження: Для доступу до змінних PHP усередині блоків {php} ви можете використовувати ключове слово PHP global
Приклад 7-18. Теги php з глобальними змінними
{php}
global $foo, $bar;
if($foo == $bar)
{
//щось робимо
}
{/php}
Див. також: $php_handling, {include_php}, {include} і компонентні шаблони.
{section},{sectionelse}
Секції використовуються для обходу масивів даних (так само, як і {foreach}). Кожен тег {section} повинен мати пару {/section}. Обов'язковими параметрами є name і loop. Ім'я циклу {section} може бути будь-яким, що складається з букв, цифр і знаків підкреслення. Цикли {section} можуть бути вкладеними і імена вкладених {section} повинні бути уникакльнимі між собою. Змінна loop (зазвичай - масив значень) визначає кількість ітерацій циклу. При виведенні змінних всередині секції, ім'я секції повинне бути вказане поряд з ім'ям змінної усередині квадратних дужок []. {sectionelse} виконується в тому випадку, якщо параметр loop не містить значень.
Ім'я атрибуту
|
Тип
|
Обов'язковий
|
По замовчуванню
|
Опис
|
name
|
string
|
Так
|
Не визначене
|
Назва секції
|
loop
|
mixed
|
Так
|
Не визначене
|
Значення, що визначає кількість ітерацій циклу.
|
start
|
integer
|
Ні
|
0
|
Індекс позиції, з якою починатиметься цикл. Якщо значення негативне, то початкова позиція обчислюється від кінця масиву. Наприклад, якщо в змінній циклу 7 елементів і значення атрибуту start рівні -2, то початковий індекс буде 5. Невірні значення (значення, поза масивом) автоматично обрізаються до найближчого вірного значення.
|
step
|
integer
|
Ні
|
1
|
Значення кроку, яке використовується для проходу по масиву. Наприклад, step=2 указує обхід масиву по елементах 0,2,4... Якщо крок негативний, то обхід масиву буде проводиться у зворотному напрямі.
|
max
|
integer
|
Ні
|
1
|
Максимальна кількість ітерацій циклу.
|
show
|
boolean
|
Ні
|
true
|
Указує, показувати чи ні цю секцію
|
Приклад 7-19. {section}
<?php
$data = array(1000,1001,1002);
$smarty->assign('custid',$data);
?>
{* даний приклад виведе всі значення масиву $custid *}
{section name=customer loop=$custid}
id: {$custid[customer]}<br />
{/section}
<hr />
{* даний приклад виведе всі значення масиву $custid в оберненому порядку *}
{section name=foo loop=$custid step=-1}
{$custid[foo]}<br />
{/section}
Результат виконання даного прикладу:
id: 1000<br />
id: 1001<br />
id: 1002<br />
<hr />
id: 1002<br />
id: 1001<br />
id: 1000<br />
Ще трохи прикладів без присвоєного масиву:
{section name=foo start=10 loop=20 step=2}
{$smarty.section.foo.index}
{/section}
<hr />
{section name=bar loop=21 max=6 step=-2}
{$smarty.section.bar.index}
{/section}
Результат виконання даного прикладу:
10 12 14 16 18
<hr />
20 18 16 14 12 10
Приклад 7-20. Змінна loop команди section
<?php
$id = array(1001,1002,1003);
$smarty->assign('custid',$id);
$fullnames = array('John Smith','Jack Jones','Jane Munson');
$smarty->assign('name',$fullnames);
$addr = array('253 N 45th', '417 Mulberry ln', '5605 apple st');
$smarty->assign('address',$addr);
?>
{*
змінна loop визначає тільки кількість ітерацій.
ви можете діставати доступ до будь-якої змінної з шаблону усередині секції.
Цей приклад припускає, що $custid, $name і $address всі є
масивами, що містять однакову кількість значень
*}
{section name=customer loop=$custid}
<p>
id: $custid[customer]<br />
name: $name[customer]<br />
address: $address[customer]
</p>
{/section}
Результат виконання даного прикладу:
<p>
id: 1000<br />
name: John Smith<br />
address: 253 N 45th
</p>
<p>
id: 1001<br />
name: Jack Jones<br />
address: 417 Mulberry ln
</p>
<p>
id: 1002<br />
name: Jane Munson<br />
address: 5605 apple st
</p>
Приклад 7-21. Іменування {section}
{*
ім'я секції може бути будь-яким, оскільки воно використовується для звернення до даних в межах секції
*}
{section name=anything loop=$custid}
<p>
id: {$custid[anything]}<br />
name: {$name[anything]}<br />
address: {$address[anything]}
</p>
{/section}
Приклад 7-22. Вкладені секції
<?php
$id = array(1001,1002,1003);
$smarty->assign('custid',$id);
$fullnames = array('John Smith','Jack Jones','Jane Munson');
$smarty->assign('name',$fullnames);
$addr = array('253 N 45th', '417 Mulberry ln', '5605 apple st');
$smarty->assign('address',$addr);
$types = array(
array( 'home phone', 'cell phone', 'e-mail'),
array( 'home phone', 'web'),
array( 'cell phone')
);
$smarty->assign('contact_type', $types);
$info = array(
array('555-555-5555', '666-555-5555', '[email protected]'),
array( '123-456-4', 'www.example.com'),
array( '0457878')
);
$smarty->assign('contact_info', $info);
?>
{*
секції можуть мати вкладеність будь-якої глибини. Використовуючи вкладені секції ви можете звертатися до складних структур даних, таким як багатовимірні масиви. В даному прикладі $contact_type[customer] - це масив типів контактів для поточного клієнта.
*}
{section name=customer loop=$custid}
<hr>
id: {$custid[customer]}<br />
name: {$name[customer]}<br />
address: {$address[customer]}<br />
{section name=contact loop=$contact_type[customer]}
{$contact_type[customer][contact]}: {$contact_info[customer][contact]}<br />
{/section}
{/section}
Результат виконання даного прикладу:
<hr>
id: 1000<br />
name: John Smith<br />
address: 253 N 45th<br />
home phone: 555-555-5555<br />
cell phone: 666-555-5555<br />
e-mail: [email protected]<br />
<hr>
id: 1001<br />
name: Jack Jones<br />
address: 417 Mulberry ln<br />
home phone: 123-456-4<br />
web: www.example.com<br />
<hr>
id: 1002<br />
name: Jane Munson<br />
address: 5605 apple st<br />
cell phone: 0457878<br />
Приклад 7-23. Секції та асоціативні масиви
<?php
$data = array(
array('name' => 'John Smith', 'home' => '555-555-5555',
'cell' => '666-555-5555', 'email' => '[email protected]'),
array('name' => 'Jack Jones', 'home' => '777-555-5555',
'cell' => '888-555-5555', 'email' => '[email protected]'),
array('name' => 'Jane Munson', 'home' => '000-555-5555',
'cell' => '123456', 'email' => '[email protected]')
);
$smarty->assign('contacts',$data);
?>
{*
Це приклад виведення асоціативного масиву даних усередині секції
*}
{section name=customer loop=$contacts}
<p>
name: {$contacts[customer].name}<br />
home: {$contacts[customer].home}<br />
cell: {$contacts[customer].cell}<br />
e-mail: {$contacts[customer].email}
</p>
{/section}
Результат виконання даного прикладу:
<p>
name: John Smith<br />
home: 555-555-5555<br />
cell: 666-555-5555<br />
e-mail: [email protected]
</p>
<p>
name: Jack Jones<br />
home phone: 777-555-5555<br />
cell phone: 888-555-5555<br />
e-mail: [email protected]
</p>
<p>
name: Jane Munson<br />
home phone: 000-555-5555<br />
cell phone: 123456<br />
e-mail: [email protected]
</p>
Бази даних (наприклад, PEAR або ADODB)
<?php
$sql = 'select id, name, home, cell, email from contacts';
$smarty->assign('contacts',$db->getAll($sql) );
?>
{*
виводимо результат запиту до БД в таблицю
*}
<table>
<tr><th> </th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
{section name=co loop=$contacts}
<tr>
<td><a href="view.php?id={$contacts[co].id}">view<a></td>
<td>{$contacts[co].name}</td>
<td>{$contacts[co].home}</td>
<td>{$contacts[co].cell}</td>
<td>{$contacts[co].email}</td>
<tr>
{/section}
</table>
Приклад 7-24. {sectionelse}
{* sectionelse виконається у випадку, коли $custid не містить значень *}
{section name=customer loop=$custid}
id: {$custid[customer]}<br />
{sectionelse}
there are no values in $custid.
{/section}
Секції так само мають власні змінні, які містять властивості секцій. Вони позначаються так: {$smarty.section.sectionname.varname}
Зауваження: Починаючи з версії Smarty 1.5.0, синтаксис змінних властивостей сесій був змінений з {%sectionname.varname%} на {$smarty.section.sectionname.varname}. Старий синтаксис все ще підтримується, але ви побачите лише приклади нового синтаксису.
index
index використовується для відображення поточного індексу масиву, починаючи з нуля (або з атрибуту start, якщо він був вказаний) і збільшуючись на одиницю (або на значення атрибуту step, якщо він був вказаний).
Технічне Зауваження: Якщо атрибути step і start не вказані, то index аналогічний атрибуту секції iteration, крім того, що починається з 0, а не з 1.
Приклад 7-25. Властивість {section} index
{* до вашого відома $custid[customer.index] і $custid[customer] означають одне і те ж *}
{section name=customer loop=$custid}
{$smarty.section.customer.index} id: {$custid[customer]}<br />
{/section}
Результат виконання даного прикладу:
0 id: 1000<br />
1 id: 1001<br />
2 id: 1002<br />
index_prev
index_prev використовується для відображення попереднього індексу циклу. На першій ітерації він встановлений в -1.
index_next
index_next використовується для відображення наступного індексу циклу На останній ітерації він на одиницю більше поточного (або на інше значення, якщо вказаний атрибут step).
Приклад 7-26. Властивості {section} index_next і index_prev
<?php
$data = array(1001,1002,1003,1004,1005);
$smarty->assign('custid',$data);
?>
{* до вашого відома $custid[cus.index] і $custid[cus] означають одне і те ж *}
<table>
<tr>
<th>index</th><th>id</th>
<th>index_prev</th><th>prev_id</th>
<th>index_next</th><th>next_id</th>
</tr>
{section name=cus loop=$custid}
<tr>
<td>{$smarty.section.cus.index}</td><td>{$custid[cus]}</td>
<td>{$smarty.section.cus.index_prev}</td><td>{$custid[cus.index_prev]}</td>
<td>{$smarty.section.cus.index_next}</td><td>{$custid[cus.index_next]}</td>
</tr>
{/section}
</table>
Результатом виконання цього прикладу буде таблиця, що містить наступне:
id index_prev prev_id index_next next_id
0 1001 -1 1 1002
1 1002 0 1001 2 1003
2 1003 1 1002 3 1004
3 1004 2 1003 4 1005
4 1005 3 1004 5
iteration використовується для відображення поточного номера ітерації циклу.
Примітка: Це значення не залежить від властивостей start, step і max, на відміну від властивості index. Крім того, ітерації починаються з одиниці, а не з нуля, як індекси. rownum - це синонім до властивості iteration, вони працюють однаково.
Пример 7-27. Властивість {section} iteration
<?php
// array of 3000 to 3015
$id = range(3000,3015);
$smarty->assign('custid',$id);
?>
{section name=cu loop=$custid start=5 step=2}
iteration={$smarty.section.cu.iteration}
index={$smarty.section.cu.index}
id=$custid[cu]<br />
{/section}
Результат виконання даного прикладу:
iteration=1 index=5 id=3005<br />
iteration=2 index=7 id=3007<br />
iteration=3 index=9 id=3009<br />
iteration=4 index=11 id=3011<br />
iteration=5 index=13 id=3013<br />
iteration=6 index=15 id=3015<br />
Цей приклад використовує властивість iteration для виведення заголовка таблиці через кожні п'ять ріядків (використовує if з оператором mod - залишок від ділення).
<table>
{section name=co loop=$contacts}
{if $smarty.section.co.iteration % 5 == 1}
<tr><th> </th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
{/if}
<tr>
<td><a href="view.php?id={$contacts[co].id}">view<a></td>
<td>{$contacts[co].name}</td>
<td>{$contacts[co].home}</td>
<td>{$contacts[co].cell}</td>
<td>{$contacts[co].email}</td>
<tr>
{/section}
</table>
first
Параметр first встановлений в true, якщо поточна ітерація секції є першою.
last
Параметр last встановлений в true, якщо поточна ітерація секції є останньою.
Приклад 7-28. Властивості {section} first і last
Цей приклад проходить циклом по масиву $customers, виводить заголовок на першій ітерації і футер на останній (використовує властивість {section} total)
{section name=customer loop=$customers}
{if $smarty.section.customer.first}
<table>
<tr><th>id</th><th>customer</th></tr>
{/if}
<tr>
<td>{$customers[customer].id}}</td>
<td>{$customers[customer].name}</td>
</tr>
{if $smarty.section.customer.last}
<tr><td></td><td>{$smarty.section.customer.total} customers</td></tr>
</table>
{/if}
{/section}
rownum
rownum використовується для відображення поточного номера ітерації циклу, починаючи з одиниці. Це синонім властивості iteration, вони працюють ідентично.
loop
loop використовується для відображення останнього номера індексу, по якому проходила ітерація секції. Ця властивість може бути використана як усередині, так і поза секцією.
Приклад 7-29. Властивість {section} loop
{section name=customer loop=$custid}
{$smarty.section.customer.index} id: {$custid[customer]}<br />
{/section}
There were {$smarty.section.customer.loop} customers shown above.
Результат виконання даного прикладу:
0 id: 1000<br />
1 id: 1001<br />
2 id: 1002<br />
There were 3 customers shown above.
show
show використовується як параметр секції. show є булевим значенням, тобто може приймати значення true або false. Якщо false, секція не буде відображена. Якщо присутня секція sectionelse, натомість буде відображена саме вона.
Приклад 7-30. атрибут section show
{*
$show_customer_info (true/false) може бути переданий з додатку PHP
щоб визначити, чи необхідно відображати секцію
*}
{section name=customer loop=$custid show=$show_customer_info}
{$smarty.section.customer.rownum} id: {$custid[customer]}<br />
{/section}
{if $smarty.section.customer.show}
the section was shown.
{else}
the section was not shown.
{/if}
Результат виконання даного прикладу:
1 id: 1000<br />
2 id: 1001<br />
3 id: 1002<br />
section was shown.
total
total використовується для відображення кількості ітерацій, через які пройде ця секція. Ця властивість може бути використана як всередині, так і поза секцією.
Приклад 7-31. властивість {section} total
{section name=customer loop=$custid step=2}
{$smarty.section.customer.index} id: {$custid[customer]}<br />
{/section}
{There were $smarty.section.customer.total customers shown above.}
Результат виконання даного прикладу:
0 id: 1000<br />
2 id: 1002<br />
4 id: 1004<br />
were 3 customers shown above.
Див. також {foreach} і $smarty.section
{strip}
Часто веб-дизайнери стикаються з проблемою, що пропуски і перенесення рядків впливають на відображення HTML в оглядачі ("фішки" оглядача), тобто може знадобиться склеїти все теги в шаблоні разом, щоб отримати бажаний результат. Але в результаті виходить шаблон, який важко читати та редагувати.
У тексті, що виводиться, взятому в теги {strip} та {/strip}, видаляються повторні пропуски і перенесення рядків перед відображенням. Так ви можете, зберігши шаблон зручним для читання, не хвилюватися щодо зайвих пропусків.
Технічне зауваження: {strip} {/strip} не впливає на вміст змінних шаблону. Див. модифікатор strip.
Приклад 7-32. Теги {strip}
{* наступне буде виведене у вигляді одного рядка *}
{strip}
<table border="0">
<tr>
<td>
<a href="{$url}">
<font color="red">This is a test</font>
</a>
</td>
</tr>
</table>
{/strip}
Результат виконання даного прикладу:
<table border='0'><tr><td><a href="http://...пропущено...</tr></table><br>
Майте на увазі, що в даному прикладі всі рядки починаються і закінчуються HTML тегами. Врахуйте, що всі рядки склеюються разом. Якщо на початку або в кінці рядка присутній звичайний текст, то ви можете не отримати бажаний результат.
|
|
Книга Фріланс на західному ринку
|
|