blesta/h2o

H2O 是一种用于 PHP 的标记语言

0.8.0 2024-06-20 14:07 UTC

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
    1. 重大变更 默认情况下现在已启用 autoescape
    2. 改进的搜索路径和文件加载处理
    3. 改进了对 PHP 覆载对象的处理
    4. 大量修复了错误
  • 版本 0.3
    1. 支持国际化模板和翻译解析工具包
    2. 对上下文查找进行性能优化
    3. 修复了操作符解析

入门

获取 H2O

下载

使用 Git

git clone http://github.com/speedmax/h2o-php.git

使用 SVN

svn checkout http://h2o-template.googlecode.com/svn/trunk/ h2o

安装

  1. 在您的项目路径或 PHP 包含路径中下载并解压 h2o

    示例文件结构设置

    myawesome_app/
        index.php
        templates/
          index.html
        h2o/
    
  2. 在您的 PHP 语句中使用 require 'h2o/h2o.php' 来包含 h2o 库

  3. 以下是一个快速入门代码示例,以获得启动

  4. 如果您想探索,请查看示例和规范。

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

实用链接

语法说明

变量

{{ variable }}

使用点 (.) 访问变量的属性

变量查找顺序

  1. 关联数组的键
  2. 数组索引
  3. 对象属性
  4. 对象方法调用

示例

在您的模板中

{{ 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 }},变量后面的管道 ( | ) 符号将应用一个过滤器。

过滤器链

filter chaining
让我从 liquid 模板中引用一个图像

您可以将多个过滤器链接在一起,并使用管道 ( | ) 符号将它们分开。 {{ 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

特此授予任何人免费获得本软件及其相关文档副本(“软件”)的副本的权利,以不受限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向软件提供者提供软件的人这样做,前提是遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

本软件按“原样”提供,不提供任何形式的保证,无论是明示的、暗示的,包括但不限于适销性、特定用途的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论是基于合同、侵权或其他方式,源于、因或与本软件或其使用或其他交易有关。