关于CMS的模板机制的一些讨论

在讨论一个模板机制是否合理之前,首先要清楚它的使用群体,将模板与代码分别,最重要的作用在于实现项目标MVC机制,对于Java、.Net等架构而言,最终展现层的模板都是用XML的语法设计的,使用类作为逻辑层、Page或Page类作为节制层,组件或Page作为展现层,最终的目的都是为了使美工与程序员之间更好的进行协同工作。对于一个计划得很好的项目,不管使用类似.Net的XML作风还是PHP的Smarty,其实都能实现这种机制,但对于开放式WEB体系(指有很多用户使用,并且开放各种调用接口的WEB系统),PHP的Smarty模板实现是极为不合理的,本文将具体讨论在开放式WEB系统中模板设计机制特色和Smarty在这种利用中的不足,并摸索一种更合理的模板机制。
    1、开放式系统,如CMS、网店程序、整站程序等,由于要斟酌到用户在不同处所的机动调用和用户上手的简单性,模板设计应该具有调用方式简单,容许使用参数节制实现类似“控件”的调用等特色。
    目前主流的CMS程序中,重要有两面种调用方式,一是相似Smarty的调用方式,一种是相似.Net的XML作风方式,但为了使调用不过于繁杂,国内的CMS一般都不习性直接用Smarty,像PHPCMS它使用Smarty作为了一种中间的架构,就是标签才是最终的调用语法,Smarty只是程序员自身为提供应懂Smarty使用的用户改动标签的一种中间逻辑,从MVC角度来看,可以以为它是一个节制层,这显然不是wo们使用Smarty的底本目标。
    使用相似xml语法的是DedeCms,它深受个人站长喜爱的,模板机制可以说是功不可没,下面列举一些常用语法的对照。
    (1) 变量调用
    Dede作风: {dede:global name='变量名称'/}
    帝国风格:     [!--变量名--]
    Smarty:   { $变量名 }
    由于普通变量的调用都比拟简略,所以没有什么可比性,但Dede模板机制与Smarty都是非常强盛的,调用变量时还能指定function,Dede的语法是
    {dede:global name='变量名称' function="函名(@me,参数列表)"/}
    Smarty的情势是:
    { $变量名|函数名:参数列表 }
    对照这两种机制,前者的函数是完成意义的自由调用,其中@me表现当前变量的值,后者是有限的调用,调用的函数必需预先在类里定义,这样用户在制造模板时不单要懂得PHP的运行机制,还要手上拿着一本Smarty的自定义函数语法手册,显然是第一种方式更简便。
    Smarty 中,对数组变量调用方法过多,也是一种缺点,因为程序员总是有个性的,有些有可能喜欢在模板里写 $var[xxx],有些人则喜欢$var.xxx这种“机动”对于新手来说,却是头痛的事情,还不如直接写<?php echo $row[xxx]; ?>来得容易懂得,当然对于大型项目,可以预先对语法进行限定,而开放式利用则是合适的。
    (2) 块调用
    在国内的CMS中,块调用的方式都是不完美的,主要原由是对“控件”、数组等调用不统一,在这里本人以为最合理的方式是类似.Net的数据绑定的情势,当然作为脚本语言PHP可以做得更机动,块调用重要通过映射的方式实现,如把某个模板标签映射为一个PHP的函数、区块等。
    Smarty 中,块调用的语法过于庞杂(繁杂程序已经超出PHP语法自身),因此并不合适作为MVC中的展现层的语法。
    (3) 编译与缓冲机制
    DedeCms、PHPCMS都有不同的缓冲机制,其主要目标是使一些不须要时刻转变的东西占用太多的系统资源,但两者的模板解释机制都不是编译式的,本人以为类似Smarty的编译式机制在而开放式WEB系统会更合适。
    编译式模板机制的原理是,模板引擎先把模板解析成PHP文件,然后再输出,这种方法如果不作一些限定,有一个很好的利益,是可以直接在模板里使用PHP语法,对于开放式WEB体系,这不失是让用户进行二次开发的不错的简略方式。
  
   2、综合用户使用群体等因素,开放式WEB体系的模板引擎应当依照如下的思路去设计:
   (1) 变量调用简单化,支撑函数处置
   要符合这条思路,很显然应当用{var name='变量名称' function="函名(@me,参数列表)"/}这种方法,或 { $变量名|函数名:参数列表 } 的参数列表中支撑使用自由参数调用的思路,斟酌到说明的庞杂性,如果用Smarty那种纯正则的方式说明是不大可能实现的,所以建议用类xml的语法。
   此外变量的调用最好不要调用数组,如果非要用数组的,建议程序员先将其转换成容易懂得的名称的globals变量。
   (2) 块调用统一化
   如果联合对数组的调用,块调用可以使用如下方式
   {block id='' mapping=''}
   循环体的样式代码{field /}
   {/block}
   mapping 可以指向数组array、数据库的循环游标database、函数调用function
   如果指向函数调用还可以使用其它属性来映射成函数的参数,从而实现直观的调用。
   (3) 块调用的简略化
   使用块调用时,还应该斟酌到{if varname='' value=''}{/if}这种条件语法,此外还应当考虑到block的嵌套问题,由于模板的语法是给美工看的,而不是程序员看的,所以本人建议这类语法最多支撑一重嵌套,而不要设计是无穷嵌套的可能性。
   (4) 编译机制
   建议这种模板机制是居于编译式的,而不是说明式,以实现更庞杂的扩大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值