[转载]ECMall模板解析语法与机制

时间:2022-10-01 08:41:56

ECMall模板解析语法与机制

2011-05-22

在ECMall模板中,用"{"开头,以"}"结尾就构成一个标签单元,"{"紧接着的单词就是标签名。在标签单元中单词前含"$"(美元符)的为变量名。

资源引用

res标签

  • 功能:返回当前模板当前风格目录的url路径
  • 实例:{res file=css/ecmall.css}这个标签在模板编译后将变成http://商城域名/themes/default/styles/default,注意末尾没有"/",返回结果会随后台设置的主题变化

lib标签

  • 功能:返回javascript库的url路径
  • 实例:{lib file=ecmall.js}这个标签在模板编译后将变成http://商城域名/includes/libraries/javascript,注意末尾没有"/",返回结果不会随后台设置的主题变化

url标签

  • 功能:url解析器,可根据后台伪静态状态返回相应url等。
  • 说明:如果一个链接的目标页面需要伪静态功能,请使用该url标签,只有当后台开启伪静态并在.htaccess文件为目标页面设置了伪静态规则时url标签才能解析为静态url地址。
  • 实例:{url app=goods&id=$goods_id}解析后如果伪静态成功则返回"goods/19"

include标签:include 标签用于在当前模板中包含其它模板。当前模板中的变量在被包含的模板中可用。必须指定 file 属性,该属性指明模板资源的位置。实例:

1 {include file="header.html"}
2 {* body of template goes here *}
3 {include file="footer.html"}

模板变量

1. 模板保留变量

模板预置的一些系统变量,包括

  • $smarty.now 当前时刻对应的格林尼治时间戳,可以用{$smarty.now|date}显示当前日期时间,关于date变量调节器请看下文讲解。
  • $smarty.get $smarty.post $smarty.cookie $smarty.env $smarty.server $smarty.request $smarty.session同php的$_GET、$_POST、$_COOKIE、$_ENV、$_SEVER、$_REQUEST、$_SESSION变量。非程序人员如果需要了解请参考php相关手册了解。

2. 自定义变量

从php赋值变量。例如在调用该模板的app程序文件中进行赋值

1 //在app/default.app.php文件的index方法中$this->display前添加赋值语句
2 $this->assign('name''Tom'); //普通变量
3 $this->assign('user'array(
4     'name' => 'Tom',
5     'age'    => '28'
6 )); //数组变量
7 $this->display('index.html');

在themes/mall/default/index.html中显示变量

1 Hello,{$name},your age are {$user.age}!

在模板中赋值变量。assign标签,例在themes/mall/default/index.html中赋值变量

1 {assign var="name" value="Tom"}
2 Hello,{$firstname}!

3.模板上使用语言项

说明:为了满足多语言需求,ECMall采用了语言包机制,除挂件外,在模板、js文件中均使用语言项代替直接显示语言文字。

语言文件:语言文件位于商城根目录下的languages目录下,为当前语言建了一个目录,如果您用的是sc-gbk版本,则会有sc-gbk目录,进去之后就能看到属于前台控制器的全部语言文件了。除common.lang.php属于所有app外,每一个语言文件都只属于一个app(ECMall中称为控制器)。语言文件属于某个控制器而不属于某个模板,同一个模板如果被不同控制器调用将使用不同语言文件进行语言解析。

在默认控制器对应的语言文件default.lang.php添加语言项"test":

1 <?php
2 return array(
3     'hot_search' => '热门搜索',
4     ... ...
5     'best_recommended' => '精品推荐',
6     'test' => '测试语言项'
7 );
8 ?>

在index.html模板中显示语言项"test"

1 {$lang.test}

模板中还支持数组形式语言项,在默认控制器对应的语言文件default.lang.php添加语言项"test_array"

01 <?php
02 return array(
03     'hot_search' => '热门搜索',
04     ... ...
05     'best_recommended' => '精品推荐',
06     'test_array' => array(
07         'key1' => '测试数组语言项',
08         'key2' => '太好了'
09     ),
10 );
11 ?>

在index.html模板中显示语言项"test"

1 {$lang.test_array.key1}

4. 变量调节器

* escape

功能:提供各种编码功能。

参数:可选参数html、url、quotes、input、editor,缺省为html html:分别替换变量中的如下字符& < > "为其html实体代码,用于按原样输出html源代码。

  • url:如果该变量用于储存url地址,需要进行url编码
  • quotes:在单双引号字符前添加反斜杠
  • input:给输入框赋值时使用
  • editor:当显示通过文本编辑器录入的内容,需要用此参数

例如php赋值:

1 $this->assign('goods_name'"L'oreal/欧莱雅"  .  '"'   . "清润全日保湿乳霜"  .  '"'   . "50ml<br /><script>");
2 $this->display('index.tpl');

