Pull to refresh

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

Reading time4 min
Views7K
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 )
Tags:
Hubs:
+5
Comments15

Articles