26
2019.2

标签执行顺序

作者: POPASP
标签执行解析顺序 POPASP模板引擎的标签解析是有先后顺序的,它的执行顺序如下: | 标签 | 格式 | 作用 | 举例 | 可否自身嵌套 | 可否嵌套标签 | ------------- | ------------- | | block | `` | 模板继承 | `{extend file="..."}` | 否 | 包含块标签时从`开始` | | include | `{include file="文件路径"}` | 包含文件 | `{include file="public/header"}` | 否 | 否| | layout | `{__CONTENT__}` | 模板布局 | `{__CONTENT__}` | 否 | 否| | escape | `代码块` | 原样输出 | <`!--{escape}-->{=now()}` | 否 | 否| | nocache | `代码块` | 局部不缓存 | `{=now()}` | 否 | 否| | 常量替换 | `__URL__`等替换 | 常量替换 | `` | 否 | 否 | | 导入文件 | `{css href="..."}` `{js href="..."}` | 导入文件 | 略 | 否 | 否 | | flow | `代码块` | 块标签 | `{=now()}` | 是 | 是| | 一般变量赋值 | `{:$varName=expression}` | 变量赋值 | `{:$varName="popasp.com"}` | 否 | 否| | 三元变量赋值 |`{:$varName= contion ? true_value : false_value}` | 三元变量赋值 | `{:$ret= 2>1 ? "正确" : "错误"}` | 否 | 否| | 二元变量赋值 |`{:$varName= contion ? true_value }` | 二元变量赋值 | `{:$ret= 1>2 ? "错误" }` | 否 | 否| | 一般表达式运算 | {:expression} | 表达式运算 | `{:Call POP_MVC.file_put_contents("./__popasp__.txt","Hello POPASP")}` | 否 | 否| | if块标签 | `condition成立时的结果condition1成立时的结果condition2成立时的结果以上都不成立时的结果` | 判断语句 | `过关失败 `| 是 | 是| | select块标签 | `语句块1语句块2...语句块N其他语句块` | 条件分支 | 略 | 是 | 是| | loopdb块标签 | `循环体` | 将数据库取出的数据块进行循环展示| `[@Title]
` | 是 | 是 | | looparr块标签 | `代码块` | 将数组进行循环展示 | `
` | 是 | 是| | loopfile块标签 | `代码块` | 将文件夹中的文件或目录进行循环展示 | `[@path]
` | 否 | 是| | loopfield块标签 | `循环体` | 输出键值对| `:
` | 是 | 是 | | 三元输出 |`{= condition ? true_value : false_value}` | 三元输出 | `{=$status?"开启":"关闭"}` | 否 | 否| | 二元输出 |`{= condition ? true_value}` | 二元输出 | `{=$isTop?"头条"}` | 否 | 否| | 表达式输出 |`{=expression}` | 表达式输出 | `{=POP_MVC.String.Random(4,0)}`| 否 | 否| | 默认值输出 |{变量|default="默认值"} | isNul(变量)为真,则输出默认值 | {$name|default="name为空值"}| 否 | 否| | 变量/属性输出 | `{$变量名}` `[@属性值]` |变量或属性输出 | `{$name}`| 否 | 否| 在前面的章节中我们讲到了上述大多数标签,未讲标签下面章节逐个展开。 POPASP中的模板引擎采用的是标签替换法,不同于PHP的模板引擎,PHP的模板引擎一般做法是将模板文件先解析成可执行PHP文件,然后再使用动态include执行该PHP文件。由于ASP没有像PHP那样的动态include,所以没法像PHP那样设计模板引擎,它只能采用标签替换的方法,这也是标签有执行顺序的原因。大家要深刻认识二者本质的不同,才能在使用中不会产生困惑。 在前面的讲解中,我们没有遇到执行顺序的先后问题,是由于POPASP的标签替换符合一般的页面解析顺序,如果像ASP原生那样随意表达的话,则势必出错。同时,我们要正视模板与ASP原生代码块的不同,模板的目的是为了展示,ASP原生代码块更多的是为了功能实现。展示页面有一定的规律可循,这也是POPASP模板引擎能够成功的原因。 模板引擎设计思路是先分析页面用到了啊些标签,然后依标签执行顺序表中的顺序进行解析。解析到块标签内部后,会将块标签中的内部再按执行顺序再次解析,太多的标签嵌套则不利于模板解析,会降低解析速度。在标签设计上,作者也设计得越深的标签定界符越麻烦,这也是一种善意的提醒。 举例 ```brush:html 1:{:$temp1=0} 2:{:$temp2=$temp1>0?1:0} 3:{:$temp3=$temp2} ``` 上面这组表达式赋值,期望执行顺序是1>2>3,但是根据表中执行顺序我们知道,真正的执行顺序其实为1>3>2,所以这样永远得不到理想值。同时我们要明白,在模板中我们不宜写太多的逻辑关系与太多的赋值表达式,正确做法是应该将这些写入控制器中,充分发挥控制器的头脑作用。