模板制作教程:模板语法

模板引用

对于网站头部、尾部、页面侧边导航等公共部分可以引用过来,以免每个页面都去编写这些公共页面

模板引用是在本模板中引用公共模板,例如引用公共的头部和底部一样。

image.png

上图就是首页页面结构,实际上是把头部、中间、底部代码用三个模板文件分开,这样做的好处就是内页也可以调用head.html和foot.html


1、引用本目录下的xxx.html,当本目录不存在时会引用主目录下的xxx.html

{template "xxx.html"}


2、强制引用主目录下的xxx.html

{template "xxx.html", "/"}


3、强制引用用户目录下的xxx.html

{template "xxx.html", "member"}



基本语法

语法格式:{标签}

标签必须存在于{ }之间,模板中支持PHP标签


错误的标签写法

错误1、css混用

很多人喜欢把css之间写在页面里面,如下面所示:

这种写法是不规范的,需要将上面修改成:

也就是说将{}前后加一个空格便能区分开来

还可以改成:

{code}

{/code}

code标签可以把代码保护起来


错误2、js混用

把js写页面是很常见的,如下面所示:

这些写法同样是不规范的,需要修改成:

和上面一样为了区分{}标签


变量、常量、数组

一、变量

{$变量名}

例1、输出变量

{$test}表示输出test变量

例2、变量计算

{$test+1}表示test变量加了一个1,再输出


二、常量

{大写字母}

常量是固定的值,输出常量{SITE_URL}


三、数组

{$数组名[键1]}、{$数组名[键1][键2]}、...


四、简易数组

{$数组名.键1}、{$数组名.键2} (最多支持3级,最好直接输出)


判断语句

格式一

{if $模板变量 运算符 $模板变量}
   模板内容
{/if}

{if $aaa != $bbb}
   表示前面变量值不等于后面值
{/if}



格式二

{if $模板变量1 运算符 $模板变量}
   模板内容1
{else}
   模板内容2
{/if}

{if $aaa != $bbb}
   表示前面变量值不等于后面值
{else}
表示反之状态,也就是相等了
{/if}


格式三
{if $模板变量1 运算符 $模板变量2}
   模板内容1
{else if $模板变量1 运算符 $模板变量3}
   模板内容2
{else}
   模板内容3
{/if}

{if $aaa == $bbb}
   表示前面变量值不等于后面值
{elseif $aaa == $ccc}
表示前面变量值不等于后面值
{else}
表示除此之外
{/if}


格式四

{if $模板变量}
   表示变量存在值
{else}
   表示变量不存在值
{/if}

{if $aaa}
   表示变量存在值
{else}
表示反之状态,表示变量不存在值
{/if}


这里的运算符支持:> 、< 、>= 、<=、==、!= 、<> 

也可以使用php语法直接判断


Loop循环语句

主要用于数组循环,loop循环实质上是foreach循环


一、常规输出

格式一

{loop $模板数组 $数组键 $值变量}
   执行语句
{/loop}

格式二

{loop $模板数组 $值变量}
   执行语句
{/loop}



二、控制循环数量

array_slice() 函数在数组中根据条件取出一段值,并返回。

array_slice(array,start,length,preserve)
参数描述
array必需。规定数组。
start

必需。数值。规定取出元素的开始位置。 0 = 第一个元素。

如果该值设置为正数,则从前往后开始取。

如果该值设置为负数,则从后向前取 start 绝对值。 -2 意味着从数组的倒数第二个元素开始。

length

可选。数值。规定被返回数组的长度。

如果该值设置为整数,则返回该数量的元素。

如果该值设置为负数,则函数将在举例数组末端这么远的地方终止取出。

如果该值未设置,则返回从 start 参数设置的位置开始直到数组末端的所有元素。

preserve

可选。规定函数是保留键名还是重置键名。可能的值:

  • true - 保留键名

  • false - 默认。重置键名


实例:从第一个元素开启,只循环3次

{php $arr = array_slice($模板数组, 0, 3);}
{loop $arr $值变量}
   执行语句
{/loop}



三、输出循环计数值

计数变量从0开始

{loop $模板数组 $值变量}
   执行语句
   当前条数:{$key_值变量}
{/loop}
总条数:{$count_值变量}


实例:

 

