infosophie/vinyl
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 的语法简单且智能
- PHP:您可以使用纯 PHP,就像您的模板是另一个包含文件一样
- HTML:所有 HTML 代码都将保持不变。将模板的静态部分设计成 HTML 文件,就像您通常做的那样
- 占位符:占位符的语法很简单:将标识符用 "<%" 和 "%>" 包装,就是这样。
- 数组值使用类似对象的方式引用,在数组名和元素键之间用点分隔:<%myarray.key1.subkey%>
- 函数:有一些内置函数(如 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...
<%/%>