Пример применения smarty. Базовая установка. Основные управляющие конструкции шаблонов



1. Введение

Каждый рано или поздно начинает задумываться об оптимизации своих приложений, структуризации кода и конечно же полном отделении дизайна от логики. Именно о шаблонизации дизайна мы сегодня и поговорим. В статье будет описан шаблонный движок Smarty. Почему именно Smarty? Потому что это лучший на сегодняшний день бесплатный продукт, проверенный временем. Мало того, он позволяет кэшировать шаблоны, предварительно компилируя их, в результате чего может работать быстрее, чем приложения, в которых не используется шаблонизации вообще. И так, обо всё по порядку.

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

Основные управляющие конструкции шаблонов

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

  • Все элементы презентации содержатся в шаблоне.
  • Сообщения об ошибках также поддерживаются из шаблона.
Однако он по-прежнему содержит свою собственную логику.

2. О рассматриваемых в статье вопросах

В рамках текущей статье будут рассмотрены основные моменты, наиболее часто применяемые в проектах средней сложности. Это подключение шаблонизатора, передача значений и массивов в шаблон, для дальнейшей обработки. Так же мы рассмотрим немало важный аспект – реализация многоязычности приложений. И второй, и основной момент – работа с этими данными в шаблоне. В пределах данной статьи я не буду рассматривать кэширование и принципы написания плагинов для движка. С этим вы сможете ознакомиться самостоятельно, почитав, мануал на //smarty.net/manual/ru/

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

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

3. Детали реализации

Итак, начнём с установки движка. Для этого посетите страницу //www.smarty.net/download.php и скачайте последнюю версию. На текущий момент это версия от 5-го марта 2007 года. В архиве находится каталог Smarty со всеми необходимыми для работы классами и плагинами. Всё что нам потребуется знать о ней в рамках данной статьи – это каталоги templates и templates_c. Каталогу templates_c необходимо дать права на запись, т.к. в неё будут сохраняться системой откомпилированные шаблоны.

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

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

Рассмотрим работу с движком на уровне кода:

//Инициализация класса и установка начальных параметров: //инициализируем смарти
require_once("smarty/Smarty.class.php");
//Создаём обьект класса
$smarty = new Smarty();
//Устанваливаем папки шаблонов
$smarty->template_dir = "templates"; $smarty->compile_dir = "templates_c";
//Передача данных из БД в шаблон: //открытие соединения //Получение данных их БД
$DB->query("SELECT * FROM news ORDER BY ID LIMIT 0,10");
//Передача массива с данными в шаблон в переменную news //Примечание: в методе fetchrowset() данные были предварительно помещены в ассоциативный //массив, имя которого соответсвует полю в таблице $smarty->assign(" news " , $DB->fetchrowset()); //Допустим что наша задача была в простом выводе данных в шаблон, что мы уже и сделали, и это //конечный этап – вызываем метод display() класса smarty, который выводит, передаёт данные в //шаблон, перекомпилирует (если были изменения) и выводит контент. //Методу передается имя файла шаблона, в котором как предполагается был обработан нужным //образом массив news
$smarty->display("index.tpl.html " ); ?>
Теперь рассмотрим непосредственно файл шаблона index.tpl.html, фактически это обычный html с вставками переменных и конструкций циклов. Все переменные в движке заключены в фигурные скобки. Следующий пример демонстрирует.
{foreach from=$news item=item} Заголовок: {$item.title}
Teкст новости:
{item.description}
Полная версия: Подробнее... {/foreach}

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

Кэширование в Smarty

Это помогает сократить количество бит, но вы по-прежнему не очень хорошо читаете. Даже в этом кратком примере вы можете увидеть экономию в 13 символов, чтобы отобразить одно и то же. В следующем примере показаны нечетные числа 1-20. Что проще понять? Как насчет типов не-разработчика?

Вот собственно и всё, это рабочий пример, который будет выводить 10 извлечённых нами новостей из базы данных.

