paudebau / h2o-php
一款美观的PHP模板引擎,采用Django风格
Requires
- php: >=5.1
This package is not auto-updated.
Last update: 2024-09-14 13:35:27 UTC
README
作为一名武术爱好者,我借用了一句名言。
H2O模板
H2O是一种受到Django大量启发的PHP标记语言。
特性
- 可读性高且符合人类习惯的语法。
- 易于使用和维护
- 通过模板包含和继承,鼓励在模板中的复用。
- 通过过滤器、标签和模板扩展,高度可扩展。
- 包含丰富的过滤器标签,用于字符串格式化、HTML辅助工具和国际化支持。
要求
- PHP 5.1+
新闻
- 版本 0.4
- 重大更改 默认开启autoescape功能
- 改进搜索路径和文件加载处理
- 改进PHP重载对象的处理
- 大量错误修复
- 版本 0.3
- 支持国际化模板和翻译解析工具
- 上下文查找性能优化
- 修复操作符解析错误
入门指南
获取h2o
下载
使用Git
git clone http://github.com/speedmax/h2o-php.git
使用SVN
svn checkout http://h2o-template.googlecode.com/svn/trunk/ h2o
安装
-
下载并解压h2o到您的项目路径或PHP包含路径
示例文件结构设置
myawesome_app/ index.php templates/ index.html h2o/ -
在您的PHP文件中使用
require 'h2o/h2o.php'包含h2o库。 -
以下是一个基本的代码示例,以启动您的项目。
-
查看 \example 和 \specs 目录,以了解h2o的一些更有趣的功能。
templates/index.html
<body>
<head><title>Hello world</title></head>
<body>
Greetings {{ name }}
</body>
</body>
index.php
<?php
require 'h2o/h2o.php';
$h2o = new h2o('templates/index.html');
echo $h2o->render(array('name'=>'Peter Jackson'));
?>
有用链接
- 请将补丁或错误报告提交到我们的 lighthouse错误跟踪器。
- 查看我们的 Google群组 进行h2o相关讨论。
语法说明
变量
{{ variable }}
使用点 (.) 访问变量的属性
变量查找顺序
- 关联数组的键
- 数组索引
- 对象属性
- 对象方法调用
示例
在模板中
{{ person.name }}
在PHP中
<?php
$h2o = new H2o('template.tpl');
$person =array(
'name' => 'Peter Jackson', 'age' => 25
);
$h2o->render(compact('person'));
?>
假设您在PHP脚本中将值 Peter Jackson 赋值给 'person' 变量。以下变量标签将打印出 Peter Jackson。
过滤器
过滤器是变量修饰符,用于操作或格式化变量的值。过滤器通常如下所示 {{ person.name|capitalize }},变量后跟一个管道 ( | ) 字符和一个过滤器名称,将导致H2O应用过滤器。
过滤器链
您可以将多个过滤器链接起来,并使用管道 ( | ) 字符来分隔它们。 {{ document.body|escape|nl2br }}
过滤器参数
过滤器可以接受参数。例如:{{ document.description|truncate 20 }} 将显示文档描述的前20个字符。
此外,还有可能需要传递多个参数的情况。使用逗号 ( , ) 来分隔它们:{{ person.bio|truncate 20, "..." }}
命名参数
h2o使用冒号 ( : ) 作为命名参数。这些允许您构建 '可选参数' 数组。
{{ '/images/logo.png' | image_tag width:450, height:250, alt:"company logo" }}
上面的代码翻译成PHP将是下面的代码片段,这类似于内部发生的事情
<?php
echo image_tag("/image/logo.png", array(
'width' => 450,
'height' => 250,
'alt'=>'company logo'
));
?>
注意:与Django、Smarty不同,H2o为了可读性,不使用冒号(:)字符来分隔参数,而是使用逗号(,),这更符合逻辑。
标签
{% tag %}
标签非常强大,因为它们控制着模板的逻辑流程和结构。有行内标签 {% inline_tag %} 或需要闭合标签的标签。例如:{% if condition %} ... {% endif %}
"if"标签
if标签评估一个变量或一个简单表达式。如果if表达式的结果是true,则允许渲染if块的内容。
{% if person.is_adult %}
You are old enough.
{% else %}
sorry, you are too young for that.
{% endif %}
"for"标签
for标签允许遍历一个项目数组。
{% for task in tasks %}
{{ task }}
{% endfor %}
上面的代码片段将打印出"tasks"数组中的每个"task"。
模板继承
H2o支持模板继承。继承允许您将大量重复代码提取出来,否则这些代码将在大多数模板中重复。
模板继承通过使用block和extends标签实现,子模板通过扩展其父模板。 注意事项:
- H2o模板只支持单继承(就像PHP一样),目前不支持深继承链。
来自Django文档的引用
...一个包含网站所有常用元素的基础骨架模板,并定义了子模板可以覆盖的块。
示例
base.html - 定义了我们页面的基本结构。
<html>
<head><title>{%block title %}This is a page title {% endblock %}</title></head>
<body>
<div id="content">
{% block content%}
<h1> Page title </h1>
<p> H2O template inheritance is a powerful tool </p>
{% endblock %}
</div>
<div id="sidebar">
{% block sidebar %}{% endblock %}
</div>
</body>
</html>
正如您所看到的,基础模板是一个典型的两列布局的网页。我们定义了两个块(content和sidebar)和所有页面都通用的HTML代码。
page.html - 定义了特定页面的模板。
{% extends 'base.html' %}
{% block content %}
<h1> extended page </h1>
<p> Body of extended page </p>
{% endblock %}
{% block sidebar %}
Sidebar contains use links.
{% endblock %}
page.html通过扩展base.html,允许我们覆盖在base.html中之前定义的任何块。
以下是一篇关于Django模板继承的优秀文章。如果您想了解H2o的模板继承系统,这是一个很好的起点,因为H2o的模板继承系统深受Django的影响。
继承的力量 是一篇很好的博客文章,解释了继承。
技巧
- 如果您发现在同一模板中有多个常用元素,将模板的这一部分放在基础模板中的一个
block中可能是一个好主意。 block提供了一个钩子,这对于JavaScript和CSS也非常有用。- 定义块时使用简短且独特的名称
配置
有各种配置模板引擎的选项。
<?php
$h2o = new H2o('template.tpl', array(
[option_name] => [option_value]
));
?>
加载器
加载器的名称或H2o_Loader的实例
使用文件加载器 [默认]
$template = new H2o('index.html', array('loader'=>'file');
高级设置 $loader ); ?>
使用字典加载器
如果您想从文件以外的资源加载模板,那么这将帮到您。H2o使用dict_loader()进行测试。
<?php
$loader = dict_loader(array(
"index.html" => 'Hello {{ person }}'
));
$template = new H2o('index.html', array('loader' => $loader'));
?>
搜索路径
默认:这将是你模板的基础路径
H2o使用此路径来加载额外的模板和扩展。
您可以显式设置搜索路径:
$template = new H2o('index.html', array('searchpath' => '/sites/common_templates'));
或者h2o将为您尝试找到搜索路径。
$template = new H2o('/sites/common_templates/index.html');
缓存
您可以定义H2o应使用哪种类型的缓存引擎(如果有的话)。将'cache'设置为false以禁用缓存。您可以在以下部分中了解更多关于性能和缓存的信息
使用文件缓存 [默认]
$template = new H2o('index.html', array('cache'=>'file'));
使用apc缓存
$template = new H2o('index.html', array('cache'=>'apc'));
使用memcache缓存
$template = new H2o('index.html', array('cache'=>'memcache'));
禁用缓存
模板 = new H2o('index.html', array('cache' => false));
缓存目录
当使用文件缓存时,您可以定义模板要缓存的目录。
它将把缓存的模板放在与正常模板相同的位置
模板 = new H2o('index.html', array('cache_dir' => '/tmp/cached_templates'));
缓存生存时间
"cache_ttl"指定缓存模板在重新编译前应该使用多长时间(默认值:1小时)。缓存扩展中捆绑的模板片段缓存将使用此默认ttl值。
模板 = new H2o('index.html', array('cache_ttl' => 3600));
性能和缓存
缓存可以提高性能,因为它跳过了无效模板解析的步骤。H2o缓存模板对象(模板的内部数据结构)和捆绑的缓存后端包括文件、APC和Memcache。
文件缓存
默认情况下,h2o使用文件缓存来存储模板对象。将h2o选项cache_dir更改为您想要存储模板缓存的位置(例如:/tmp)。
<?php
$template = new H2o('homepage.tpl', array(
'cache' => 'file',
'cache_dir' => '/tmp'
));
?>
APC缓存
APC是php的一个op-code和对象缓存扩展,其性能通常比纯文件缓存好10-30%。
<?php
$template = new h2o('homepage.tpl', array('cache' => 'apc'));
?>
Memcache
目前未实现
扩展H2o
已知问题
是的,h2o有这些问题。但是,如果您小心操作,这些不应该阻碍您的模板开发。深度继承问题对某些模板架构有点问题,但再次强调,如果您小心并有点创新,这不会对您造成太大的阻碍。
{{ block.super }}还不支持超过1层的继承,所以如果{{ block.super }}调用另一个{{ block.super }},它现在还不能工作。- 条件语句目前还不支持多个表达式或数学表达式,例如:
{% if something > 3 or something < 2 %}或{% if something + else > 12 %}这些可能在未来不会实现,除非有人勇于实现并贡献代码回h2o-php项目。
贡献者
- jlogsdon - 主要重构(进行中)和错误修复
- cyberklin - 添加了对任何上下文解析的过滤器支持
- idlesign - 添加了if_changed标签支持
- metropolis - 提高我们的测试覆盖率
- 以及许多人
致谢
H2o从以下项目借鉴了想法和/或概念
- Django模板 - Django网络开发框架。
- Ptemplates - Armin Ronacher的PHP版Django项目的宠物项目。
- Jinja - 受Django启发的Python模板。
特别感谢:Armin Ronacher,因为h2o的早期版本基于他的Ptemplates项目。
MIT许可证
版权所有 (c) 2008 Taylor Luk
在此特此授予任何获得本软件及其相关文档文件(以下简称“软件”)副本的任何人免费处理软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,以及允许向软件提供方提供软件的人这样做,前提是
上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。
软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定目的和不侵犯专利权的保证。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任承担责任,无论此类责任是基于合同、侵权或其他方式,是否源于、源于或与软件或软件的使用或其他交易有关。
