织梦标签学习 1
DedeCms标签主要分三种用途:
一种是通用的标签,就是在Dedecms模型核心都能调用的标签,也叫板块模板标签,在这里能测试到的也是这种标签;
第二种是列表标签,即是在栏目列表页使用的标签;
第三种是文档标签,对于文章模型而言,就是文章显示页的模板所使用的标签,这类标签通常是字段的不同
DedeCms 的模板有三大特点:
(1) DedeCms 模板特点之一:模板与程序完全分离,方便用户共享模板。
(2) DedeCms 模板特点之二:支持底层模板。
(3) DedeCms 模板特点之三:支持简单编程。
第一点
DedeCms 模板默认存放目录是在“Dede根/templets/default”文件夹,其中 templets 这目录名是固定的,一般建议不要更改, 如果你要保护自己的模板,可以在后台“系统管理->系统变量配置->其它设置”,找到“模板默认风格”这一项,把”default”改为其它名称,当然同时你要手工改动“templets/default”这文件夹为你指定的那个名称,对于你下载回来的模板,也可以把下载的模板的default目录改为其它名称,然后在系统变量中把“模板默认风格”改成这个名称,你就能使用下载回来的模板。
小提示:网上下载的模板一般不大可能100%模型的风格都制作的,很可能是只修改了几个常用的模型风格,因此使用下载回来的风格要先备份旧风格,然后用不覆盖的模式把旧风格里的文件追加进下载回来的模板文件中,以确保风格文件夹文件完整。
第二点
详细解析一下“底层模板”,它是很有用的东西
DedeCms 模板有一个很重要的概念,那就是底层模板(Innertext),底层模板实际上就是对于有多条记录的模板输出,用户手工去指定单个记录的样式。因为这个概念很抽象,需要通过实践去说明。
在织梦的后台,进入模板->全局标记测试,这里是织梦自带的测试标签的地方,在局部代码输入框中输入{dede:arclist row=10}{/dede:arclist} <hr>,结果是显示一般格式的文章列表结果,像这样:
·刽子手 - 马丁·泰勒 ·皇马重走巴萨一年前被翻盘之路? ·实况足球2008 转身的精髓 ·托尼的那些故事 ·英伦三岛十大外籍球员
但是如果使用“底层模板”输入:
{dede:arclist row=5} ◆ <a href=’[field:arcurl/]’>[field:title /]</a> 点击:[field:click/] <br /> {/dede:arclist}
结果就会输出格式良好的文章列表,而且是按章第二行代码的格式来控制的样式,像这样:
◆ 刽子手 - 马丁·泰勒 点击:53 ◆ 皇马重走巴萨一年前被翻盘之路? 点击:27 ◆ FM2008 会员原创阵型分享 点击:138 ◆ 新舰长:马蒂亚斯·费尔南德斯 点击:80 ◆ 爆棚网祝爱德华多生日快乐,早日 点击:76
所以,第二种使用方法就是使用底层模板的效果。
有一点需注意的是,在没有指定底层模板(Innettext)的时候,系统一般调用 templets/system 里的相应该文件作为底层模板
例如: {dede:arclist row=10}{/dede:arclist} 它实际由系统默认调用了 templets/system/part_arclist.htm 这文件的东西作为底层模板
这文件的内容是 ·<a href="[field:filename /]">[field:title /]</a><br/>
那么 {dede:arclist row=10}{/dede:arclist}
同于:
{dede:arclist row=10}
·<a href="[field:filename /]">[field:title /]</a><br/>
{/dede:arclist}
既能用短标记,也能直接定义样式,又不依赖数据库,这是dedecms模板和其它模板的最大区别。
在标记之间 [field:…/] 这些就是底层模板变量,这些标记一般也是属于 Dedecms 标签的模式,只是 { … } 符号改为了 [ … ],因此底层模板中的标签也是具有DedeCms标签的特性的,例如,在底层模板中使用 [field:global name=’cfg_webname’/] 同样可以表示全局变量$cfg_webname。这些底层模板变量大多数是数据库里的具体字段,当然有一部份做过处理
具体哪些标记可以用Innertext,那些不可以用,可以在http://www.dedecms.com/archives/templethelp/help/index.htm这页面参考。
下面简单介绍一下常用的 arclist 标记的底层模板字段及意义
arclist的底层模板字段实际上是对应相应该的主索引表的,在文档模板中则对应该主表和附加表,主表字段是一样的附加表的可以在模型里找
arclist常用的字段有:
ID(同 id),
title(标题),
color,
typeid(栏目ID),
description(摘要,同 info),
writer(作者),
shorttitle(短标题),
memberid(会员ID),
pubdate(发布时间),
click,
litpic(缩图图,同 picname),
typename(栏目名称),
arcurl(网址,同 filename),
typeurl(栏目网址)
stime(pubdate 的"0000-00-00"格式,等同于[field:pubdate function="strftime('%y-%m-%d',@me)"/]),
textlink(等同<a href='[field:arcurl /]'>[field:title/]</a>),
typelink(等同<a href='[field:arcurl /]'>[field:title/]</a>),
imglink(等同<a href='[field:arcurl /]'><img src='[field:picname/]' border='0'></a>),
image(等同<img src='[field:picname/]'>),
需注意的一个问题是:[field:标记名称/]这种写法是仅在底层模板中才用的,在文档模板中,字段是用 {dede:field name='title'/}这样形式表示的,不过在一种特殊的情况下,Innertext是无效的,就是指定了 runphp=’yes’ 属性,下面我就说一下关于在DedeCms标签进行简单编程的情况,这也是DedeCms标签的特点之一。
第三点
对DedeCms的模板标记进行扩展,除了直接修改程序以后,对于普通用户而言,最简单的方法就是对标签进行有限编程。
DedeCms里对标签进行编程扩展有两种可用模式:
A、function 扩展
B、在Innertext中直接编程
A、function 扩展
在标记中,可以使用 {dede:标记名称 function=”函数名(@me,其它参数)” /}这样模式对标记的值进行处理,其中 @me 就是表示标记当前的值,最终获得的结果是这个函数返回的值。
不妨测试一下下面这个标签: {dede:global function="file_get_contents('http://www.baidu.com')" /},结果就会输出百度的首页,这个函数的功能类似于PHP的同名函数。同样的,这个例子:
{dede:arclist row=5} ◆ <a href='[field:arcurl/]'>[field:title /]</a> [field:pubdate function="strftime('%Y-%-%d %H:%M',@me);"/]<br /> {/dede:arclist}
输出结果为:
◆ 英伦三岛十大外籍球员 2014-02-11 13:09 ◆ 托尼的那些故事 2014-02-11 13:09 ◆ 实况足球2008 转身的精髓 2014-02-11 13:09 ◆ 皇马重走巴萨一年前被翻 2014-02-11 12:52 ◆ 刽子手 - 马丁·泰勒 2014-02-11 12:51
注意一下问题{dede:xx/}和[field:xxx/}都支持function扩展,实际上 [field:xxx/] 这种模式也是dede标签解析器解析的,所以作用一样,它只是把 dede 换成 field { 换成 [
在这里,function 属性的 function 不仅是用PHP自带的,用自己定义的也行,不过要注意function的格式,自定义的function不能用echo这样的输出,而是返回一个字符串,这样就行了。写好的函数放入 include/extend.func.php 文件,因为dede核心都会调用这个文件。
在这个文件中加一个简单的测试函数:
//简单的测试函数 function testMyFun($str) { return $str." 增加了几个多余的字符!"; }
然后在测试标签的时候这样写:
{dede:global name='cfg_webname' function='testMyFun(@me)'/}
输出就会像这样:
织梦学习 增加了几个多余的字符!
用function扩展的好处是既可以增强系统的功能,又保持标记的简洁下面介绍的是另一种扩展 。
B、在Innertext中直接编程
这种方式和function编程的不同之处是,你可以把PHP代码直接写到标签的底层模板代码的地方,这里的PHP代码并不是完全意义的PHP代码,它必须符合Dede限定的格式,即是最终返回值返回到 @me 变量中,同样的是用 @me 表示标记的最初的值。
使用格式: {dede:标记名称 runphp=yes}PHP代码{/dede:标记名称}
大家测试一下这个代码:
{dede:global name='cfg_webname' runphp='yes'}
$baidu = file_get_contents(" http://www.baidu.com");
preg_match_all("/<title>(.*)<\/title>/isU",$baidu,$baidus);
@me = $baidus[1][0];
{/dede:global}
嗯,这里的 cfg_webname 不再显示当前站点 www.xiqb.com 名了,因为 @me = $baidus[1][0]; 改变了它的值。
在使用标记内编程或function扩展时,很多情况都可能会调用数据库,在V5版本中,DedeCms的数据库进行了改进,无论你新建多少个类的对象,最终打开的链接是只有一个的,并且会生成一个$dsql的全局数据库的变量,以往有些懂DedeCms数据库类的人在调用function扩展的时候,一般的做法是用$dsql=new DedeSql(false);这样新建一个类,实际上在V5中是不需要这样的,直接用 global $dsql;声明一下就能用,并且在函数体中不要自行关闭(即执行$dsql->close();)否则可能出错。
下面的代码是示例调用文章的最新评论:
{dede:global runphp='yes'} global $dsql; $restr = ''; $dsql->SetQuery("Select * From #@__feedback where ischeck=1 order by ID desc limit 5"); $dsql->Execute('feedback'); while($row = $dsql->GetArray('feedback')){ $restr .= "<a target='_blank' href='/plus/feedback.php?arcID={$row['aid']}&urlindex={$row['urlindex']}'>{$row['arctitle']}</a> -- ".cn_substr($row['msg'],200)."<hr />"; } @me = $restr; {/dede:global}
dede本身没有提供直接调用评论的标签,一般懂的人用loop标签调用,不过在本版中,新增的SQL标签会更简单,在 DedeCms V5 中有一个标签{dede:sql sql="SQL语句 limit 记录"}底层模板{/dede:sql}:
{dede:sql sql="Select * From #@__feedback where ischeck=1 order by ID desc limit 5"}
<a target='_blank' href='/plus/feedback.php?arcID=[field:aid/]&urlindex=[field:urlindex/]'>[field:arctitle/]</a> --[field:msg/]<hr />
{/dede:sql}
这结果应该和上面的代码是一样的。
为了补允调用全站数据的不足,V5中新增了 arcfulllist 标记,它的作用与 arclist 标记有点类同,不示不同的是 arcfulllist 里的文件名有时候可能是动态的,这因为它是使用搜索时用的那个简单索引表在专题文章、相关文章中默认都是使用arcfulllist 调用指定的 id 的文档的。由于这标记可能造成文件名不同步,系统后面增加了文档名批量修正功能,但为了防止忘记操作,建议建立栏目就设定好文档命名规则,以后不要经常更改。