This library is a templating engine for PHP that uses native PHP syntax to increase template flexibility and reduce processing overhead.
Part of https://github.com/computator/php-framework-utils.
The library is available on Packagist via composer, and is installable as computator/php-template-library or included in computator/framework-utils.
The primary engine interfaces are defined in the UserApi namespace.
UserApi/TemplateClient: Primary methods for utilizing the engine in templates.UserApi/ResolvedTemplateClient: Methods available on objects retrieved usingself::tpl()while rendering.UserApi/RenderClient: User-visible methods for interacting with theRenderer.UserApi/RenderManager: Internal methods the engine uses to control theRendererduring the render process.
Templates are executed with access to the methods defined in UserApi/TemplateClient and are intended to be called via the self object as self::method(), although $this->method() should also work. Template objects retrieved using self::tpl() have the methods defined in UserApi/ResolvedTemplateClient.
Using Short Open Tags, Alternative Control Structure Syntax, and leaving out the final semicolon in closing tags is encouraged to make templates more readable.
There are several included template types:
Templates/File: Directly executes the named PHP file. (default)Templates/PHPString: Executes the provided literal string of PHP code.Templates/Text: Plain text (no execution).
These examples demonstrate the primary concepts of the library with a main, parent, and child template. Note that the templates can be modified to avoid referencing literal .php filenames by using an alternative TemplateResolver.
<? self::inherit('parent.php') ?>
<? self::define('paragraph_one') ?>
Paragraph one text.
Paragraph one has a list:
<ul>
<? foreach (range(1, 5) as $n): ?>
<li>Item <?=$n?></li>
<? endforeach ?>
</ul>
More text.
<? self::define_end() ?>
<? self::define('paragraph_two') ?>
Paragraph two text.
Paragraph two calls another template:
<? self::tpl('child.php')->with(
title: "Child Title",
items: [
"one",
"two",
"three",
],
)() ?>
More text.
<? self::define_end() ?><h1>Parent Page</h1>
<p class="one">
<? self::block('paragraph_one') ?>
</p>
<p class="two">
<? self::block('paragraph_two') ?>
</p>
<p class="three">
<? if (!self::block('paragraph_three')): ?>
Fallback text if paragraph three is not set
<? endif ?>
</p><div class="child">
<h2><?=htmlspecialchars($title)?></h2>
<? foreach ($items as $i): ?>
<div class="item">
Item content: <?=htmlspecialchars($i)?>
</div>
<? endforeach ?>
</div><? self::inherit('parent.php') ?>
Main text.
Main has a list:
<ul>
<? foreach (range(1, 5) as $n): ?>
<li>Item <?=$n?></li>
<? endforeach ?>
</ul>
More text.
Main calls another template:
<? self::tpl('child.php')->with(
title: "Child Title",
items: [
"one",
"two",
"three",
],
)() ?>
More text.<h1>Parent Page</h1>
<p class="main">
<? self::primary() ?>
</p><div class="child">
<h2><?=htmlspecialchars($title)?></h2>
<? foreach ($items as $i): ?>
<div class="item">
Item content: <?=htmlspecialchars($i)?>
</div>
<? endforeach ?>
</div>Rendering is controlled by creating a new instance of a Renderer with a root template. The user-facing interface to the renderer instance is defined in UserApi/RenderClient.
The resolution of non-root template names to templates can be controlled by specifying an optional TemplateResolver. The default implementation passes the template name directly to the configured template class.
<?php
use Computator\FrameworkUtils\PHPTemplate\Renderer;
use Computator\FrameworkUtils\PHPTemplate\Templates;
// to make the example runnable
require 'vendor/autoload.php';
$renderer = Renderer::create(
// Note that here we are instantating the root template directly.
// Only templates referenced in `main.php` or other templates it
// calls will use the resolver.
new Templates\File('main.php')
);
$renderer->render();<?php
use Computator\FrameworkUtils\PHPTemplate\Renderer;
use Computator\FrameworkUtils\PHPTemplate\TemplateResolver;
use Computator\FrameworkUtils\PHPTemplate\Templates;
// to make the example runnable
require 'vendor/autoload.php';
$resolver = new TemplateResolver(
// This is the class used to instantiate new templates.
// In this case, `Templates\File` is the default so it
// could also be left unspecified.
Templates\File::class
);
$main_tpl = $resolver->resolve('main.php');
$renderer = Renderer::create(
$main_tpl,
$resolver,
);
$renderer->render();