从 HTML 自动加载的动态模板系统(最小 PHP)
dynamic template system which autoloads from HTML (minimal PHP)
我已经有一个我编写和使用的模板引擎,但我想做一些更好的事情,我想知道我打算写的东西是否已经存在,因为我有非常具体的需求这个。
我的问题:是否已经存在具有我在下面描述的功能的模板系统?
如果没有,是否有任何库允许某些功能,我可以将这些功能彼此集成并集成到我自己的一些代码中,这样我只需要编写一些东西?
我认为答案是否,但我想我会先问清楚再花很多时间自己做。
我的意图是将 PHP、HTML、CSS 和 JS 集成到一个面向对象的系统中,所有这些系统都可以干净利落地相互交互。我已经编写了一个 javascript class 系统,我将集成该系统以实现该目标,因为我已经建立了下面描述的所有内容。
TLDR;
简而言之,我正在寻找一个面向对象的模板引擎,它可以自动加载 html、css、javascript 和 php 文件,而无需任何特殊语法或新语言来编写另外,我希望它能够使用 HTML 文件根据文件中的参数构建 PHP 对象。
我想要什么:
自动加载。例如,给定 template.html:
<div class="templateEngine Content">
<div class="templateEngine Content-Head"></div>
<div class="templateEngine Content-Body"></div>
<div class="stylizedClass">
static content
</div>
</div>
它应该加载PHP class Content
和相关资源文件(例如MySite/Content/Content.[extension]
并自动调用一些loader
方法。
然后它还会加载 Content-Head
(PHP class \Content\Head
w/ 命名空间),可以在 MySite/Content/Head/Head.[extension]
和 Content-Body
,但它会跳过 stylizedClass
此外,当每个 classes(Content
、Content-Head
、Content-Body
)加载时,它们将检查关联的 html
模板和加载那些 PHP 文件没有加载器方法的文件
为了解释这一点,您可以使用以下 PHP 文件或 html 文件加载 Content-Head
。
/Site/Content/Head/Head.php
:
namespace Content;
class Content {
/** returns the inner html
*/
public function innerHtml(){
return MyDBSystem::loadItem(SOME_ID)->content;
}
}
和
/Site/Content/Content/Head.html
:
<div class="somethingStatic">
some stupid static content
</div>
<div class="templateEngine Content-Head-CrazyLoader"></div>
因此,如果 php file/class 和方法存在,它将调用 innerHtml()
方法。如果 php 文件不存在,那么它会 运行 Head.html
,自动加载 Content-Head-CrazyLoader
class (哦,是的。我也希望它支持嵌套像个老板)。
总而言之,Template.html
将被加载,自动加载 Content-Head
并插入 \Content\Head::innerHtml()
的 return 值或/Site/Content/Head/Head.html
的内容变成了<div>
里面有classContent-Head
.
HTML 到 PHP 对象映射:
我认为这似乎更直接一些。
对于文件 /Site/AutoMap/AutoMap.edit.html
:
<div class="templateEngine Cool-AutoMap">
<input type="text" name="name" value="CoolName"/>
<input type="checkbox" name="isFunny" checked>
<select name="multi">
<option value="cat" selected>Cat</option>
<option value="dog">Dog</option>
</select>
</div>
PHP 文件 /Site/AutoMap/AutoMap.php
的生成方式如下:
<?php
namespace Cool;
class AutoMap {
public $name;
public $isFunny;
public $multi;
public $multiOptions;
public function __constructed(){
//theoretically, the template engine would first declare
// this->propName = new \TemplateEngine\Prop\DataType();
// for each prop
$this->name->value = 'CoolName';
$this->isFunny->value = TRUE;
$this->multi->value = 'cat';
$this->multi->options = array("cat"=>'Cat',"dog"=>'Dog');
}
}
?>
预编译器:
从本质上讲,它会构建缓存 PHP 页面,其中包含动态部分以提高性能,因此静态内容实际上是静态的,因此动态内容不必 运行 通过疯狂自动加载每个页面请求。
另外:
- 在 HTML 文件中,您可以包含动态位,例如:
<?=time()?>
对于您只需要一些 PHP 的地方。
- 还有一个数据库抽象层,但我已经自己编写了它,并将其与系统的其余部分集成以自动加载数据库对象
好像不存在。我见过的所有选项都需要 PHP 代码或它们自己的简单自定义语言才能操作。而且他们似乎没有自动加载任何东西。也就是说,您必须在 PHP 中创建所有变量,并编写 PHP 代码来加载模板。
我自己写了(大部分,仍在进行中),我可能会在我认为合适的时候开源它(无论如何,它的一部分),但可能不会持续几个月。
我已经有一个我编写和使用的模板引擎,但我想做一些更好的事情,我想知道我打算写的东西是否已经存在,因为我有非常具体的需求这个。
我的问题:是否已经存在具有我在下面描述的功能的模板系统?
如果没有,是否有任何库允许某些功能,我可以将这些功能彼此集成并集成到我自己的一些代码中,这样我只需要编写一些东西?
我认为答案是否,但我想我会先问清楚再花很多时间自己做。
我的意图是将 PHP、HTML、CSS 和 JS 集成到一个面向对象的系统中,所有这些系统都可以干净利落地相互交互。我已经编写了一个 javascript class 系统,我将集成该系统以实现该目标,因为我已经建立了下面描述的所有内容。
TLDR; 简而言之,我正在寻找一个面向对象的模板引擎,它可以自动加载 html、css、javascript 和 php 文件,而无需任何特殊语法或新语言来编写另外,我希望它能够使用 HTML 文件根据文件中的参数构建 PHP 对象。
我想要什么:
自动加载。例如,给定 template.html:
<div class="templateEngine Content">
<div class="templateEngine Content-Head"></div>
<div class="templateEngine Content-Body"></div>
<div class="stylizedClass">
static content
</div>
</div>
它应该加载PHP class Content
和相关资源文件(例如MySite/Content/Content.[extension]
并自动调用一些loader
方法。
然后它还会加载 Content-Head
(PHP class \Content\Head
w/ 命名空间),可以在 MySite/Content/Head/Head.[extension]
和 Content-Body
,但它会跳过 stylizedClass
此外,当每个 classes(Content
、Content-Head
、Content-Body
)加载时,它们将检查关联的 html
模板和加载那些 PHP 文件没有加载器方法的文件
为了解释这一点,您可以使用以下 PHP 文件或 html 文件加载 Content-Head
。
/Site/Content/Head/Head.php
:
namespace Content;
class Content {
/** returns the inner html
*/
public function innerHtml(){
return MyDBSystem::loadItem(SOME_ID)->content;
}
}
和
/Site/Content/Content/Head.html
:
<div class="somethingStatic">
some stupid static content
</div>
<div class="templateEngine Content-Head-CrazyLoader"></div>
因此,如果 php file/class 和方法存在,它将调用 innerHtml()
方法。如果 php 文件不存在,那么它会 运行 Head.html
,自动加载 Content-Head-CrazyLoader
class (哦,是的。我也希望它支持嵌套像个老板)。
总而言之,Template.html
将被加载,自动加载 Content-Head
并插入 \Content\Head::innerHtml()
的 return 值或/Site/Content/Head/Head.html
的内容变成了<div>
里面有classContent-Head
.
HTML 到 PHP 对象映射: 我认为这似乎更直接一些。
对于文件 /Site/AutoMap/AutoMap.edit.html
:
<div class="templateEngine Cool-AutoMap">
<input type="text" name="name" value="CoolName"/>
<input type="checkbox" name="isFunny" checked>
<select name="multi">
<option value="cat" selected>Cat</option>
<option value="dog">Dog</option>
</select>
</div>
PHP 文件 /Site/AutoMap/AutoMap.php
的生成方式如下:
<?php
namespace Cool;
class AutoMap {
public $name;
public $isFunny;
public $multi;
public $multiOptions;
public function __constructed(){
//theoretically, the template engine would first declare
// this->propName = new \TemplateEngine\Prop\DataType();
// for each prop
$this->name->value = 'CoolName';
$this->isFunny->value = TRUE;
$this->multi->value = 'cat';
$this->multi->options = array("cat"=>'Cat',"dog"=>'Dog');
}
}
?>
预编译器: 从本质上讲,它会构建缓存 PHP 页面,其中包含动态部分以提高性能,因此静态内容实际上是静态的,因此动态内容不必 运行 通过疯狂自动加载每个页面请求。
另外:
- 在 HTML 文件中,您可以包含动态位,例如:
<?=time()?>
对于您只需要一些 PHP 的地方。 - 还有一个数据库抽象层,但我已经自己编写了它,并将其与系统的其余部分集成以自动加载数据库对象
好像不存在。我见过的所有选项都需要 PHP 代码或它们自己的简单自定义语言才能操作。而且他们似乎没有自动加载任何东西。也就是说,您必须在 PHP 中创建所有变量,并编写 PHP 代码来加载模板。
我自己写了(大部分,仍在进行中),我可能会在我认为合适的时候开源它(无论如何,它的一部分),但可能不会持续几个月。