Оглавление

32.2. Управляющие конструкции

Все инструкции Smarty размещаются внутри фигурных скобок. Это означает, что в исходном HTML-коде нельзя использовать символы "{" и "}" без инструкций Smarty  внутри, иначе  будет  выведено  сообщение об ошибке. Чтобы вставить символ "{" следует использовать инструкцию {ldelim}, а для вставки символа "}" — инструкцию {rdelim}:
{ldelim}Текст внутри фигурных скобок{rdelim}

 

Результат после компиляции шаблона:
{Текст внутри фигурных скобок}


Фигурные  скобки  используются  также  в  языке JavaScript  для  группировки выражений в блоки. Если внутри шаблона существует JavaScript-код, то его следует разместить между инструкциями {literal} и {/literal}:

{literal}
function f_print() { 
  // Код внутри функции
}
{/literal}

 

Как  вы  уже  знаете,  с  помощью  метода  assign()  можно  передать  значения переменных в шаблон:

$smarty->assign('name', 'Николай');


Внутри шаблона название переменной (с предваряющим символом $) указывается внутри фигурных скобок (например, {$name}). Если передаваемое значение  является массивом,  то для обращения к  элементу следует указать индекс внутри квадратных скобок:

$arr = array(1, 2, 3);
$smarty->assign('arr', $arr);
...
{$arr[0]}

 

При передаче ассоциативного массива обратиться к элементу можно с помощью точечной нотации:

$arr = array('elem1' => 1, 'elem2' => 2);
$smarty->assign('arr', $arr);
...
{$arr.elem2}


С помощью специальной переменной $smarty можно получить доступ к переменным окружения и константам, объявленным в программе:

{$smarty.const.MYCONST} {* Обращение к константе *}
{$smarty.get.var1} {* Обращение к $_GET['var1'] *}
{$smarty.post.var2} {* Обращение к $_POST['var2'] *}
{$smarty.server.SCRIPT_NAME} {* Обращение к $_SERVER['SCRIPT_NAME'] *}
{$smarty.cookies.id_count} {* Обращение к $_COOKIE['id_count'] *}


Значения переменных могут быть получены из файла конфигурации. В качестве  примера  создадим  файл myconf.conf  в  папке
C:\Apache2\smarty\site1\configs. Содержимое файла:

name = 'Николай'
txt = """Текст
   расположен на
   нескольких строках"""
[section1]
var1 = 10


Если текст расположен на нескольких строках, то его необходимо разместить внутри  тройных  кавычек.  Подключить  такой  файл  позволяет  инструкция {config_load}. В параметре file указывается название файла:

{config_load file='myconf.conf'}


Получить значение переменной можно, указав ее название внутри символов # или с помощью переменной $smarty:

{#name#}
{$smarty.config.txt}


Чтобы получить значения переменных, которые расположены внутри секций, необходимо указать название секции в параметре section:

{config_load file='myconf.conf' section='section1'}
{#var1#}

 

Внутри шаблонов можно использовать условия. Проверка условий осуществляется с помощью конструкции {if}...{elseif}...{else}...{/if}. В условиях применяются следующие операторы сравнения:
□ ==, eq — равно. Пример:

{if $x eq 10}
Переменная x равна 10
{else}
Не равна
{/if}


□ !=, ne, neq — не равно;
□ >, gt — больше;
□ <, lt — меньше;
□ >=, gte, ge — больше или равно;
□ <=, lte, le — меньше или равно;
□ === — идентично;

□ !, not — отрицание;
□ %, mod — остаток от деления;
□ is div by, is not div by — деление без остатка. Пример:

{if $x is div by 2}
Переменная x делится на 2 без остатка
{else}
Не делится
{/if}


□ is even, is not even — проверка на четность. Пример:

{if $x is even}
Переменная x содержит четное значение
{else}
Нет
{/if}


□ is odd, is not odd — проверка на нечетность.

 

Внутри  условия  допустимо  использование функций PHP. Например, можно проверить существование переменной с помощью функции isset():

{if isset($x)}
Переменная x существует
{else}
Нет
{/if}


Объединить  несколько  логических  выражений  в  одно  большое  позволяют следующие операторы:
□ &&, and — логическое И;
□ ||, or — логическое ИЛИ.
Пример:

{if $x > 5 and $x < 10}
Переменная x содержит число от 6 до 9
{elseif $x gte 10 }
Переменная x содержит число >= 10
{else}
Переменная x содержит число < 6 или значение не является числом
{/if}


Как  вы  уже  знаете,  в шаблон  можно  передать  массив. Перебрать  значения массива  позволяет  конструкция  {section}...{/section}.  В  открывающей инструкции {section} указываются следующие параметры:
□ name —  название  секции.  Через  это  название  доступен  текущий  индекс
внутри тела конструкции. Параметр является обязательным;
□ loop — значение, определяющее количество итераций цикла. В качестве значения можно указать название массива. Параметр является обязательным;
□ start — начальный индекс;
□ step — шаг;
□ max — максимальное количество итераций.


Выведем содержимое массива:

$arr = array(1, 2, 3, 4);
$smarty->assign('arr', $arr);
...
{section name=i loop=$arr}
{$arr[i]}<br>
{/section}


Теперь выведем все четные числа от 2 до 100:

{section name=i loop=101 start=2 step=2}
{$smarty.section.i.index}<br>
{/section}


Для  перебора  ассоциативного  массива  предназначена  конструкция {foreach}...{/foreach}.  В  открывающей  инструкции  {foreach}  указываются следующие параметры:
□ from —  название переменной,  в  которой  хранится массив. Параметр  является обязательным;
□ item позволяет указать название переменной, через которую внутри тела конструкции будет доступно значение текущего элемента массива. Параметр является обязательным;

□ key позволяет  указать название переменной,  через  которую  внутри  тела конструкции будет доступен ключ текущего элемента массива.


В качестве примера выведем все значения ассоциативного массива:

$arr = array('var1' => 1, 'var2' => 2, 'var3' => 3);
$smarty->assign('arr', $arr);
...
{foreach from=$arr item=n key=k}
{$k} =&gt; {$n}<br>
{/foreach}


Конструкция  {foreach}...{/foreach}  позволяет  также  перебрать  обычный массив. Пример:

$arr = array(1, 2, 3, 4, 5);
$smarty->assign('arr', $arr);
...
{foreach from=$arr item=n}
{$n}<br>
{/foreach}


Как вы уже знаете, при создании больших сайтов страницу делят на три части — верхний колонтитул, тело страницы и нижний колонтитул. Инструкция {include} позволяет внутри шаблона подключить другой шаблон. Название подключаемого шаблона указывается в параметре file. В качестве примера использования инструкции {include} создадим четыре файла:
□ header.tpl — верхний колонтитул (листинг 80);
□ footer.tpl — нижний колонтитул (листинг 81);
□ index.tpl — "тело" страницы (листинг 82);
□ index.php — основная программа (листинг 83).

 
Листинг 80. Содержимое шаблона header.tpl

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
         "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
 <title>{$title}</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>

 

Листинг 81. Содержимое шаблона footer.tpl

</body>
</html>

 

Листинг 82. Содержимое шаблона index.tpl

{* Smarty *}
{include file=header.tpl}
<div>Привет, {$name}!</div>
{include file=footer.tpl}

 

Листинг 83. Содержимое файла index.php

<?php
require_once('MySmarty.php'); // См. листинг 5.75
$smarty = new MySmarty();
// Указываем значения для переменных внутри шаблона
$smarty->assign('title', 'Заголовок страницы');
$smarty->assign('name', 'Николай');
// Выводим шаблон
$smarty->display('index.tpl');
?>

 

Подключить  фрагмент HTML-кода  позволяет  также  инструкция  {insert}. 


В отличие от инструкции {include}, при включенном кэшировании данные не будут помещены в кэш. В качестве значения параметра name указывается часть названия функции, которая будет  вызываться. Полное название функции должно начинаться с префикса "insert_". Данная инструкция используется  для  генерации  динамического  кода,  например,  кода  вывода  различных баннеров. Пример:

<div>Привет, {$name}!</div>
<div>{insert name="test"}</div>


Содержимое основного файла:

<?php
function insert_test() {
   return "Этот текст не будет помещен в кэш";
}
require_once('MySmarty.php'); // См. листинг 5.75
$smarty = new MySmarty();
// Указываем значения для переменных внутри шаблона
$smarty->assign('name', 'Николай');
// Выводим шаблон
$smarty->display('index.tpl');
?>


В  этом  случае даже  если шаблон будет кэширован, функция insert_test() все  равно  будет  вызвана.  Внутри  функции  можно  вернуть  динамический HTML-код, например, код баннера.

Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити