Компонент Templating
Компонент Templating
Компонент Templating предоставляет все инструменты, необходимые для востроения любой системы шаблонов.
Он предоставляет инфраструктуру для загрузки файлов шаблона и опционального мониторинга на предмет изменений. Он также предоставляет конкретную реализацию шаблонзатора, используя PHP с дополнительными инструментами для экранизации и разделения шаблонов на блоки и разметки.
Установка
1
$ composer require symfony/templating
Также вы можете клонировать репозиторий https://github.com/symfony/templating.
Note
Якщо ви встановлюєте цей компонент поза додатком Symfony, вам потрібно підключити
файл vendor/autoload.php
у вашому коді для включення механізму автозавантаження
класів, наданих Composer. Детальніше можна прочитати у цій статті.
Использование
See also
Эта статья объясняет как использовать функции Templating как независимого компонента в любом приложении PHP. Прочитайте статью для понимания как использовать его в приложениях Symfony.
Класс PhpEngine является входной точкой компонента. Ему необходим анализатор имени шаблона (TemplateNameParserInterface) для преобразования имения шаблона в ссылку шаблона (TemplateReferenceInterface). Ему также необходим загрузчик шаблонов (LoaderInterface), который использует ссылку шаблона для поиска и загрузки шаблона:
1 2 3 4 5 6 7 8 9
use Symfony\Component\Templating\PhpEngine;
use Symfony\Component\Templating\TemplateNameParser;
use Symfony\Component\Templating\Loader\FilesystemLoader;
$filesystemLoader = new FilesystemLoader(__DIR__.'/views/%name%');
$templating = new PhpEngine(new TemplateNameParser(), $filesystemLoader);
echo $templating->render('hello.php', array('firstname' => 'Fabien'));
1 2
<!-- views/hello.php -->
Привет, <?php echo $firstname ?>!
Метод render() анализирует
файл views/hello.php
и возвращает текст вывода. Второй аргумент render
- это массив переменных для исползования в шаблоне. В этом примере, результат
будет Привет, Фабиен!
.
Note
Шаблоны будут кешированы в памяти движка. Это означает, что если вы отображаете один и тот же шаблон несколько раз в одном запросе, он будет загружен из файловой системы единожды.
Переменная $view
Во всех шаблонах, проанализированных PhpEngine
, вы получаете доступ к загадочной
переменной под названием $view
. Эта переменная содержит текущий экземпляр PhpEngine
.
Это означает, что вы получаете доступ к куче методов, которые облегчают вам жизнь.
Включение шаблонов
Наилучшим способом поделиться частью кода шаблона будет создать шаблон, который
может быть включен в другие шаблоны. Так как переменная $view
- это экземпляр
PhpEngine
, то вы можете использовать метод render()
(который был использован
для отображения шаблона изначально) внутри шаблона, чтобы отобразить другой шаблон:
1 2 3 4
<?php $names = array('Fabien', ...) ?>
<?php foreach ($names as $name) : ?>
<?php echo $view->render('hello.php', array('firstname' => $name)) ?>
<?php endforeach ?>
Глобальные переменные
Иногда вам может понадобиться установить переменные, которые будут доступны
во всех отображенных двигателем шаблонах (например, переменная $app
при
использовании фреймворка Symfony). Такие переменные можно установить, используя
метод addGlobal() и доступ
к ним можно получить в шаблоне, как и к обычным переменным:
1
$templating->addGlobal('ga_tracking', 'UA-xxxxx-x');
В шаблоне:
1
<p>Трекинг-код google: <?php echo $ga_tracking ?></p>
Caution
Глобальные переменные не могут быть названы this
или view
, так как они
уже используются в двигателе PHP.
Note
Глобальные переменные можно переопределить локальной переменной в шаблоне с таким же именем.
Экранирование вывода
Когда вы отображаете переменные, вам наверное стоит экранировать их, чтобы код HTML или JavaScript не выписывался с вашей страницы. Это предотвратит, например, XSS-атаки. Чтобы сделать это, используйте метод escape():
1
<?php echo $view->escape($firstname) ?>
По умолчанию, метод escape()
предполагает, что переменная выводится в контексте
HTML. Второй аргумент позволяет вам изменять контекст. Например, чтобы вывести что-то
в JavaScript, используйте контекст js
:
1
<?php echo $view->escape($var, 'js') ?>
Компонент поставляется с экранизаторами HTML и JS. Вы можете зарегистрировать ваш собственный экранизатор, используя метод setEscaper():
1 2 3 4 5
$templating->setEscaper('css', function ($value) {
// ... all CSS escaping
return $escapedValue;
});
Помощники
Компонент Templating может быть легко расширен с помощью помощников. Помощники - это PHP объекты, которые предоставляют поезные в контексте шаблона функции. Компонент имеет один встроенный помощник:
Перед тем, как вы сможете использовать эти помощники, вам нужно зарегистрировать их, используя set():
1 2 3 4
use Symfony\Component\Templating\Helper\SlotsHelper;
// ...
$templating->set(new SlotsHelper());
Пользовательские помощники
Вы можете создать ваших собственных помощников, создав класс, реализующий HelperInterface. Однако, в большинстве случаев вы будете расширять Helper.
Helper
имеет один обязательный метод:
getName().
Это имя, которое используется для получения помощника из объекта $view
.
Создание ползовательского двигателя
Кроме предоставления шаблонизатора PHP, вы можете также создать ваш собственный двигатель, используя компонент Templating. Чтобы сделать это, создайте новый касс, реализующий EngineInterface. Это требует 3 методов:
- render($name, array $parameters = array()) - Отображает шаблон
- exists($name) - Проверяет, существует ли шаблон
- supports($name) - Проверяет, может ли данный шаблон быть обработан этим двигателем.
Использование нескольких двигателей
Возможно использовать несколько двигателей одновременно, используя класс DelegatingEngine. Этот класс берёт список двигателей и действует так же, как обычный шаблонизатор. Единственная разница - он делегирует вызовы одному из других двигателей. Чтобы выбрать, какой ипользовать для шаблона, используется метод EngineInterface::supports():
1 2 3 4 5 6 7 8
use Acme\Templating\CustomEngine;
use Symfony\Component\Templating\PhpEngine;
use Symfony\Component\Templating\DelegatingEngine;
$templating = new DelegatingEngine(array(
new PhpEngine(...),
new CustomEngine(...),
));
Узнать больше
- Помощник ячеек
- Як використовувати PHP замість Twig для шаблонів
- Как получить доступ к пользователю, запросу, сессии и др. в Twig через переменную app
- Как сбросить информацию об отладке в шаблонах Twig
- Как встраивать контроллеры в шаблон
- Как экранировать вывод в шаблонах
- Как работать с разными форматами вывода в шаблонах
- Як автоматично впрповаджувати змінні у всі шаблони
- Як вбудувати асинхронний зміст за допомогою hinclude.js
- Как упорядочить ваши шаблоны Twig, используя наследование
- Как использовать и регистрировать пути Twig с пространством имён
- Как переопределять шаблоны из сторонних пакетов
- Как отобразить шаблон без пользовательского контроллера
- Как проверить синтаксис ваших шаблонов Twig
- Як написати користувацьке розширення Twig