В каталог templates поместим ещё два файла, home.tpl.html и full.tpl.html

Добавим в код php условие запроса подробной новости

if(isset($_GET["id"])) { //Запросы к БД, обработка данных //В переменную main_content_template поместили имя шаблона, который будет загружен в главный index.tpl.html шаблон $smarty->assign("main_content_template", "full.tpl.html"); } Else { $smarty->assign("main_content_template", "home.tpl.html"); }

Немного модифицируем html файл, поместив цикл в файл home.tpl.html Теперь подключим дополнительный шаблон:

Отображение переменных из конфигурационных файлов

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

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

{include file=$main_content_template}

Сейчас в файл index.tpl.html будет подключаться дополнительный файл, в соответствии с переменной main_content_template, т.е. либо контент на главной – либо контент в подробнее.

Обычные значения переменных передаться тем же методом assign(), только в шаблон выводяться непосредственно {$name}, которое было определенно в первом аргументе метода.

Методы для работы с шаблонами

Они отображаются в порядке: 1, 3 и 2! Вот как он привыкает в обычном случае. Это может быть полезно для встраивания фрагментов кода в другую страницу. Самая сложная часть файла шаблона - его местоположение. Темы Махара являются иерархическими. Каждая тема имеет родительскую тему, и каждый родитель может иметь родительский элемент и т.д. Причем специальная «сырая» тема является корнем иерархии.

Шаблоны плагинов несколько отличаются. Они живут под каталогом плагина. Обратное к этому изменению также верно. Хорошая практика состоит в том, чтобы отделить логику логики от логики отображения. А затем ссылайтесь на новую назначенную переменную в шаблоне.

Управляющие структуры реализуются аналогично, {if $param == 10} html код, либо любые другие операторы, циклы, управляющие структуры и т.п. {/if}

И немного о реализации многоязычности.
Допустим сайт должен поддерживать два языка: русский и английский. Добавим соответствующие параметры на сайте, выбрав которые данные о выбранном языке будут записаны в сессию, БД или куда угодно ещё.

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

Создадим языковой два языковых файла, с набором констант такого вида:

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

В шаблонах смарти доступ к константам осуществляется следующим образом: {$smarty.const.BUTTON_LOGIN} – соответственно BUTTON_LOGIN имя константы.

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

Решение задачи с помощью шаблонов Smarty

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

Если вдруг появится необходимость использовать php код прямо в шаблоне, то помещаем в шаблоне блок {php}{/php} – между тегами php код, без параметров .

Ещё существует проблема, когда в коде шаблона вставлены блоки java script, некоторые его операторы, в частности if, компилятор smarty будет рассматривать как операторы smarty. Поэтому JS код лучше выносить в отдельные файлы, либо вокруг кода ставить оператор {literal}{/literal} , внутри этого оператора компилятор не будет искать другие операторы smarty.

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

Пример: Цитирование через массив. В стартовом теге мы определяем массив, который мы хотим перебрать, и имя для переменной, в которой единый набор данных будет предоставлен в цикле. С помощью системы наследования шаблонов вам нужно только отредактировать те части, которые вы действительно хотите изменить. Не нужно копировать целые шаблоны меньше кода для написания, а для поддержания вашего шаблона всегда поддерживается обновление, ваш шаблон все равно может быть расширен плагинами. Мы рекомендуем всегда использовать систему наследования при создании настраиваемых тем.

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

а) гибкость приложения – четкое разделение логики от дизайна позволяет программистам вносить изменения в логику и структуру сайта, не затрагивая его оформления, и в тоже время дает возможность дизайнерам изменять внешний вид сайта и при этом не затрагивать логическую часть веб – приложения;

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

Обзор основных методов Smarty

В верхней части файла вы определяете путь к файлу шаблона вы хотите наследовать. Пример: расширение файла шаблона. Это позволяет нам расширять шаблоны определенной родительской темы. Вместо этого вы получаете все блоки контента, которые определил родительский файл.

