65.9K
CodeProject 正在变化。 阅读更多。
Home

ROPE

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.50/5 (2投票s)

2003年12月10日

7分钟阅读

viewsIcon

37392

downloadIcon

208

运行时操作模板处理扩展

下载源代码 - 25.7 Kb

1. 什么是ROPE?
2. ROPE 有什么用?
3. ROPE 如何工作?
3.1 符号和引用
3.2 模板文件
3.3 全局符号表
4. ROPE 标签
4.1 <rope:insert sym="symname">
4.2 <rope:foreach in="<rope-array>" as="symname" [key="key_symname"]> ... <rope:next>
4.3 <rope:include file="filename">
4.4 <rope:if sym="symname"> ... [<rope:else>] ... <rope:endif>
4.5 <rope:set sym="symname" val="value">
4.6 <rope:domacro sym="symname">
4.7 <rope:defmacro sym="symname"> ... <rope:endmacro>
4.8 <rope:loadmacro sym="symname" file="filename">
5. ROPE 标签内属性
5.1 ropeit:isym="symname"
6. 查看“测试页面”并下载ROPE
 


1. 什么是ROPE?
ROPE(运行时操作模板处理扩展)是 PHP 编程的一个有用的补充工具。



2. ROPE 有什么用?
ROPE 的目的是使分离网站的静态和动态部分更加简单和灵活,从而区分程序员和设计师的工作。借助它,可以避免 PHP 例程中那些令人困惑的“在此处打印文档”的大量输出,这些输出混淆了程序的原始概念,使得设计和代码无法独立进行灵活更改。

重要提示:我无法在所有情况下声明ROPE 比传统方法更有用。我只有在长期使用后才敢这么说。无论如何,它给了我很大的帮助,这是可以理解的,因为它是我根据自己的需求开发的。



3. ROPE 如何工作?
ROPE 实际上是一个简单的文本处理器,用于插入、替换和忽略文本块。其操作需要以下元素:

3.1 符号和引用
ROPE 使用符号及其值,并通过<rope: ...> 标签和标签内属性中的引用进行操作。ROPE 像其他编程语言一样使用全局符号和局部符号。
全局符号 在整个模板中可见且可用,必须由调用者 PHP 例程在全局符号表中定义。
局部符号 是在模板处理期间运行时生成的(例如:<rope:set ...><rope:foreach ...> 等)。它们的可用性和可见性仅限于定义它们的块。
符号的解析方式与其他编程语言的常见方式相同,这意味着ROPE 尝试从最内部的块开始向外解析到全局命名空间。未定义的符号(解析不成功)不会导致失败,因为这与ROPE 的主要概念不一致(请参阅ROPE 标签)。
ROPE 的符号处理支持使用引用。在语法上,它通过在符号名称前加上“$”字符来表示(例如:如果符号“foo”的值是“bar”,那么表达式“sym="\$foo"”等同于表达式“sym="bar"”)。引用可以是多层的(例如:sym="$$$foo")。
ROPE 支持任意级别的嵌套多维数组。目前,数组只能由调用者 PHP 例程(在全局命名空间中!)定义(例如:搜索结果等)。<rope:set ...> 命令和其他生成局部符号的标签(例如:<rope:foreach ...>)只能定义基本符号,但可以在它们的属性中引用数组。
重要提示: ROPE 始终使用关联数组管理,因此禁止使用类似 PHP 的引号来表示键!(这是因为ROPE 的主要概念)。
例如,一个有效的数组表达式:<rope:set sym="Zaphod" val="$foo[\$bar[1][2]][42]">

3.2 模板文件
是一个简单的文本文件,包含输出的静态部分,嵌入的<rope: ...> 标签和ROPE 标签内属性。由于浏览器会忽略未定义的标签,因此强烈建议使用 HTML 文件,这样设计者就可以像编辑普通 HTML 文件一样编辑模板文件。

3.3 全局符号表
是一个关联数组,其中键是模板文件中使用的符号名称,值——出乎意料——是符号的值。

在构建符号表后,使用ROPE 的 PHP 例程调用:
  • 要么是函数rope_process( "<template_file_name>", <global_symbol_table> ),它处理模板文件并将结果输出到标准输出;
  • 要么是函数rope_process_buffer( "<template_file_name>", <global_symbol_table> ),它处理模板文件并将结果作为字符串返回。
    后者非常适合生成新闻通讯等。




