blesta / h2o
H2O 是一种用于 PHP 的标记语言
Requires
- php: >=7.1
- symfony/polyfill-php80: ~1.0
This package is auto-updated.
Last update: 2024-09-24 20:48:45 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
安装
-
在您的项目路径或 PHP 包含路径中下载并解压 h2o
示例文件结构设置
myawesome_app/ index.php templates/ index.html h2o/
-
在您的 PHP 语句中使用
require 'h2o/h2o.php'
来包含 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 bug tracker
- 查看 Google group 以进行 H2O 相关讨论
语法说明
变量
{{ variable }}
使用点 (.) 访问变量的属性
变量查找顺序
- 关联数组的键
- 数组索引
- 对象属性
- 对象方法调用
示例
在您的模板中
{{ person.name }}
在 PHP 中
<?php
$h2o = new H2o('template.tpl');
$person =array(
'name' => 'Peter Jackson', 'age' => 25
);
$h2o->render(compact('person'));
?>
假设您在 PHP 脚本中分配了一个 person 变量,以下变量标签将输出 Peter Jackson
过滤器
过滤器是变量修饰符,用于操作或格式化变量的值。一个过滤器通常看起来像这样 {{ person.name|capitalize }}
,变量后面的管道 ( | ) 符号将应用一个过滤器。
过滤器链
您可以将多个过滤器链接在一起,并使用管道 ( | ) 符号将它们分开。 {{ 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 为了可读性原因不使用冒号 ( : ) 字符来分隔参数,H2O 使用逗号 ( , ),这在逻辑上更为合理。
标签
{% 标签 %}
标签通常非常强大,它们控制逻辑流程或结构,迭代。有内联标签 {% inline_tag %}
或需要闭合标签的标签。例如:{% if condition %} ... {% endif %}
if 标签
if 标签评估一个变量或一个简单的表达式。当结果为真时,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 %}
上述代码将打印出所有任务。
模板继承
H2o 支持模板继承,它非常强大且易于理解。
模板继承通过块和 extends 标签实现,对于熟悉面向对象原则的程序员来说,这很简单。
引用自 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>
如您所见,基础模板是一个典型的两列布局的网页,我们定义了两个块(内容,侧边栏)以及所有页面通用的 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,现在您将能够覆盖之前定义的任何块。
有关 Django 中的模板继承的非常好文章,在模板继承方面,h2o 的工作方式完全相同。
继承的力量 是一篇很好的博客文章,解释了继承。
提示
- 如果您在模板中发现了许多公共元素,将这部分模板放入基础模板中的一个块中可能是一个好主意。
- 块提供了钩子,特别适用于 JavaScript 和 CSS,它们也非常有用。
- 在定义块时使用简短且独特的名称
配置
有多种选项可以设置模板系统,以满足您的需求。
<?php
$h2o = new H2o('template.tpl', array(
[option_name] => [option_value]
));
?>
loader
加载器的名称或 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'));
?>
searchpath
默认值:这将成为您模板的基础路径
H2o 使用此路径加载额外的模板和扩展。
您可以显式设置搜索路径
$template = new H2o('index.html', array('searchpath' => '/sites/common_templates'));
或者它会尝试为您找到搜索路径
$template = new H2o('/sites/common_templates/index.html');
cache
定义 H2o 需要使用的缓存引擎类型,设置为 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'));
禁用缓存
$template = new H2o('index.html', array('cache'=>false));
cache_dir
当使用文件缓存时,您可以定义模板应缓存的位置。
它将把缓存的模板放在与模板相同的位置
$template = new H2o('index.html', array('cache_dir'=>'/tmp/cached_templates'));
cache_ttl
模板缓存将存活多久(默认:1 小时),缓存的模板片段将使用此默认 ttl 值。
$template = 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扩展,它不仅提供了优化的代码缓存,还提供了一种强大的对象缓存,其性能通常比文件缓存快10-30%。
<?php
$template = new h2o('homepage.tpl', array('cache' => 'apc'));
?>
Memcache
目前尚未实现
扩展H2o
已知问题
实际上,这些情况非常非常罕见,所以不要让它阻止你尝试。
{{ block.super }}
在非常深的继承中不起作用,如果{{ block.super }}
调用了另一个{{ block.super }}
,那么它现在还不能工作。- 如果条件表达式还不支持多个表达式或数学运算,那么
{% if something > 3 or something < 2 %}
或{% if something + else > 12 %}
,我不认为我会实现这种类型的强制您构建更好的数据API。
贡献者
- jlogsdon - 主要重构(正在进行中)和错误修复
- cyberklin - 为任何上下文添加了过滤器支持
- idlesign - 添加了对if_changed标签的支持
- metropolis - 提高测试覆盖率
- 以及许多人
致谢
以下项目中的一些概念或想法被借鉴,h2o的早期版本是基于Ptemplates的代码库,因此感谢Armin Ronacher。
- Django模板 - Django Web开发框架。
- Ptemplates - Armin Ronacher的PHP版本的Django项目。
- Jinja - 受Django启发的Python模板。
MIT许可协议
版权所有 (c) 2008 Taylor Luk
特此授予任何人免费获得本软件及其相关文档副本(“软件”)的副本的权利,以不受限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向软件提供者提供软件的人这样做,前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
本软件按“原样”提供,不提供任何形式的保证,无论是明示的、暗示的,包括但不限于适销性、特定用途的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论是基于合同、侵权或其他方式,源于、因或与本软件或其使用或其他交易有关。