б) код веб-приложения становится чистым и элегантным;

Думаю многие веб-разработчики, сталкивались с этой проблемой – решением данной задачи является применение шаблонов. В этом уроке мы будем изучать применение шаблонов с использованием шаблонизатора Smarty.

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

  • Найдите блок содержимого, которое вы хотите изменить в файле шаблона.
  • Создайте файл шаблона под той же структурой в своем собственном каталоге тем.
Обычно они начинаются с создания простых скриптов для добавления динамических функций на свои веб-сайты, а затем для добавления новых функций. Один, который включает в себя выходные файлы - стандартный заголовок сайта; другой - стандартная таблица и т.д.

Фреймворк YII2. Быстрая разработка с современным PHP фреймворком

Узнай тонкости современной веб-разработки с помощью фреймворка YII2

1. Формирование задачи

Давайте для начала определимся, что же такое шаблон? Шаблон — это довольно широкое понятие, но если говорить простым языком – это файл (документ), обычно в html или tpl формате, который содержит в себе html – теги (оформление и структуру веб-приложения), а также специальные метки, вместо которых подставляются данные из логической части данных. Подстановкой данных и формированием окончательного вида веб-приложения занимается шаблонизатор.

Рассуждение за шаблонами

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

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

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

Подключение вспомогательных шаблонов

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

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

Smarty – наиболее популярная и широко распространенная система шаблонов на PHP. Работа Smarty заключается в компилировании шаблонов. Это означает, что Smarty последовательно считывает разметку файла шаблона и создает на их основе готовый PHP сценарий, этот сценарий создается один раз, а далее просто выполняется. Smarty содержит в себе большое количество функций, которые позволяют создавать в шаблонах сложную логику (если она нужна для правильного отображения данных): подключение других шаблонов, циклический разбор массива и т.д. Конечно, Вы можете и не создавать сложную логику шаблона, а ограничиться лишь использованием чистого текста и переменных.
На этом вводная часть закончена и можно приступать к изучению.

2. Установка Smarty

Скачать Smarty можно с официального сайта http://www.smarty.net/, перейдя на вкладку Download. На момент создания урока последняя стабильная версия это Smarty 3.1.7, ее и скачиваем. При распаковке архива мы видим папку Smarty 3.1.7, а в ней еще файлы и папки:

demo – демонстрационный пример использования шабонизатора;

libs – папка с дистрибутивом Smarty;

различные текстовые файлы(readme, описание условий копирования, описания отличий от более старых версий).
Для установки Smarty необходимо скопировать папку libs (из архива) в корневой каталог Вашего веб-приложения. Перечень файлов и папок каталога libs должен быть таким:

libs/
Smarty.class.php
SmartyBC.class.php
debug.tpl
sysplugins
plugins

Затем создать четыре директории, из которых Smarty будет читать свои конфигурационные файлы и файлы шаблонов. По умолчанию эти директории имеют название: templates/, templates_c/, configs/, cache/(эти каталоги Вы можете назвать так, как Вам захочется, но при этом нужно будет указать шаболнизатору на их названия – это мы рассмотрим далее) . Таким образом каталог с Вашим веб-приложением должен быть следующего вида:

www.example.com/(или папка с Вашим веб-приложением)
libs/
Smarty.class.php
SmartyBC.class.php
debug.tpl
sysplugins
plugins
templates
templates_c
configs
cache
index.php

Давайте рассмотрим, для чего нужны созданные четыре каталога:

templates – здесь хранятся Ваши созданные шаблоны (шаблоны для Smarty создаются в формате tpl );

templates_c – в этот каталог шаблонизатор записывает скомпилированный шаблон, на основе шаблона в каталоге templates;

configs – каталог для хранения файлов конфигурации;

cache – каталог для хранения кэшированных файлов шаблона.

3. Создание простого скрипта на основе Smarty

