infosophievinyl

PHP模板引擎

v0.1.2 2022-10-01 21:22 UTC

This package is not auto-updated.

Last update: 2024-09-30 01:57:40 UTC


README

Infosophie::Vinyl 是一个 PHP 模板引擎。它的重点是立即创建简单且符合 PHP 规范的模板,用于在您的 PHP 项目中使用。

安装

composer require infosophie/vinyl

"require": {
    "infosophie/vinyl": "main"
}

用法

包含 Vinyl

如果您使用 composer,只需“使用”Infosophie\Vinyl\Engine

use Infosophie\Vinyl\Engine;

不使用 composer,首先 include_once vinyl/src/Engine.php 文件

include_once("vendor/infosophie/vinyl/src/Engine.php");
use Infosophie\Vinyl\Engine;

路径取决于您存储 Infosophie::Vinyl 的位置。

快速入门

在您的项目路径中某个位置创建一个名为 helloworld.tpl 的模板文件,并输入以下内容

<h1>Hello World, I am <%name%></h1>

在您的 PHP 脚本中,从 Infosophie\Vinyl\Engine 创建一个新的实例,传递存储模板的文件夹路径

...
$vinyl = new Infosophie\Vinyl\Engine(['vinyl/templates']);

注意数组:路径作为包含单个元素的数组传递给 Engine。这是必要的,因为您可能需要传递多个路径以搜索模板(见下文...)。

要获取渲染的模板,请调用带有模板名称和所有占位符(<%...%>)数据的 render() 函数的数组

include_once("vendor/infosophie/vinyl/src/Engine.php");

use Infosophie\Vinyl\Engine;

$vinyl = new Infosophie\Vinyl\Engine(['vinyl/templates']);
echo $vinyl->render("helloworld", ['name' => 'Christian Grauer']);

这是您应该在浏览器中看到的内容(源代码)

<h1>Hello World, I am Christian Grauer</h1>

提示:将我的名字替换为您的名字,使其更个性化 ;-)

这就是模板引擎的工作原理:它们将占位符替换为数据!

特性

以下是 Vinyl 的主要特性

  • 占位符可以使用以下数据
    • 传递给 render() 的数组中的元素
    • 关联数组中的值,深度不限
    • 项目内的函数
  • PHP/HTML 集成
    • 您可以在模板中使用纯 PHP 代码,只需将其用 "" 包装即可,就像您通常做的那样。
    • 您还可以使用纯 HTML,它将保持不变
  • 包括和包装模板
    • 包括使用与主模板相同数据的子模板
    • 使用其他模板包装模板(例如,为所有模板使用通用的页眉和页脚)

语法

Vinyl 的语法简单且智能

  1. PHP:您可以使用纯 PHP,就像您的模板是另一个包含文件一样
  2. HTML:所有 HTML 代码都将保持不变。将模板的静态部分设计成 HTML 文件,就像您通常做的那样
  3. 占位符:占位符的语法很简单:将标识符用 "<%" 和 "%>" 包装,就是这样。
    • 数组值使用类似对象的方式引用,在数组名和元素键之间用点分隔:<%myarray.key1.subkey%>
  4. 函数:有一些内置函数(如 include 和 wrap)并且可以添加自定义函数,这些函数可以调用 PHP 代码中的“真实”函数。两者都有相同的语法,就像 "<%functionname(parameter1|parameter2)%>"。
    • 参数传递给函数。对于 'include' 和 'wrap',只有一个参数,即模板的名称
    • 多个参数(例如,对于自定义函数)用竖线(|)分隔
    • 不需要引号:只需在括号内写入内容即可:<%myfunction(this is content|and this)%>

就是这样。没有必要学习一门全新的语言...

定制

Vinyl 可以以多种方式定制

  • 文件名:".tpl" 扩展名可以更改为您喜欢的任何内容
  • 占位符:占位符的 "<%" 和 "%>" 标签也可以更改为您喜欢的任何内容(只要它们适合用于识别占位符...)
  • 将您自己的函数注入 Vinyl