模板

1 {$goods_name}
2 {$goods_name|escape}
3 {$goods_name|escape:"html"}
4 {$goods_name|escape:"url"}
5 {$goods_name|escape:"quotes"}
6 {$goods_name|escape:"input"}
7 {$goods_name|escape:"editor"}

输出结果为

1 L'oreal/欧莱雅"清润全日保湿乳霜"50ml<br /><script>
2 L'oreal/欧莱雅"清润全日保湿乳霜"50ml<br /><script>
3 L'oreal/欧莱雅"清润全日保湿乳霜"50ml<br /><script>
4 L%27oreal%2F%E6%AC%A7%E8%8E%B1%E9%9B%85%22%E6%B8%85%E6%B6%A6%E5%85%A8%E6%97%A5%E4%BF
5 %9D%E6%B9%BF%E4%B9%B3%E9%9C%9C%2250ml%3Cbr+%2F%3E%3Cscript%3E
6 L\'oreal/欧莱雅\"清润全日保湿乳霜\"50ml<br /><script>
7 L'oreal/欧莱雅\"清润全日保湿乳霜\"50ml<br /><script>
8 L'oreal/欧莱雅"清润全日保湿乳霜"50ml<br /><script>

* nl2br

功能:将换行符替换成<br />

1 {$var|nl2br}

* default

功能:为变量设置一个默认值,当变量为空或者未分配的时候,将由默认值替代输出

1 {$var|default:"no title"}

* truncate

功能:字符串截取。从字符串开始处截取某长度的字符。默认会在末尾追加省略号。

1 {$content|truncate:20}

* strip_tags

功能:去除<和>标签,包括在<和>之间的任何内容。

1 {assign var="content" value="<b>文章内容</b>"}
2 {$content|strip_tags}

* price

功能:格式化价格。

1 {assign var="goods_price" value="123456"}
2 {$goods_price|price}

输出结果为:¥123,456.00

* date

功能:格式化本地时间和日期。

格式:{$var|date:format}

说明:变量$var必须是格林尼治标准时间,php中gmtime()和模板中$smarty.now得到的都是格林尼治标准时间,参数format可为simple、complete或自定义日期格式,缺省为simple。

1 {$smarty.now|date}
2 {$smarty.now|date:complete}
3 {$smarty.now|date:Y-m-d H:i}

输出结果为:

1 2010-12-01
2 2010-12-01 22:49:46
3 2010-12-01 22:49

* modifier

功能:调用php自定义函数。

格式:{$var|modifier:user_func}

流程控制标签

1. 条件判断(if,elseif,else)

模板中的 if 语句和 php 中的 if 语句一样灵活易用,并增加了几个特性以适宜模板引擎. if 必须于 /if 成对出现. 可以使用 else 和 elseif 子句. 可以使用以下条件修饰词:eq、ne/neq、gt、lt、lte/le、gte/ge、mod、not、==、!=、>、<、<=、>=、%、!使用这些修饰词时必须和变量或常量用空格格开.

多个条件之间用 and、or、&&、|| 连接,实现简单的逻辑运算