Теперь когда Smarty установлен и созданы необходимые каталоги давайте создадим первую страницу. Для этого первым делом необходимо подключить класс Smarty к нашему скрипту и создать объект этого класса(вся логика нашего скрипта будет в файле index.php):

Теперь когда Smarty подключен и создан объект его класса, давайте создадим переменную $name, с произвольным значением, и передадим это значение в Smarty и дальше выведем наш шаблон на экран(шаблон мы создадим ниже).

Так выглядит код файла index.php:

assign("name",$name); //Выводим шаблон на экран $smarty->display("main.tpl"); ?>

Для тех кто мало знаком с обьектно-ориентированным программированием на PHP, $smarty – это обьект нашего класса Smarty(),assign() и display() – это его методы(так называются функции класса). Для доступа к методу класса сначала указываем обьект класса, далее два символа ->, далее сам метод и в скобках его параметры:

$smarty->assign(‘name’,$name);

В этой строке мы у обьекта класса вызываем метод assign с двумя параметрами ‘name’, $name

Переменные передаются в шаблонизатор с помощью метода assign() в который нужно передать два параметра. Как Вы наверное догадались, первый параметр это название переменной, второй это ее значение(этот метод можно вызывать несколько раз, передавать можно как простые переменные, так и массивы). С помощью метода display() мы вызываем отображение нашего шаблона, имя шаблона передается как параметр обычной строкой(название файла с Вашим шаблоном).

Теперь давайте создадим файл шаблона main.tpl (в каталоге templates с расширением файла tpl ):

Переданная переменная - {$name}

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

Если запустить скрипт на выполнение то на экране браузера мы увидим:

Это и есть Ваш первый скрипт на основе шаблонизатора Smarty, как Вы видите логика сайта у нас содержится в файле index.php , а внешний вид — в файле templates/main.tpl , если Вы посмотрите в каталог templates_c, то увидите, что Smarty создал там скомпилированный файл шаблона содержимое которого и отобразил на экране.

4. Основные управляющие конструкции шаблонов

Комментарии в шаблонах оформляются таким образом:

{* this is a comment *}

Отображение переменных в шаблонах:

{$name} – отображение простой переменной переданной Smarty с именем name.

{$name} – отображение пятого элемента массива.

{$name.key} – отображение значения элемента массива с ключем key, аналогично записи в PHP $name[‘key’].

{$name.$key} – отображение значения элемента массива с ключом, значение которого хранится в переменной $key, аналогично записи PHP $name[$key].

