开发者

Lightweight PHP5 based template class/system

Looking at using a template system for a new project, it's only a small site and don't want to use the overhead and 'complexity' of smarty. I don't really like template systems that force you to make use of another language just to make it easier for designers (apparently).

Something like this http://www.namepros.com/code/517342-php5-template-class.html is what Im looking at but 开发者_StackOverflow社区something which is a bit more robust and proven.


TWIG

I would recommend using Twig

  • extensible syntax
  • efficient
  • compiles and caches your templates to PHP classes with a very small overhead
  • sandbox mode to evaluate untrusted template code
  • unit tested
  • great documentation
  • multiple template inheritance, template blocks, automatic output-escaping

Also read Fabien Potencier's blog post, where he explains needs for a powerful and customizable template engine.

TWIG Template code

{% 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 Components

Also if you need additional components for web development, but you already have a defined code base, have look at Symfony Components which includes additional templating component (mentioned in XUE Can answer)


PHP by itself is already a template engine. So why not cut out the overhead a template engine written in a template engine brings with it and just use PHP then?

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

If you need added functionality, consider using ViewHelper, e.g. small functions that encapsulate stuff like adding links names or translating, e.g.

<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>

If that's too verbose, have a look at HEREDOC and NOWDOC syntax and if this is still not what you are looking for, here is a list of some template engines:

  • http://www.webresourcesdepot.com/19-promising-php-template-engines/
  • http://en.wikipedia.org/wiki/Web_template_system#Server-side_systems

Or, if you feel experimental, have a look at XHP, Facebook's extension approach to a Template engine:

  • http://www.facebook.com/notes/facebook-engineering/xhp-a-new-way-to-write-php/294003943919
  • http://toys.lerdorf.com/archives/54-A-quick-look-at-XHP.html
  • https://github.com/hhvm/xhp-lib


I just released an open source project which makes this really easy. It is "Template Inheritance", inspired by Django's, and will let you inherit and override parts of a parent template from a child template. Located here:

http://arshaw.com/phpti/


I wrote Nest. It's a templating language based on the better parts of JSP, and it compiles to php code. You write your code in well-formed HTML and can easily create new tags to give you new functionality. There are some standard tags built in.

http://nest.sourceforge.net/

Looks like this:

<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>


I believe the PHP itself is a very powerful template engine.

If you just need a very simple template engine, you can wrap a str_replace(), for example:

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;
    }
}

And there is a simple yet flexible template engine from symfony if you need a full featured solution.


simplest... just create class blocks like:

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');
    }
}

and use $this->whatever on the template. or use:

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

and on the template you can access it with $myvar


Look at the absint package at phpclasses.org. It is very small and provides a trait, a class and a function to choose from. Freeware. Or just use the global function as a replacement for 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);
};
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