01 {if $name eq "Fred"}
02         Welcome Sir.
03 {elseif $name eq "Wilma"}
04         Welcome Ma'am.
05 {else}
06         Welcome, whatever you are.
07 {/if}
08  
09 {* 一个"或"逻辑的例子 *}
10 {if $name eq "Fred" or $name eq "Wilma"}
11         ...
12 {/if}
13  
14 {* 与上例等效 *}
15 {if $name == "Fred" || $name == "Wilma"}
16         ...
17 {/if}
18  
19 {* 下面的语法无效,条件修饰符必须由空格跟其他元素分开 *}
20 {if $name=="Fred" || $name=="Wilma"}
21         ...
22 {/if}
23  
24 {* 允许使用括号 *}
25 {if $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
26         ...
27 {/if}

2. 数组遍历(foreach,foreachelse)

foreach 用于处理简单数组(数组中的元素的类型一致)。foreach 必须和 /foreach 成对使用,且必须指定 from 和 item 属性。foreach 可以嵌套,但必须保证嵌套中的 foreach 名称唯一。foreachelse 语句在 from 变量没有值的时候被执行。

from 属性:指定被循环的数组,数组长度决定了循环的次数。item属性:单个循环项目的变量名,在循环内部使用。name 属性为可选属性,可以任意指定(字母、数字和下划线的组合)。

name 属性如果指定,foreach循环体内会自动生成如下变量

  • $smarty.foreach.foreach_name.index表示本次循环索引,从0开始递增的整数
  • $smarty.foreach.foreach_name.iteration表示本次的循环次数,从1开始递增的整数
  • $smarty.foreach.foreach_name.first表示是否是第一次循环
  • $smarty.foreach.foreach_name.last表示是否是最后一次循环
  • $smarty.foreach.foreach_name.show表示是否有数据
  • $smarty.foreach.foreach_name.total表示循环总次数,也可在循环体外使用
1 {* 该例将输出数组 $custid 中的所有元素的值 *}
2 {foreach from=$custid item=curr_id}
3         id: {$curr_id}<br />
4 {/foreach}

输出结果为:

1 id: 1000<br />
2 id: 1001<br />
3 id: 1002<br />
1 /* 在对应的控制器中赋值 */
2 $this->assign("contacts"array(
3     array("phone" => "1""fax" => "2""cell" => "3"),
4     array("phone" => "555-4444""fax" => "555-3333""cell" => "760-1234")
5 ));

模板代码:

1 {* 键就是数组的下标,请参看关于数组的解释 *}
2  
3 {foreach name=outer item=contact from=$contacts}
4 {foreach key=key item=item from=$contact}
5 {$key}: {$item}<br />
6 {/foreach}
7 {/foreach}

输出结果为:

1 phone: 1<br />
2 fax: 2<br />
3 cell: 3<br />
4 phone: 555-4444<br />
5 fax: 555-3333<br />
6 cell: 760-1234<br />
1 {* 最后一行不显示<br />标签 *}
2  
3 {foreach name=outer item=contact from=$contacts name=my_name}
4 {foreach key=key item=item from=$contact}
5 {$key}: {$item}{if !smarty.foreach.my_name.last}<br />{/if}
6 {/foreach}
7 {/foreach}

显示标签

* cycle

cycle 用于轮转使用一组值。该特性使得在表格中交替输出颜色或轮转使用数组中的值变得很容易。

格式:{cycle values="val1,val2,val3..."}

1 {foreach from=$data_list item=data}
2 <tr bgcolor="{cycle values="#eeeeee,#d0d0d0"}">
3 <td>{$data}</td>
4 </tr>
5 {/foreach}

输出结果为:

1 <tr bgcolor="#eeeeee">
2 <td>1</td>
3 </tr>
4 <tr bgcolor="#d0d0d0">
5 <td>2</td>
6 </tr>
7 <tr bgcolor="#eeeeee">
8 <td>3</td>
9 </tr>

* html_options

自定义函数 html_options 根据给定的数据创建选项组. 该函数可以指定哪些元素被选定. 要么必须指定 values 和 ouput 属性,要么指定 options 替代。

1 $this->assign('cust_ids'array(1000,1001,1002,1003));
2 $this->assign('cust_names'array('Joe Schmoe','Jack Smith','Jane Johnson','Carlie Brown'));
3 $this->assign('customer_id', 1001);

模板代码:

1 <select>
2         {html_options values=$cust_ids selected=$customer_id output=$cust_names}
3 </select>
1 $this->assign('cust_options'array(
2     1001 => 'Joe Schmoe',
3     1002 => 'Jack Smith',
4     1003 => 'Jane Johnson',
5     1004 => 'Charlie Brown'));
6 $this->assign('customer_id', 1001);

模板代码:

1 <select>
2         {html_options options=$cust_options selected=$customer_id}
3 </select>

实例1和实例2输出结果均为:

1 <select>
2         <option value="1000">Joe Schmoe</option>
3         <option value="1001" selected>Jack Smith</option>
4         <option value="1002">Jane Johnson</option>
5         <option value="1003">Carlie Brown</option>
6 </select>

* html_radios

自定义函数 html_radios 根据给定的数据创建单选按钮组。该函数可以指定哪个元素被选定。要么必须指定 values 和 ouput 属性,要么指定 options 替代。与html_options不同的是html_radios有一个checked属性。

* html_checkbox

自定义函数 html_checkboxes 根据给定的数据创建复选按钮组。该函数可以指定哪些元素被选定。 要么必须指定 values 和 ouput 属性,要么指定 options 替代.。与html_options不同的是html_checkbox有一个checked属性。

* sprintf

说明: 对变量进行格式化。

格式{sprintf lang=my_lang var1=my_var1 var2=my_var2 ...}

在语言文件添加语言项:

1 return array(
2     ... ...
3     'query_info' => '页面执行 %0.3f 秒, 查询 %d 次,在线 %d 人'
4 );

模板中显示:

1 {sprintf lang=query_info var1=query_time var2=query_count var3=query_user_count}

输出结果为:

1 页面执行 0.160 秒, 查询 3 次,在线 10 人

转载自:http://www.nowamagic.net/architecture/archt_TemplateSyntaxAndAnalysis.php

自己的练习:数组的里层外层同时为最后时,不输出换行符:

{foreach from=$res item=users_name name=outer}
{foreach from=$users_name item=content key=key name=inner}
[{$smarty.foreach.outer.index}]
[{$smarty.foreach.inner.index}]
{$key}:{$content}{if !($smarty.foreach.outer.last && $smarty.foreach.inner.last)}<br />{/if}

[转载]ECMall模板解析语法与机制的更多相关文章

  1. ECMALL模板解析机制&period;MVC架构分析及文件目录说明&period;二次开发指南手册&lpar;转&rpar;

    ECMALL模板解析语法与机制 http://www.nowamagic.net/architecture/archt_TemplateSyntaxAndAnalysis.php ECMALL模块开发 ...

  2. Discuz&excl;模板解析语法

    <!--{eval echo autostart("); }--> PHP中使用template()函数显示已存在模板 在Discuz!程序执行中可以通过 include tem ...

  3. ecmall模板语法

    ECMall的模板解析语法介绍 用"{"开头,以"}"结尾就构成一个标签单元 在 2011年07月19日 那天写的     已经有 19105 次阅读了 感谢  ...

  4. arTemplate解析语法

    模板解析语法 defaults.parser = function (code, options) { // var match = code.match(/([\w\$]*)(\b.*)/); // ...

  5. ECMall模板开发文档

    ECMall 模板开发文档 前 言 欢迎阅读 ECMall 模板制作教程,通过阅读本教程可快速上手 ECMall 模板的使用和制作. ECMall 模板制 作要求用户具备 XML . XHTML 和 ...

  6. 【Ecmall】ECMall2&period;x模板制作入门系列(认识ECMall模板)

    ECMall2.x模板制作入门系列之1(认识ECMall模板) 从ECMall2.0全新架构发布以来,随着版本的不断更新,ECMall已经逐渐走向一个稳定时期,是时候整理一些实用教程了.下面给大家带来 ...

  7. ECMall2&period;x模板制作入门系列之2(模板标签&sol;语法)

    ECMall2.x模板制作入门系列之2(模板标签/语法) 今天给大家带来一个模板语法的教程.希望能为ECMall模板制作者提供一份参考资料.如有问题.建议和意见,欢迎提出. 在ECMall模板中,用& ...

  8. vert&period;x学习(四),使用模板解析器ClassLoaderTemplateResolver

    在vert.x中使用模板解析,可以为我们带来很多方便.我这里学习了一下ClassLoaderTemplateResolver的简单使用.这次工程配置与上篇一样,不需要做任何多的配置.直接编写代码就可以 ...

  9. YAML 模板文件语法

    YAML 模板文件语法 默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建. 其 ...

随机推荐

  1. 在Windows上运行InfoPi

    一.安装Python Python官网的下载页面:  https://www.python.org/downloads/ 请下载Python 3.4或以上版本. (Python 3.5已不再支持Win ...

  2. 【转】ArcGIS 创建切片缓存方法工具总结

    ArcGIS 创建切片缓存方法工具总结 http://wenku.baidu.com/link?url=Bm8AkmcJBzfiyat9N_Me6vlfSHEDCC_D1qBk5IB4X4CIDeKI ...

  3. python中range函数和xrange函数有什么异同?

    http://ciniao.me/article.php?id=17 简单来说,range生成的是一个列表,而xrange生成的是一个生成器,而生成器在数组很大的时候能够比range更节省空间

  4. linux平台的office文档转pdf&lpar;程序员的菜&rpar;

    需要材料: 1.  Openoffice3.4(我是32位的centos,可以根据自己的系统下载指定的openoffice软件包) 下载地址:http://sourceforge.net/projec ...

  5. C&num;&lowbar;表达式目录树的应用

    使用表达式目录树实现两个不同类型的属性赋值: public class People { public int Age { get; set; } public string Name { get; ...

  6. Java数据结构面试题,输出 最后一个 出现次数为1的字符

    今天去面试,遇到一个数据结构题,给定一个字符串,输出 最后一个 出现次数为1的字符 回来研究了下,代码如下: package com.pine.interview.test; import java. ...

  7. 微信JSAPI分享朋友圈调试经验:invalid signature签名错误排查

    .invalid signature签名错误.建议按如下顺序检查: 1.确认签名算法正确,可用http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapi ...

  8. soapUI-DataGen

    1.1.1  DataGen 1.1.1.1 概述 – DataGen DataGen TestStep可用于生成要用作TestCases中的输入的数据,例如数字或日期序列,随机选择等.生成的数据可作 ...

  9. &lbrack;转&rsqb;SQL Server 中 Cast 与 Convert

    两者都用于:将一种数据类型的表达式转换为另一种数据类型的表达式. 安装有 Sql Server 2008 时可以浏览:ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.zh-C ...

  10. NFS 挂载 &plus; autofs

    NFS:Network File System RPC:Remote Procedure Call 一.手动挂载  (mount -t nfs 服务端IP:/共享目录  /本地挂载点) 客户端 1.安 ...