Компонент Templating
Дата оновлення перекладу 2023-06-16
Компонент 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.
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) {
// ... екранування всього CSS
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