Сегодня стала доступна еще одна библиотека от PHPixie, на этот раз это шаблонизатор. Как и в предыдущей версии как язык используется сам PHP, но теперь добавились новые возможности включая блочный подход к наследованию шаблонов. Об этом мы поговорим позже, а сейчас о самом вкусном: компиляции произвольных форматов. PHPixie Template позволяет использовать практически любой формат, достаточно лишь предоставить компилятор который транслирует его в PHP, а подгрузка файлов, их кэширование итд. будет сделано за вас. Также, это значит, что можно одновременно использовать несколько форматов в одном проекте.
Итак попробуем подружить Template с HAML. Для этого используем пакет mthaml/mthaml
//composer.json { "require": { "phpixie/template": "3.*@dev", "phpixie/slice": "3.*@dev", "mthaml/mthaml": "1.7.0" } }
Создаем самый простой враппер:
<?php class HamlFormat implements \PHPixie\Template\Formats\Format { protected $mtHaml; public function __construct() { $this->mtHaml = new \MtHaml\Environment('php'); } //Расширения файлов которые обрабатывает наш формат public function handledExtensions() { return array('haml'); } //Сама компиляция public function compile($file) { $contents = file_get_contents($file); return $this->mtHaml->compileString($contents, $file); } }
Осталось лишь передать наш новый формат через конструктор в сам Template:
//Вспомогательная библиотека о которой я еще расскажу //Используется для представления данных, в данном случае конфига $slice = new \PHPixie\Slice(); $config = $slice->arrayData(array( 'resolver' => array( 'locator' => array( //Папка с шаблонами 'directory' => __DIR__.'/templates/', 'defaultExtension' => 'haml', ) ), 'compiler' => array( //Где сохранять скомпилированные файлы 'cacheDirectory' => > __DIR__.'/cache/', ) )); $template = new \PHPixie\Template($slice, $config, array(), array( new HamlCompiler() ));
Теперь все haml шаблоны будут автоматически компилироваться и кэшироваться. Таким образом можно придумать или адаптировать любой язык, при этом сохраняя все другие возможности библиотеки, как например наследование и расширения.
Наследование
В прошлой версии единственным способом подключить один шаблон в другой был include. То есть рендеринг страницы должен был идти сверху вниз подключая нужные шаблоны по пути. Недостаток такого подхода в том что подключенный шаблон не может изменить ничего в родительском. А сейчас взглянем что нам доступно теперь:
//файл layout.php <html> <title> <?php $this->block('title'); ?> </title> <body> <?php $this->childContent(); ?> </body> </html>
//файл fairy.php <?php $this->layout('layout'); ?> <?php $this->startBlock('title'); ?> Fairy page <?php $this->endBlock(); ?> <h2>Hello <?php $_($name); ?></h2>
Шаблон fairy.php расширяет layout.php с возможностью переопределить блоки в родительском шаблоне. Тем кто использует Twig этот подход очень знаком. Для тех кто предпочитает использовать include это и дальше возможно:
include $this->resolve('fairy');
Поиск шаблона
Шаблонизаторы часто имеют механизм поиска шаблона, где если нужен шаблон не найден вместо него используется другой. Часто такое нужно при создании новых тем базируясь на старых. Вместо какого-то одного подхода PHPixie Template позволяет самому настроить поиск используя комбинации 3-х локаторов:
- Driectory — ищет в директории по имени файла, самый стандартный
- Group — группирует локаторы, поиск ведется в каждом локаторе по очереди
- Prefix — Позволяет добавить префикс к имени
Взглянем на такой конфиг:
<?php $config = $slice->arrayData([ 'resolver' => [ 'locator' => [ 'type' => 'prefix', 'locators' => [ 'Site' => [ 'directory' => __DIR__.'/site/', ], 'Theme' => [ 'type' => 'group', 'locators' => [ [ 'directory' => __DIR__.'/templates/', ], [ 'directory' => __DIR__.'/fallback/', ], ] ] ] ] ] ]);
Таким образом шаблон Site::layout будет искаться в папке site/, а Theme::home в папках templates/ и fallbacks/.
Расширения
Расширения это классы которые добавляют дополнительные функции в шаблоны. В качестве примера посмотрим на расширение HTML, которое используется для вывода и экранирования строк.
class HTML implements \PHPixie\Template\Extensions\Extension { public function name() { return 'html'; } //Методы из \того массива будут доступны в шаблонах public function methods() { return array('escape', 'output'); } //Также для удобности можно некоторые функции назначит в переменные //в данном случае это позволит использовать $_($name) вместо $this->output($name) public function aliases() { return array( '_' => 'output' ); } //Сами методы public function escape($string) { return htmlspecialchars($string, ENT_QUOTES, 'UTF-8'); } public function output($string) { echo $this->escape($string); } }
Такие расширения аналогичино форматам можно передавать через конструктор.
Демо
Чтобы попробовать Template своими руками достаточно:
git clone https://github.com/phpixie/template cd template/examples #если у вас еще нет Композера curl -sS https://getcomposer.org/installer | php php composer.phar install php quickstart.php
И кстати как и у всех других библиотеках от PHPixie вас ждет 100% покрытие кода тестами и работа под любой версией PHP старше 5.3 ( включая новую 7 и HHVM )
ссылка на оригинал статьи http://habrahabr.ru/post/253973/
Добавить комментарий