alemachado / template-engine-factory
为Page添加Twig渲染方法
Requires
- php: >=5.3.0
This package is not auto-updated.
Last update: 2024-10-02 09:34:17 UTC
README
ProcessWire模块,帮助将逻辑与标记分离。它将ProcessWire模板转换为“控制器”,可以与新的API变量交互,如“Smarty”或“Twig”等不同的模板引擎。可以将任何模板引擎作为单独的模块添加到工厂中。
##实现引擎
- ProcessWire 默认引擎,使用ProcessWire的TemplateFile类。该引擎随此模块提供。
- Smarty 查看: https://github.com/wanze/TemplateEngineSmarty
- Twig 查看: https://github.com/wanze/TemplateEngineTwig
##安装 安装此模块就像安装任何其他ProcessWire模块一样。查看以下指南:http://modules.processwire.com/install-uninstall/
##动机 此模块的目标是尽可能简单地实现MVC模式。/site/templates/下的ProcessWire模板文件可以作为控制器,包含纯逻辑。控制器将输出/标记委托给相应的模板文件。此委托由模块抽象化,以便开发者可以使用任何模板引擎。
##配置
- 模板引擎 用于渲染模板的模板引擎。列出了所有已安装的引擎。默认情况下,您可以选择“ProcessWire”,这是随此模块提供的引擎。要使用“Smarty”或“Twig”等另一个引擎,请下载模块(参见上面的链接)并安装它。一旦安装,该引擎就会被识别并可选择。
- API变量 这是您可以在控制器(ProcessWire模板)中使用以访问当前页面的模板的变量。
与引擎相关的任何特定配置都设置在引擎本身的配置选项中,例如“TemplateEngineProcesswire”。每个引擎都有以下默认配置选项可用
- 模板路径 模板文件存储的网站目录的相对路径。例如,“templates/views/”解析为“/site/templates/views/”
- 模板文件后缀 模板文件的文件扩展名
- 全局模板文件 作为API变量后端使用的模板文件的文件名
##它如何工作?对于每个输出标记的控制器,应该存在相应的模板文件(在按引擎配置的模板文件目录中)。默认约定是模板文件的名称与控制器(即ProcessWire模板)相同
- 模板
/site/templates/views/home.php
对应于控制器/site/templates/home.php
- 模板
/site/templates/views/product.php
对应于控制器/site/templates/product.php
根据激活的引擎的“全局模板文件”设置,工厂会尝试加载当前页面的控制器或全局模板文件的模板文件。如果找到模板文件,则通过API变量可以访问其实例。如果没有找到模板文件,则工厂假定控制器没有通过模板引擎输出标记。在这种情况下,不会附加修改Page::render()行为的钩子 - 一切都按正常工作。
以下示例使用ProcessWire模板引擎
// In controller file: /site/templates/home.php if ($input->post->form) { // Do some processing, send mail, save data... $session->redirect('./'); } $view->set('foo', 'bar'); $view->set('show_nav', true); $view->set('nav_pages', $pages->get('/')->children());
在上面的例子中,如果表单被提交,则会处理一些逻辑。请注意,没有生成标记,因为现在这应该由相应的模板文件来完成!通过新的API变量$view
,键值对传递给模板。以下是一个模板文件可能的样子
// In template file: /site/templates/view/home.php <h1><?= $page->title ?></h1> <p>Foo: <?= $foo ?></p> <?php if ($show_nav): ?> <ul> <?php foreach ($nav_pages as $p): ?> <li><a href="<?= $p->url ?>"><?= $p->title ?></a></li> <?php endforeach; ?> </ul> <?php endif; ?>
假设已安装“TemplateEngineSmarty”模块,并且已选择Smarty作为活动模板引擎。模板文件可能如下所示
// In template file: /site/templates/smarty/home.tpl <h1>{$page->title}</h1> <p>Foo: {$foo}</p> {if $show_nav} <ul> {foreach $nav_pages as $p} <li><a href="{$p->url}">{$p->title}</a></li> {/foreach} </ul> {/if}
引入的API变量作为活动模板引擎的网关。这意味着可以在任何时间切换模板引擎,而无需更改控制器逻辑。在之前的例子中,控制器逻辑仍然相同,但模板引擎已从“ProcessWire”切换到“Smarty”。
加载和输出其他模板文件的标记
使用“TemplateEngineFactory”模块加载任何模板文件并输出其标记
// In controller file: /site/templates/product.php $factory = $modules->get('TemplateEngineFactory'); $chunk = $factory->load('chunks/product_chunk.tpl'); $chunk->set('product_title', $page->title); $chunk->set('date', date('d.m.Y')); $chunk_output = $chunk->render(); $view->set('chunk', $chunk_output);
上面的例子加载了一个名为“product_chunk.tpl”的模板文件并传递了一些变量。调用“render()”返回模板文件的渲染标记。
重要:缓存
由于之前的ProcessWire模板现在是一般不输出任何标记的控制器,因此ProcessWire模板缓存不应激活。请在模板的“缓存”部分设置中禁用缓存。
任何模板引擎都有可能支持额外的缓存。目前只有“Smarty”支持其模板的缓存。如果引擎支持缓存,则以下方法可供您使用(高级使用)
// These methods are only available if the selected engine supports caching!! // Do only process logic if no cache file is existing if (!$view->isCached()) { $view->txt = "No cache exists, I pass this variable"; } // Clear cache of current template file $view->clearCache(); // Clear cache of all template files $view->clearAllCache();
如果引擎支持缓存,TemplateEngineFactory模块将负责在保存或删除页面时清除缓存。
实现模板引擎
实现另一个模板引擎非常简单。请查看已实现的引擎,如“Smarty”或“Twig”,以获取一些示例。您的引擎需要扩展“TemplateEngine”抽象类并实现一些方法。
class TemplateEngineMyEngine extends TemplateEngine implements Module, ConfigurableModule { public function initEngine() { // This method is called by the TemplateEngineFactory after creating an instance. Setup the engine here. } public function set($key, $value) { // Pass a key/value pair to your engine } public function render() { // Output the markup of the loaded template file } }
安装“TemplateEngineMyEngine”模块后,该引擎将被“TemplateEngineFactory”识别,并可用来渲染标记。