基于轻量级PHP5的模板类/系统

时间:2010-02-10 07:46:33

标签: php templates

考虑将模板系统用于新项目,它只是一个小型站点,不想使用smarty的开销和“复杂性”。我真的不喜欢模板系统迫使你使用另一种语言只是为了让设计师更容易(显然)。

像这样的东西   http://www.namepros.com/code/517342-php5-template-class.html 正是我所看到的东西,但更强大和证明的东西。

7 个答案:

答案 0 :(得分:18)

TWIG

我建议使用 Twig

  • 可扩展语法
  • 高效
  • 以非常小的开销
  • 编译和缓存模板到PHP类
  • 沙箱模式以评估不受信任的模板代码
  • 单元测试
  • 很棒的文档
  • 多个模板继承,模板块,自动输出转义

另请阅读Fabien Potencier's blog post,其中解释了对功能强大且可自定义的模板引擎的需求。

TWIG模板代码

{% extends "layout.html" %}

{% block title %}
    {{ page.title|escape|title }}
{% endblock %}

{% block content %}
    Content of the page...

    {% for user in users %}
      * {{ user.name }}
    {% else %}
        No user has been found.
    {% endfor %}

{% endblock %}

{# this is a comment in twig syntax #}

Symfony组件

此外,如果您需要用于Web开发的其他组件,但您已经有一个已定义的代码库,请查看Symfony Components其中包含其他模板组件(在XUE中可以回答)

答案 1 :(得分:15)

PHP本身已经是模板引擎。那么为什么不减少模板引擎中编写的模板引擎带来的开销,然后只使用PHP呢?

<h1><?php echo $pageTitle ?></h1>
<div>
    <ul>
    <?php foreach($items as $item): ?>
        <li><?php echo htmlentities($item); ?></li>
    <?php endforeach; ?>
    </ul>
</div>

如果您需要添加功能,请考虑使用ViewHelper,例如小函数,用于封装诸如添加链接名称或翻译之类的内容,例如

<table>
<?php foreach($items as $key => $item): ?>
    <tr class="<?php echo oddEven($key)?>">
        <td><?php echo productLink($item->id); ?></td>
        <td><?php echo translate($item->description); ?></td>
    </tr>
<?php endforeach; ?>
</table>

如果这太冗长,请查看HEREDOC and NOWDOC syntax,如果这仍然不是您要找的,请参阅以下列表:

,如果您有实验性,请查看XHP,Facebook对模板引擎的扩展方法:

答案 2 :(得分:5)

我刚刚发布了一个开源项目,这让我很容易。它是“模板继承”,受Django的启发,并允许您从子模板继承和覆盖父模板的一部分。位于:

http://arshaw.com/phpti/

答案 3 :(得分:3)

我写了Nest。它是一种基于JSP更好部分的模板语言,它编译为php代码。您可以使用格式良好的HTML编写代码,并可以轻松创建新标记以为您提供新功能。内置了一些标准标签。

http://nest.sourceforge.net/

看起来像这样:

<html xmlns:c="urn:nsttl:HTML_Template_Nest_Taglib_Standard">
  <body>
    <ul>
      <c:foreach items="posts" var="post">
        <li>${post->title}</li>
      </c:foreach>
    </ul>
</body>

答案 4 :(得分:0)

最简单......只需创建类块:

class MyBlock implements IHtmlRenderizable{
    private $_vars = array();
    public function addVar($name, $value) { 
        $this->_vars[$name] = $value; return $this; 
    }
    public function toHtml(){
        extract($this->_vars);
        include('/the/template.phtml');
    }
}

并使用$ this-&gt;模板上的任何内容。 或使用:

$block->addVar('myvar', 'myvalue')->toHtml();

在模板上,您可以使用$ myvar

访问它

答案 5 :(得分:0)

我相信PHP本身就是一个非常强大的模板引擎。

如果你只需要一个非常简单的模板引擎,你可以包装str_replace(),例如:

function template($source, array $vars, $return=false) {
    foreach ($vars as $key=>$value) {
        $source = str_replace('{'.$key.'}', $value, $source);
    }
    if ($return) {
        return $source;
    } else {
        echo $source;
    }
}

如果您需要功能齐全的解决方案,则会有simple yet flexible template engine from symfony

答案 6 :(得分:0)

查看 phpclasses.org 上的 absint 包。它非常小,并提供了一个特征、一个类和一个函数可供选择。免费软件。 或者只是使用全局函数作为 vsprintf() 的替代:

function absintf($string, array $vars) {
    $callback = function ($matches) use ($vars) {
        $match = $matches[1];
        return $vars[$match];
    };
    return preg_replace_callback("/\{([\w\d]+)\}/", $callback, $string);
};