{#name#} – отображение переменной name значение которой хранится в конфигурационных файла(перед отображением такой переменой конфигурационный файл нужно подгрузить в шаблоне – мы это рассмотрим ниже).

Условные операторы в шаблонах.

Шаблоны так же как и язык PHP поддерживают условные операторы, однако синтаксис их немного отличается от привычного нам. Каждый тэг {if} должен иметь пару {/if} . {else} и {elseif} так же допустимы. Доступны все квалификаторы из PHP, такие как ||, or , &&, and , is_array() и т.д. (более расширенный список квалификаторов вы можете посмотреть в документации на официальном сайте). Пример:

{if $name == "Vasya"} Переданная переменная - {$name} {else} Другая переменная {/if}

В данном примере если переменная $name равна Vasya , то на экран выведется Переданная переменная Vasya , если не равна то — Другая переменная .

Цикл foreach в шаблонах.

Очень часто в шаблон необходимо передать массив данных(например выборку из базы даннх), в этом случае очень удобно использовать цикл foreach для последовательного перебора всех элементов массива. Синтаксис функции foreach также похож на синтаксис условного оператора {if} . Каждый тэг {foreach} должен иметь закрывающую пару {/foreach} (напомню, что все теги в Smarty записываются в фигурных скобках).

Синтаксис оператора foreach:

{foreach $arrayvar as $itemvar} ..действие.. {/foreach} {foreach $arrayvar as $keyvar=>$itemvar} ..действие.. {/foreach}

Как Вы видите синтаксис очень похож на PHP: $arrayvar – передаваемый в шаблонизатор массив данных, as – ключевое слово для оператора foreach (как и в PHP), $itemvar – переменная в которую будет записано значение первого элемента массива, $keyvar – переменная в которую будет записан ключ первого элемента массива(как и в PHP).

Оператор {capture}.

Оператор {capture} используется для того, чтобы сохранить результат обработки части шаблона, между тэгами, в какую-то переменную, вместо того, чтобы отобразить результат. Любое содержимое между {capture name=’var’} и {/capture} сохраняется в переменную, указанную в атрибуте name .

Чтобы вывести на экран сохраненные данные необходимо использовать специальную переменную специальной переменной $smarty.capture.var , где var — значение, переданное атрибуту name . Например давайте сохраним результат работы цикла {foreach} в переменную, а уже потом выведем результат на экран.

{capture name="var"} {foreach $arrayvar as $itemvar} {*..действие..*} {/foreach} {/capture} {* ..действие.. *} {* вывод на экран переменной var *} {$smarty.capture.var}

Подключение вспомогательных шаблонов.

Очень часто необходимо в шаблон подключать дополнительные шаблоны, например подключение шапки сайта или футера. Для этого используется оператор {include} . Любые переменные, доступные в текущем шаблоне, доступны и в подключаемом. Тэг {include} должен иметь атрибут ‘file’ , который указывает путь к подключаемому шаблону. Например:

{*подключаем шапку шаблона*} {include file="page_header.tpl"} {*основной шаблон*} {*подключаем футер шаблона*} {include file="page_footer.tpl"}

В примере к основному шаблону мы подключаем файл шапки ‘page_header.tpl’ и файл футера ‘page_footer.tpl’ .

Отображение переменных из конфигурационных файлов.

Как Вы помните одним из обязательных каталогов в шаблонизаторе, есть каталог configs , который хранит в себе конфигурационные файлы шаблонов (эти файлы мы создаем сами). Так вот, если у нас есть переменные, которые не относятся к логике скрипта, а отвечают только за оформление веб-приложения(цвет, различные заголовки и т.д), мы можем создать файл конфигурации(в папке configs в формате conf ), и прописать в нем все нужные нам переменные. Затем подгрузить этот файл в шаблоне и отобразить нужные нам переменные.

Для начала давайте рассмотрим, какой вид должен иметь файл конфигурации.

Для примера я создал файл configs/my_conf.conf , с таким содержанием:

#это комментарий конфигурационного файла

# глобальные переменные
pageTitle = «Hello world»
bodyBgColor = #000000
tableBgColor = #000000
rowBgColor = #00ff00

#секция переменных customer

pageTitle = «Customer Info»

Как видите синтаксис файла очень прост: # — решеткой обозначаются комментарии, далее с новой строки пишется имя переменной и после знака равно ее значение. Можно также переменные объединять в секции, для этого имя секции нужно прописать в скобках [имя сесии] , но переменные из секции будут доступны только после подгружения всей секции, но об этом ниже.

После того как файл создан давайте подгрузим его в шаблон (с помощью конструкции {config_load file=’имя файла’}):

{config_load file="my_conf.conf"} Переменная из конфигурационного файла - {#pageTitle#}

Напомню что, если вы хотите отобразить значение переменной из конфигурационного файла то синтаксис будет выглядеть таким образом:

{#имя переменной#}

Если запустить скрипт на выполнение то на экране мы увидим — Переменная из конфигурационного файла — Hello world , что означает что файл конфигураций успешно подрузился и значение переменной было взято из него. Для отображение переменных из секции файла конфигураций необходимо при загрузке файла указать в теге config_load атрибут section , после этого переменные в секции будут доступны для отображения:

{config_load file="my_conf.conf" section="Customer"} Переменная из конфигурационного файла - {#pageTitle#}

После выполнения скрипта на экране мы увидим — Переменная из конфигурационного файла Customer Info , обратите внимание, что теперь значение переменной {#pageTitle#} взялось из секции .

5. Обзор основных методов Smarty

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

//определим основные директории //каталог с конфигурационными файлами Smarty $smarty->setConfigDir("configs"); //каталог с Вашими шаблонами в формате tpl Smarty $smarty->setTemplateDir("templates"); //каталог с компилированными шаблонами Smarty $smarty->setCompileDir("templates_c"); //каталог в котором хранится кеш шаблонов $smarty->setCacheDir("cache");

Указывать эти каталоги нужно сразу же после создания обьекта Smarty.

Методы для работы с переменными.

Напомню, что для передачи переменной в шаблон используем метод assign() , с таким синтаксисом:

$smarty->assign("имя переменной", "значение");

Что бы очистить переданную в шаблон переменную применяется метод clearAssign(‘name’) , имя переменной передаем методу как параметр(в данном случае очищаем переменную name ). Пример:

//Очищаем переменную $name $smarty->clearAssign("name");

Можно также параметром к методу, передать массив переменных, которые нужно очистить:

//очищаем несколько переменных $smarty->clearAssign(array("Name", "Address", "Zip"));

Для очищения всех переданных переменных используем метод clearAllAssign() (без параметров):

//Очищаем все переданные переменные $smarty->clearAllAssign();

Методы для работы с шаблонами.

Напомню, что выводит шаблон на экран метод display() , параметром передаем имя шаблона, например (отображаем шаблон main.tpl ):

//Выводим шаблон на экран $smarty->display("main.tpl");

Как только мы вызываем метод display() , шаблонизатор проверяет изменился ли наш шаблон, если изменился, или мы вызываем метод первый раз – происходит компиляция нашего шаблона и вывод его на экран браузера. Если шаблон не изменился то он просто выводится на экран. За эту проверку отвечает свойство шаблонизатора $compile_check , которое по умолчанию равно TRUE , если его значение изменить на FALSE то проверки не будет, а после вызова метода display() , на экране будет отображаться ранее скомпилированный шаблон (это нужно в том случае, когда Вы точно знаете, что изменения в Ваш шаблон больше вноситься не будут). Пример:

//Отменяем проверку на изменения в шаблоне $smarty->compile_check = FALSE;

Удалить компилированный шаблон можно при помощи метода clearCompiledTemplate() , параметром передаем имя шаблона, например удалим компилированный шаблон main.tpl :

//удаляем компилированный шаблон $smarty->clearCompiledTemplate("main.tpl");

Иногда требуется не вывести шаблон на экран, а сохранить его отработанное значение в переменную. Для этого применяется метод fetch(‘имя шаблона’) , параметром передаем имя файла шаблона. В следующем примере мы сохраняем отработку шаблона в переменную, и затем выводим его через привычную функцию echo :

//Сохраняем отработку шаблона в переменную $var = $smarty->fetch("main.tpl"); //Выводим на экран echo $var;

Что бы получить переменные, которые уже переданы в шаблон, или получить значение одной конкретной переменной, переданной в шаблон, нужно воспользоваться методом getTemplateVars() , если вызвать этот метод без параметров то он вернет массив всех переданных шаблону переменных, если же в параметре передать имя переменной то метод вернет ее значение:

//Для примера выведем на экран переданные переменные шаблону print_r($smarty->getTemplateVars()); //Выведем на экран значение переменной name echo $smarty->getTemplateVars("name");

Если Вы разрабатываете сложное веб-приложение с большим количеством шаблонов, то перед выводом шаблона на экран(во избежание ошибок), необходимо сделать проверку существует ли выводимый шаблон или нет, это позволяет сделать метод templateExists(‘имя шаблона’) , который возвращает TRUE если шаблон существует и FALSE в противном случае(параметром передаем имя шаблона). Пример:

//Проверяем существует ли шаблон if(!$smarty->templateExists("main.tpl")){ exit("Такого шаблона не существует"); }

В примере если шаблона main.tpl не существует, то происходит завершение работы скрипта, но в реальном примере нужно бы было вызывать шаблон страницы, которая выводит на экран ошибки приложения – это уже на Ваше усмотрение от того что Вы делаете.

6. Кэширование в Smarty

Давайте рассмотрим последнюю тему, сегодняшнего урока — кэширование в Smarty. Кэширование применяется для ускорения работы методов display() или fetch() , при помощи сохранения результатов их работы в специальный файл, который сохраняется в папке cache. Если кэширование разрешено и файл доступен (уже сохранен ранее), то вместо повторной обработки шаблона, выводится кэшированная версия вызова. Кэширование может значительно ускорить работу, особенно в случае длительно обрабатываемых шаблонов. Так как результат работы методов display() или fetch() кэшируется, один кэшированный файл может состоять из нескольких файлов шаблонов, конфигурационных файлов и т.д.

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

Для начала кэширование нужно включить (по умолчанию оно выключено). Включить можно в двух режимах: первый – кэширование с кэшированием страниц на один час (время этого режима установлено по умолчанию), и второй – кэшированием с заданным временем кэширования (вы этот время задаете сами).

Сначала давайте рассмотрим первый вариант, и в наш самый первый пример после создания объекта Smarty, допишем следующее:

//Включаем кеширование страницы(по умолчанию на один час) $smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);

Вот как выглядит файл index.php. Шаблон остался без изменений.

setCaching(Smarty::CACHING_LIFETIME_CURRENT); //Создадим переменную для примера $name = "Vasya"; //Передаем переменную в шаблонизатор Smarty $smarty->assign("name",$name); //Выводим на экран $smarty->display("main.tpl"); ?>

Метод setCaching() включает кэширование страницы, параметром к нему необходимо передать – какой режим кэширования нужно активировать, в данном примере мы передаем константу класса CACHING_LIFETIME_CURRENT , которая включает первый вариант кэширования(кэширование на один час). Далее при обновлении страницы мы все также увидим Переданная переменная – Vasya , но обратите внимание, если мы в скрипте изменим значение переменной $name на любое другое значение, то изменений мы не увидим, сколько бы не обновляли страницу (только когда пройдет один час и время жизни кэшированной файла истечет) – страница закэширована. Ее кэшированный файл Вы можете увидеть в каталоге cache. Теперь давайте удалим кэшированный файл, с помощью метода clearCache(‘имя шаблона’) , параметром к которому передаем имя шаблона (кэш которого мы хотим удалить). Допишем перед методом display() следующий код:

//Удалим кэш шаблона $smarty->clearCache("main.tpl");

А сам метод display() закомментируем. После обновления странички браузера, посмотрите в каталог cache, Вы увидите, что кэшированный файл удалился. Далее расскомментируем метод display() , и обновим браузер – видно что переменная отобразилась с изменениями, и появился файл кэша в папке cache.

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

setCaching(Smarty::CACHING_LIFETIME_SAVED); //Время кэширования $smarty->setCacheLifetime(20); //Создадим переменную для примера $name = "Vasya"; //Передаем переменную в шаблонизатор Smarty $smarty->assign("name",$name); //Выводим на экран $smarty->display("main.tpl"); ?>

Так выглядит код файла файл index.php , с включенным кэшированием на 10 секунд. После обновления странички измените значение переменной name на любое другое значение, и обновите браузер, Вы увидите что на экране ничего не изменилось, но подождите 20 секунд (время кэширования), и обновите заново страничку – теперь изменения вступили в силу (время кэширования истекло).

Иногда бывает полезным знать кэширована страничка или нет, в этом нам поможет метод isCached (имя шаблона) , который возвращает TRUE или FALSE , в зависимости кэширована страница или нет.

//Проверяем кэширована ли страница if($smarty->isCached("main.tpl")) { //Ваш код }

Заключение

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

Всего доброго и удачного Вам кодирования!

Ваши пожелания и замечания буду рад увидеть в комментариях к статье!