从 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(ContentContent-HeadContent-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 页面,其中包含动态部分以提高性能,因此静态内容实际上是静态的,因此动态内容不必 运行 通过疯狂自动加载每个页面请求。

另外:

好像不存在。我见过的所有选项都需要 PHP 代码或它们自己的简单自定义语言才能操作。而且他们似乎没有自动加载任何东西。也就是说,您必须在 PHP 中创建所有变量,并编写 PHP 代码来加载模板。

我自己写了(大部分,仍在进行中),我可能会在我认为合适的时候开源它(无论如何,它的一部分),但可能不会持续几个月。