{loop $arr $a}
当前条数:{$key_a+1}
判断第一条: {if $key_a == 0}表示第一条{/if}
判断最后一条: {if $count_a == $key_a+1}表示最后一条 {/if}
--v4.5.2及以上版本支持以下算法--
判断第一条: {if $is_first}表示第一条{/if}
判断最后一条: {if $is_last}表示最后一条 {/if}
{/loop}

总条数:{$count_a}


内容阅读数调用 dr_show_hits

阅读数统计方式是按访客访问一次计算一次,同一个访客刷新页面不加入计算(简单的防止刷次数)


1、show.html调用代码

阅读量代码:

{dr_show_hits($id)}

显示数字就表示成功了。

当内容的点击量均为0,不统计的情况下。

可能是你没有加载关键js文件:

https://www.xunruicms.com/doc/627.html

----------------

如果不想启用防止刷次数功能,一直统计的代码:

{dr_rp(dr_show_hits($id), "&m=hits&", "&m=hits&qx=1&")}



2、列表页循环体内调用代码:

{dr_show_hits($t.id)}

t.是循环体前缀,需要根据实际情况修改

--------------

列表不建议使用统计次数功能,会产生大量ajax请求,导致服务器资源消耗


3、首页循环体内调用代码:

{dr_show_hits($t.id, '', '这里填写模块的目录')}

t.是循环体前缀,需要根据实际情况修改

--------------

列表不建议使用统计次数功能,会产生大量ajax请求,导致服务器资源消耗


4、自定义BOM的显示代码:

{dr_show_hits($id, 'class属性', '这里填写模块的目录')}

例如:

0{dr_show_hits($id, 'my'.$id)}

版本v4.5.2以后不需要填写id参数,改进为:

0{dr_show_hits($id, 'my'.$id)}


-------------------------------------

如果没有jquery支撑的话,可以使用ajax模式来请求获取数量:

$.ajax({ 
type: "GET", 
url:"/index.php?s=api&c=module&siteid=1&app=news&m=hits&id=766", 
dataType: "jsonp", 
success: function(data){ if (data.code) { $(".dr_show_hits_766").html(data.msg); } else { dr_tips(0, data.msg); } } 
});


模板代码保护code标签/模板代码格式化


保护的作用是防止代码被模板引擎所解析,一般用在style的css和script的js语句范围,

代码语法如下:

{code}保护内容{/code}


将模板文件放到宸逸cms之前需要把原来的html文件的代码格式化一次,用这个工具:http://tool.chinaz.com/tools/jsformat.aspx


例如:

其中{alert就会被cms的模板引擎解析为cms的函数了,导致出现系统故障,那么可以改进为:

{code}

{/code}


还有种情况是在模板中直接写cms的标签,例如:

示例语法:{$title}

那么,正常情况下,{$title}会作为一个变量输出在网页中的,现实中需要直接原样显示,所以,这时候需要用到代码保护标签:

{code}示例语法:{$title}{/code}

{xunruicms_img_title}

到达原样显示的效果。

模板代码注释note标签

在宸逸模板中使用的注释标签语法:

模板代码注释内容不会被模板所显示,作为注释功能,代码语法如下:

{note}注释内容{/note}

这句不会出现在网页中,只会在模板里面显示,方便开发者设计模板


一般开发者使用习惯性的注释语法:


那么可以改进为:


模板语法错误

模板语法错误的时候,需要采用最传统的方式来排查,首先找到对应的模板文件,例如****.html

然后打开这个模板文件,一行行的排除法,删除全部宸逸的标签,每段排除法找问题

空循环标签empty

空循环标签empty 是针对循环标签查询结果为空时,执行的显示内容

语法格式:

将循环标签的结束标签,替换为:

{empty}
表示没有查询到数据显示的区域
{/empty}


1、module标签为例,当查询文章news模块没有数据时显示提示文字:

{module module=news num=10}
{$t.title} // 正常显示标题

{empty}
表示没有查询到数据显示的区域
{/empty}
完毕

当配合循环判断时,写在后方,正常默认情况是以{/module}结尾,现在直接改成 {empty}xxx{/empty} 结尾。


2、loop循环为例

{loop $aaa $bbb}
{$bbb} // 正常显示标题

{empty}
表示没有查询到数据显示的区域
{/empty}
完毕