volcanus / template-renderer

某些模板系统的渲染类

3.0.1 2023-02-03 05:14 UTC

This package is auto-updated.

Last update: 2024-08-30 01:11:20 UTC


README

Latest Stable Version Continuous Integration

这是一个PHP类库,用于通过通用接口使用各种模板引擎。

兼容环境

  • PHP 8.1及以后版本
  • Smarty(可选)
  • Latte (可选)
  • PHPTAL(可选)

版本的下限不明确。抱歉。

使用方法

Smarty

<?php
include './vendor/autoload.php';

use Volcanus\TemplateRenderer\Renderer;
use Volcanus\TemplateRenderer\Adapter\SmartyAdapter;

// Smarty
$renderer = new Renderer(new SmartyAdapter(new \Smarty(), [
    'template_dir' => __DIR__,
    'compile_dir'  => sys_get_temp_dir(),
]));

$renderer->assign('suffix', '');

file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.tpl', 'Hello {$name}{$suffix} !!');

$renderer->render('hello.tpl', ['name' => 'Smarty']); // Hello Smarty様 !!

unlink(__DIR__ . DIRECTORY_SEPARATOR . 'hello.tpl');

Latte

<?php
include './vendor/autoload.php';

use Volcanus\TemplateRenderer\Renderer;
use Volcanus\TemplateRenderer\Adapter\LatteAdapter;

// Latte
$renderer = new Renderer(new LatteAdapter(new \Latte\Engine(), [
    'baseDir' => __DIR__,
    'tempDirectory' => sys_get_temp_dir(),
]));

$renderer->assign('suffix', '');

file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.latte', 'Hello {$name}{$suffix} !!');

$renderer->render('hello.latte',['name' => 'Latte']); // Hello Latte様 !!

unlink(__DIR__ . DIRECTORY_SEPARATOR . 'hello.latte');

PHPTAL

<?php
include './vendor/autoload.php';

use Volcanus\TemplateRenderer\Renderer;
use Volcanus\TemplateRenderer\Adapter\PhpTalAdapter;

// PHPTAL
$renderer = new Renderer(new PhpTalAdapter(new \PHPTAL(), [
    'templateRepository' => __DIR__,
    'phpCodeDestination' => sys_get_temp_dir(),
]));

$renderer->assign('suffix', '');

file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.tal', '<tal:block>Hello <span tal:replace="name">Anonymous</span><span tal:replace="suffix">氏</span> !!</tal:block>');

$renderer->render('hello.tal', ['name' => 'PHPTAL']); // Hello PHPTAL様 !!

unlink(__DIR__ . DIRECTORY_SEPARATOR . 'hello.tal');

适配器的注意事项

基本上,它不提供对复杂设置或像插件这样的自定义机制的直接访问。

Smarty

它支持以下设置值。

  • template_dir, config_dir, plugins_dir, compile_dir, cache_dir, left_delimiter, right_delimiter, default_modifiers, caching, force_compile, use_sub_dirs, escape_html

通过自定义设置值 charset,可以指定模板文件的编码。(替换静态属性 Smarty::$_CHARSET)

通过自定义设置值 defaultLayout,可以指定默认的继承模板文件。

此设置仅在输出方法中未指定 "extends:" 或 "string:" 等模板资源时才会生效。

Latte

它支持以下设置值。

  • tempDirectory, autoRefresh, strictTypes

设置值 baseDir 用于在执行 \Volcanus\TemplateRenderer\Renderer::render() 和 \Volcanus\TemplateRenderer\Renderer::fetch() 时生成 \Latte\Loaders\FileLoader 的构造函数参数 $baseDir。

PHPTAL

它支持以下设置值。

  • templateRepository, phpCodeDestination, encoding, phpCodeExtension, outputMode, cacheLifetime, forceReparse

高级使用

可以通过这种方式在替换模板引擎的同时,使用 Renderer::assign() 持续收集输出结果,最后合并并输出。

<?php
include './vendor/autoload.php';

use Volcanus\TemplateRenderer\Renderer;
use Volcanus\TemplateRenderer\Adapter\SmartyAdapter;
use Volcanus\TemplateRenderer\Adapter\LatteAdapter;
use Volcanus\TemplateRenderer\Adapter\PhpTalAdapter;

// Smarty
$renderer = new Renderer(new SmartyAdapter(new \Smarty(), [
    'template_dir' => __DIR__,
    'compile_dir'  => sys_get_temp_dir(),
]));

$renderer->assign('suffix', '');

file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.tpl', 'Hello {$name}{$suffix} !!');

$renderer->assign('smarty', $renderer->fetch('hello.tpl', ['name' => 'Smarty'])); // Hello Smarty様 !!

unlink(__DIR__ . DIRECTORY_SEPARATOR . 'hello.tpl');

// Latte
$renderer->setAdapter(new LatteAdapter(new \Latte\Engine(), [
    'baseDir' => __DIR__,
    'tempDirectory' => sys_get_temp_dir(),
]));

file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.latte', 'Hello {$name}{$suffix} !!');

$renderer->assign('latte', $renderer->fetch('hello.latte', ['name' => 'Latte'])); // Hello Latte様 !!

unlink(__DIR__ . DIRECTORY_SEPARATOR . 'hello.latte');

// PHPTAL
$renderer->setAdapter(new PhpTalAdapter(new \PHPTAL(),[
    'templateRepository' => __DIR__,
    'phpCodeDestination' => sys_get_temp_dir(),
]));

file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'outline.tal', <<<'TEMPLATE'
<html>
<head>
<title tal:content="title">タイトル</title>
</head>
<body>
<div tal:content="smarty">Smartyコンテンツ</div>
<div tal:content="latte">Latteコンテンツ</div>
<div>Hello <span tal:replace="name">Anonymous</span><span tal:replace="suffix">氏</span> !!</div>
</body>
</html>
TEMPLATE
);

$renderer->render('outline.tal', [
    'title' => 'PHPTAL + Smarty + Latte',
    'name'  => 'PHPTAL',
]);

unlink(__DIR__ . DIRECTORY_SEPARATOR . 'outline.tal');