Вкусняшки от новой PHPixie Template

от автора

image
Сегодня стала доступна еще одна библиотека от 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *