studyportals/template4

Studyportals Template4 模板引擎的 Composer 包

1.1.0-rc 2020-07-21 12:52 UTC

This package is auto-updated.

Last update: 2022-01-27 17:26:04 UTC


README

A PHP Template-engine.

用法

use StudyPortals\Template\Template;

$template = Template::create('Templates/Home.tp4');

$template->title = 'Hello world!';

$template->header->foo = 'bar';

foreach(['item 1', 'item 2'] as $item){

  $template->listOfItems->name = $item;
  $template->listOfItems->repeat();
}

echo $template;

任何标量值和任何实现 __toString() 的对象(包括额外的模板)都可以传递给 $template 以用作变量。

作用域、部分和嵌套

可以在模板中添加 Section 元素以创建作用域边界。

Section 中定义的变量(例如上面 header 部分的 foo)仅在 Section 和其子代中可用。

重新定义现有变量(即已经由更高作用域提供的变量)会覆盖 Section 和其子代中的变量。它不会影响更高作用域中的变量。

作用域应用于 TemplateNodeTree 级别,因此从那里扩展的任何内容(例如 SectionRepeater 和所有包含语句)都充当作用域边界。

TemplateNodeTree 元素可以无限嵌套——直到可能遇到 PHP 的“物理”递归限制(这在任何实际场景中都非常不可能发生)。

重复器

一种特殊的 Section 类型是 Repeater

它的行为类似于普通部分,但有一个主要区别:当你可以调用其 repeat() 方法时,Repeater 的当前状态将被渲染并存储以供稍后输出。

随后,Repeater 作用域中的所有变量都将被清除,使你可以从头开始填充它。这允许渲染各种动态重复结构(列表、菜单等)。

包含

可以使用 include(用于静态 HTML 内容)和 include template(用于 Template4 文件)语法从文件系统包含文件。

包含的模板的行为与您将它们的全部内容粘贴到 inclue template 语句的位置一样。

模板的动态合并

如果您将任何扩展自 TemplateNodeTree 的内容传递给模板实例,它将被合并到该实例中。这种行为与在模板文件本身中使用 include template 语句相同。

这允许高级动态(甚至递归)行为。有关此示例,请参阅 📂 tests/smoke 中的 PHP 代码。

缓存

为了提高性能,建议缓存解析的模板。这将导致存储模板的中间表示形式(使用 PHP 的序列化格式)。

要使用缓存,请在创建模板之前启用它。

Template::setTemplateCache('on');

可选地,您可以使用 setTemplateCacheStore() 函数提供一个符合 Psr 规范的 CacheInterface。现在将不再在模板文件旁边生成 .tp4-cache 文件,而是使用提供的 CacheInterface

Template::setTemplateCache('on');
Template::setTemplateCacheStore($somePsrCache);

当模板文件发生变化时,缓存会自动失效。

⚠ 注意,包含的文件作为主模板的一部分进行缓存。包含文件的变化将 不会 使主模板的缓存失效...

开发

需要 PHP 7.2。

composer install

# Run smoke-tests
composer run phpunit

# Run compliance-tests
composer run phpstan
composer run phpcs
composer run phpmd

参考资料

  1. 📄 docs/TESTING.md
  2. 📄 docs/SYNTAX.md
  3. https://github.com/studyportals/template4-parser
  4. https://github.com/studyportals/CMS