4. ROPE 标签
在处理模板文件时,ROPE 的功能受到<rope: ...> 标签中指定的指令和说明的影响。实际上,可以通过这种方式“编程”模板文件。

4.1 <rope:insert sym="symname">
解析名为“symname”的符号,并用其值替换整个标签。如果解析不成功,则删除该标签。

4.2 <rope:foreach in="<rope-array>" as="symname" [key="key_symname"]> ... <rope:next>
一个可用于迭代访问ROPE 数组元素的标签。借助它,可以生成表格、列表、枚举以及几乎任何——甚至是多层次的——迭代项。
如果“in”属性中指定的符号是一个数组,其元素将逐步放入“as”属性中指定的局部符号,该符号在<rope:foreach...> 块内有效,并且该块将被迭代处理。在可选的“key”属性中指定的局部符号中,将访问实际的键(索引)。

4.3 <rope:include file="filename">
打开并包含名为“filename”的文件(如果存在)。

4.4 <rope:if sym="symname"> ... [<rope:else>] ... <rope:endif>
如果名为“symname”的符号已定义且其值不为 null,则该标签将被“if 分支”替换。否则,如果存在“else 分支”,则会插入该分支;如果不存在,则删除该标签。

4.5 <rope:set sym="symname" val="value">
将“value”分配给实际命名空间中名为“symname”的符号,如果它不存在则创建它。
重要提示:
它不能用于定义数组!(目前):)

4.6 <rope:domacro sym="symname">
如果已定义,则在标签所在位置处理名为“symname”的宏。该宏必须在局部或全局命名空间中定义为一个ROPE 符号。该宏可以由调用者 PHP 例程生成,也可以使用<rope:defmacro sym="symname"> ... <rope:endmacro> 标签在模板文件中定义,或者可以使用<rope:loadmacro sym="symname" file="filename"> 标签从文件加载。

4.7 <rope:defmacro sym="symname"> ... <rope:endmacro>
在实际命名空间中定义名为“symname”的宏。

4.8 <rope:loadmacro sym="symname" file="filename">
加载名为“filename”的文件(如果存在),并使用其内容定义一个名为“symname”的宏。

ROPE 中可以以任何方式和任何级别嵌套标签(唯一的限制是服务器的容量:)))。



5. ROPE 标签内属性
ROPE 允许在其他 HTML 或ROPE 标签中使用ROPE 标签,但 HTML 标准本身并未定义标签嵌套。因此,在另一个标签内的标签会破坏模板文件的静态视图,这严重违反了ROPE 的主要概念,即模板文件必须像普通 HTML 文件一样可编辑。为了解决这个问题,引入了“ROPE 标签内属性”的使用,它们的功能与上面提到的ROPE 标签完全相同,但根据 HTML 属性的语法规则,允许在其他标签内使用。

5.1 ropeit:isym="symname"
<rope:insert sym="symname"> 标签相同。
例如:
<SELECT name="myselect">
<rope:foreach in="results" as="res_array" key="res_cntr">
<option ropeit:isym="res_array[selected]" value="ropeit:isym="\$cntr"">
<rope:insert sym="res_array[text]">
</option>
<rope:next>
</SELECT>



目前只实现了"ropeit:isym" 这个ROPE 标签内属性,但如果需要且我能想出合适的语法,其他属性也会得到处理。由于时间的严重不足,这真的只会在迫不得已的情况下发生。 :((



6. 查看“测试页面”并下载ROPE
Licence
ROPE 的许可证非常简单,类似于 GPL,即您可以免费使用和分发它。如果您对其进行修改,则应记录下来。(如果您愿意通知我,我将不胜感激:))
如果您在网站上使用ROPE,您应该在您的网站上某处展示链接“Powered by ROPE”(http://www.reidea.hu/rope)——即使是用最小的字体。
即使您不这样做,我也无能为力。 :))


下载和测试



如果您发现 BUG 或任何问题
Róbert Koszorús
(+36)20 579 929 5
或发邮件给我
享受ROPE!!!
Robi
© . All rights reserved.