alemachado/template-engine-factory

为Page添加Twig渲染方法

dev-master 2015-03-26 21:35 UTC

This package is not auto-updated.

Last update: 2024-10-02 09:34:17 UTC


README

ProcessWire模块,帮助将逻辑与标记分离。它将ProcessWire模板转换为“控制器”,可以与新的API变量交互,如“Smarty”或“Twig”等不同的模板引擎。可以将任何模板引擎作为单独的模块添加到工厂中。

##实现引擎

##安装 安装此模块就像安装任何其他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”识别,并可用来渲染标记。