深入理解dedecms中的底层模版的含义

底层模板(Innertext),底层模板实际上就是对于有多条记录的模板输出,用户手工去指定单个记录的样式。
因为这个概念很虚线,那么这个地方还是通过实践去说明吧。
大家在标签测试的地方输入:

  • 这是使用默认底层模板的标签:
{dede:arclist row=10}
{/dede:arclist}
  • 这是手工指定底层模板的标签:
{dede:arclist row=5}
  <a href=’[field:arcurl/]’>[field:title /]</a> 点击:[field:click/] <br />
{/dede:arclist}

有一点需注意的是,在没有指定底层模板(Innettext)的时候,系统一般调用 templets/system 里的
相应该文件作为底层模板。

例如:

{dede:arclist row=10}{/dede:arclist}

它实际由系统默认调用了templets/system/part_arclist.htm 这文件的东西作为底层模板。这文件的内容是

<a href="[field:filename /]">[field:title /]</a>

那么

{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。

在此我简单介绍一下常用的 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’ 属性,:A、function 扩展;B、在Innertext中直接编程。

一、那么首先说
A、function 扩展:
在标记中,可以使用 {dede:标记名称 function=”函数名(@me,其它参数)” /}这样模式对标记的值进行处理,其中 @me 就是表示标记当前的值,最终获得的结果是这个函数返回的值。
大家不妨测试一下下面这个标签:{dede:global function="file_get_contents('http://www.baidu.com')" /}
下面再举个实用的例子(测试一下):

{dede:arclist row=5}
<a href='[field:arcurl/]'>[field:title /]</a>
[field:pubdate function="strftime('%y-%m-%d %H:%M',@me);"/]<br />
{/dede:arclist}

从实例中大家可以注意到,{dede:xx/}和[field:xxx/}都支持function扩展。实际上 [field:xxx/] 这种模式也是dede标签解析器解析的,所以作用一样,它只是把 dede 换成 field { 换成 [在这里,function 属性的 function 不仅是用PHP自带的,用自己定义的也行。不过要注意function的格式,自定义的function不能用echo这样的输出,而是返回一个字符串,这样就行了。
写好的函数放入 include/inc_channel_unit_functions.php 文件,因为dede核心都会调用这个文件。

这里举个简单的函数:
function testMyFunc(str){returnstr." 增加了我的东西哦!";}
在标签中使用:
{dede:global name='cfg_webname' function='testMyFunc(@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 不再显示当前站点名了,因为 @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 dede_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);
  }
@me = $restr;{/dede:global}

这代码是调用最新评论的。dede本身没有提供直接调用评论的标签,一般懂的人用loop标签调用,不过在本版中,新增的SQL标签会更简单。
在 DedeCms V5 中有一个标签{dede:sql sql="SQL语句 limit 记录"}底层模板{/dede:sql}
我现在改一下刚才调用评论的地方(测试代码):
{dede:sql sql="Select * From dede_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 的文档的。
由于这标记可能造成文件名不同步,我们系统后面增加了文档名批量修正功能,但为了防止忘记操作,建议建立栏目就设定好文档命名规则,以后不要经常更改。
一就是常用的模型,二是新出的模块,三是插件。
大家进到Dede管理后台“频道管理->内容模型管理”的地方可以看到:
分类信息专题普通文章图片集软件Flash产品这些都是内置的模型。大家也可以自己新建一个模型,有不少人问:Dedecms的文本存储在哪里呀?下面我一步一步的教大家建立一个用文本存储的文章模型。
首先“增加一个新模型”,建立好后“添加字段”,然后转向栏目管理的地方。建立好后转到栏目管理的地方新建一个顶级栏目,内容模型选刚才建好的那个。建立好栏目后,随意在那个栏目增加一篇文章。预览文章,会发生新增的模型显示的文档。现在再回到频道模型管理的地方,在新建的频道点击“模板”。
对于类同的模型,最好是把类同的模板作为当前模型的模板。如刚才建立的模型,实际上模板和普通文章模板是一样的。
关于字段的问题,在文档模板中字段是用{dede:field name='字段名'/}表示。例如在软件模型中文件类型 filetype 单行文本(varchar) 固化表单 [修改]
语言 language 单行文本(varchar) 固化表单 [修改]
软件类型 softtype 单行文本(varchar) 固化表单 [修改]
授权方式 accredit 单行文本(varchar) 固化表单 [修改]
操作系统 os 单行文本(varchar) 固化表单 [修改]
软件等级 softrank 整数类型 固化表单 [修改]
官方网址 officialurl 单行文本(varchar) 固化表单 [修改]
语言这字段就可以用 {dede:field name='language'/} 表示,此外,title , keywords,description 这些实际上主索引表的东西,刚才说模板时已经介绍过它的含义了。
有用户提过一个问题,就是关于自定义模型如何在表布表单中调整字段的顺序。Dedecms目前没有这选项,需要改的必须用 phpmyadmin 进入 it_channeltype 这个表。编辑 fieldset 这里的XML,调一下位置就行了。
此外大家要区别一下自动模型和系统模型的区别,系统模型是固化了的,要调整必须自己修改程序,
对于普通人是无法改的。不过这版本允许自行增加一些字段在里面。
因为这次讲座是个中级讲座,模型这块我就不太深入的讲解了,最后介绍一下插件和模块。
插件和模块DEDE增加新模型,必须一步到位,如果不用phpmyadmin,输入错误什么的,在后台修改不了。
插件在Dedecms中是就是一些小的实际的程序的集合,它可以简单的安装和删除,不过安装和删除仅去掉数据库的索引记录,并非进行真正的安装。
官方网前自带的插件有:
文件管理器站内新闻发布友情链接模块留言簿模块投票模块论坛扩展广告管理正则规则测试器随机模
板防采集木马扫描检测数据转换与导入实际上很多情况下单用插件是满足不了系统的需求的,实际上很多情况下单用插件是满足不了系统的需求的。因此Dedecms V5提出了模块的概念。
模块是对系统模型的一个补充,因为Dedecms的模板解析机制相对复杂,如果所有东西都依赖模型,就
结果只有一个:速度越来越慢。而使用模块就补充了这方面的不足。在 Dedecms V5 的菜单中“扩展模块”里放的就是Dedecms的模块。
模块文件是一个标准化的xml文件,它即包含了模块安装删除的数据,也偶包含了图片等二进制文件。有些人问我,为什么在DedeCms V5的安装包里没发现ask、group等目录?因为这些东西都封装起来了,如果你不安装它,是不会看到这些文件的,这样就能尽大限度满足一些站长想要功能多,一些想要功能实用的需求。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • 静态模板类: 类文件include/dedetag.class.php 这个文件是dedecms V5.3及之前版...
    亚讯阅读 532评论 0 1
  • 1、PHP语言的一大优势是跨平台,什么是跨平台?一、PHP基础: PHP的运行环境最优搭配为Apache+MySQ...
    __书山有路__阅读 1,483评论 0 15
  • 1安装不要测试数据! 2头尾分离,改成header.html,footer.html 用{dede:include...
    淡忘夏阅读 629评论 0 0
  • 为了使用模板标记不破坏文档的可读性,dedecms不像别的模板,有时会使用直接往模板插入PHP或类似PHP的代码,...
    亚讯阅读 939评论 0 0
  • 今天早上4点闹钟响了 4点15分才开始干活 听力用了45分钟 开始记单词还没记完 高等教育的要点还没有背 加油,明...
    吲哚说阅读 149评论 0 2