主题

Vinyl支持主题。您可以向Vinyl传递任意多的模板路径。模板将按照所有路径依次进行搜索。这就是您如何轻松地将主题应用于项目的途径。

假设您有默认演示文稿的模板,并在您的项目中为自定义主题有自定义模板。只需将两个路径传递给Vinyl,首先传递主题路径,然后是默认路径。

...
$vinyl = new Infosophie\Vinyl\Engine(['themes/mytheme/templates', 'templates']);
...

对于每个使用render()调用的模板,Vinyl将首先在第一个路径(themes/mytheme/templates)中搜索它。如果Vinyl在那里找不到它,它将在第二个路径(templates)中搜索。这意味着,对于您没有的模板,您不需要创建或复制每个模板,只需复制与默认模板不同的模板即可。

自定义函数

自定义函数的使用方式与内部函数相同。但自定义函数在使用模板之前必须与Vinyl共享。

如果您想与Vinyl共享一个函数,请在您的vinyl实例上调用方法"customFunction()"。

...
$vinyl = new Infosophie\Vinyl\Engine(['themes/mytheme/templates', 'templates']);
$vinyl->customFunction('link', 'getLink', $this);
echo $vinyl->render('mytemplate');
...

在这个片段中,函数"getLink()"以"link"的名称传递给Vinyl。

  • 第一个参数是模板中将要使用的函数名称。
  • 第二个参数是您的代码中函数的名称,即如果模板调用函数 <%link()%>,则函数"getLink()"将被调用,它返回的内容将是 <%link()%> 的输出。
  • 第三个(可选)参数是函数所属的对象或类,在上面的例子中,它是指调用vinyl的相同对象,因此我们可以使用 $this。传递给vinyl的方法必须是公开的。如果您传递的对象或类与调用类不同,您必须确保Vinyl可以访问它!如果您传递的是类名而不是对象实例,您必须确保您使用的方法是静态的(可以像 Classname::method() 一样调用)!

如果您在模板中调用link(),您必须传递getLink()所需的全部参数!

为了更清楚地了解自定义函数的工作方式,让我们看一个实际的例子。

这是您项目的代码


namespace Myproject;

use Infosophie\Vinyl\Engine;

class presentation {

    ...

    public function output() {
        $vinyl = new Engine('templates');   # create vinyl object, templates are in folder "templates"
        $vinyl->customFunction('link', 'getLink', $this); # add getLink() as a custom function
        $vinyl->render('linklist'); # render the template linklist.tpl
    }

    public function getLink($url) {
        return "<a href=\"" . $url . "\">" .$url . "</a>";
    }
}

这是您的模板"templates\linklist.tpl"

<h1>Linklist</h1>
<ul>
    <li><%link(http://www.infosophie.de)%></li>
    <li><%link(http://www.cgrauer.de)%></li>
    <li><%link(http://www.schachtelhalm.net)%></li>
</ul>

这是vinyl->render()返回的输出

<h1>Linklist</h1>
<ul>
    <li><a href="http://www.infosophie.de">http://www.infosophie.de</a></li>
    <li><a href="http://www.cgrauer.de">http://www.cgrauer.de</a></li>
    <li><a href="http://www.schachtelhalm.net">http://www.schachtelhalm.net</a></li>
</ul>

customFunctions与Vinyl实例(如示例中的$vinyl)共享,并将对所有使用该实例渲染的模板可用!因此,您只需为每个函数和Vinyl实例调用customFunction()一次。

参考

变量

<%label%>

包含

<%include(templatename)%>

包装

<%wrap(templatename)%>

自定义函数

<%functionname(parameter1|parameter2|$variable1...)%>

循环

<%loop(array):id=value%>
...content...
<%/%>

<%loop(array):value%>
...content...
<%/%>