DedeCMS教程DedeCMS二次开发.docx
《DedeCMS教程DedeCMS二次开发.docx》由会员分享,可在线阅读,更多相关《DedeCMS教程DedeCMS二次开发.docx(72页珍藏版)》请在冰豆网上搜索。
![DedeCMS教程DedeCMS二次开发.docx](https://file1.bdocx.com/fileroot1/2023-2/3/3ded29d7-c6f0-486c-9c0b-dee3e627a13b/3ded29d7-c6f0-486c-9c0b-dee3e627a13b1.gif)
DedeCMS教程DedeCMS二次开发
DedeCMSV5.3二次开发
希望对大家有用
一、模板篇
1.1、主要模板文件与功能说明
DedeCMS系统的模板是非固定的,用户可以在新建栏目时可以自行选择栏目模板,官方仅提供最基本的默认模板,即是内置系统模型的各个模板,由于DedeCMS支持自定义频道模型,用户自定义新频道模型后,还需要按该模型的字段设计一套新的模板,此外,DedeCMS也支持使用风格的形式使用模板,默认风格是default,它表示系统默认使用{cmspath}/templets/default这个文件夹的模板,如果你下载了一套新的模板,你可以不必要删除default原有的文件,把下载的模板文件夹命名你想要的风格名称,如style2等,然后在后台修改了默认的模板风格名称为style2,那系统将使用{cmspath}/templets/style2这文件当作默认模板,但是若你手工指定了栏目模板的位置,则后台参数风格的定义无效。
一、概念,设计和使用模板,必须要理解下面几个概念
1、板块(封面)模板:
指网站主页或比较重要的栏目封面频道使用的模板,一般用“index_识别ID.htm”命名,此外,用户单独定义的单个页面或自定义标记,也可选是否支持板块模板标记,如果支持,系统会用板块模板标记引擎去解析后才输出内容或生成特定的文件。
2、列表模板:
指网站某个栏目的所有文章列表的模板,一般用“list_识别ID.htm”命名。
3、档案模板:
表示文档查看页的模板,如文章模板,一般用“article_识别ID.htm”命名。
4、其它模板:
一般系统常规包含的模板有:
主页模板、搜索模板、RSS、JS编译功能模板等,此外用户也可以自定义一个模板创建为任意文件。
二、命名,DedeCMS模板默认命名规则如下
1、模板保存位置:
模板目录:
{cmspath}/templets/样式名称(英文,默认为default,其中system为系统底层模板,plus为插件使用的模板)/具体功能模板文件}
2、模板文件命名规范:
(1)index_识别ID.htm:
表示板块(栏目封面)模板;
(2)list_识别ID.htm:
表示栏目列表模板;
(3)article_识别ID.htm:
表示内容查看页(文档模板,包括专题查看页);
(4)search.htm:
搜索结果列表模板;
(5)index.htm:
主页模板;
注解:
[识别ID]可以在“频道模型管理”的地方获得,当然,你也可以在“频道模型管理”的地方确定某个频道的模板命名。
例:
list_image.htm表示是就是内容类型为图片集的栏目默认列表模板。
article_article.htm表示的是文章查看页模板。
三、其它模板说明
1、默认底层模板
位置:
{cmspath}/templets/system
功能:
在没有指定标记的默认底层模板的时候,系统将自动调用这个文件夹的相应文件作为底层模板。
2、插件目录模板
位置:
{cmspath}/templets/plus
功能:
评论、友情链接、RSS地图等模板。
3、会员后台模板
位置:
{cmspath}/member/templets
功能:
会员后台的模板。
四、二次开发
在V5.3中已经将标签开发分离出来,您可以通过后台[模板]-[标签代码管理],点击“新增加一个新的标签”来创建一个自己的标签,标签文件名为:
标签名.lib.php
接口函数定义为:
functionlib_标签名(&$ctag,&$refObj),返回值是结果字符串
修改标签时为了防止出错,您也可以修改它的名称(同时修改文件名和函数名),这样等同继承了原来标签的代码建立一个新的标签。
1.2、模板标签语法简介
织梦的模板标签类似于XML格式,所有的模板都含有定界符,默认情况下是{dede:
*}和{/dede:
*},“*”代表模板标记名称。
一般情况下{dede:
*}和{/dede:
*}是成对出现的,例如:
例1-1:
1{dede:
arclistflag='h'limit='0,1'}
2
arcurl/]">[field:
title/]
3
[field:
description/]...arcurl/]">[查看全文]
4{/dede:
arclist}
上面的{dede:
arclist}和{/dede:
arclist}成对出现在模板文件中,并且在两个标签当中包含了底层模板(innertext)。
底层模板(Innertext),底层模板实际上就是对于有多条记录的模板输出,用户手工去指定单个记录的样式。
标签还有一类出现形式是{dede:
*/},通常以这种形式出现都是输出变量、或者不含底层模板的内容。
例如:
1-2
{dede:
global.cfg_webname/}
{dede:
arclistflag='h'limit='0,1'/}
如果用户没有指定单个记录的样式,系统部分标签都含有默认的底层模板,具体可以查看{cmapath}/templets/system/文件夹下面的文件,这里面都是系统的底层模板文件。
注释
织梦标签的模板注释非常灵活,可以通过标签后面的commet属性进行赋值。
例1-3:
1{dede:
arclistflag='h'limit='0,1'commet='调用头条的第一篇内容'}
2
arcurlcommet="这是文章链接标签"/]">[field:
titlecommet="这是文章标题标签"/]
3
[field:
descriptioncommet="这是摘要标签"/]...arcurlcommet="这是文章链接标签"/]">[查看全文]
4{/dede:
arclist}
在模板引擎将上述标签解析为html的时候,commet的内容是被忽略掉不去解析的,用户在阅读模板标记的时候可以更好的理解标签的意义。
函数
每一个织梦的标签都可以使用自定义函数对其进行扩展,自定义函数内容主要用于对当前标签输出内容进行处理。
例1-4:
{dede:
标记名称function='youfunction("参数一","参数二","@me")'/}
其中@me用于表示当前标记的值,其它参数由你的函数决定是否存在,例如:
{dede:
field.pubdatefunction='strftime("%Y-%m-%d%H:
%M:
%S","@me")'/}
属性
模板标签的属性,决定了模板标记输出的形式,例如arclist标签主要功能是列出文档列表,但列出什么内容、按照什么方式进行排序等取决于模板标签的属性。
在织梦的模板标签说明中含有各个模板的标签属性可以详细查阅。
可以查看例1-1中的flag='h'limit='0,1',这里flag和limit是标签的相关属性,通过手册可以查阅属性的介绍。
如果模板标签如果没有列出属性,系统有默认属性值,用户可以参考模板标签说明查看默认属性。
编程
织梦模板很方便的一个地方就是支持简单的模板编程。
格式为:
1{dede:
tagnamerunphp='yes'}
2$aaa=@me;
3@me="123456";
4{/dede:
tagname}
@me表示这个标记本身的值,因此标记内编程是不能使用echo之类的语句的,只能把所有返回值传递给@me。
此外由于程序代码占用了底层模板InnerText的内容,因此需编程的标记只能使用默认的InnerText。
2、代码篇
2.1、common.func.php公用函数
获得当前的脚本网址
functionGetCurUrl()
返回格林威治标准时间
functionMyDate($format='Y-m-dH:
i:
s',$timest=0)
把全角数字转为半角
functionGetAlabNum($fnum)
把含HTML的内容转为纯text
functionHtml2Text($str,$r=0)
把文本转HTML
functionText2Html($txt)
输出Ajax头
functionAjaxHead()
中文截取2,单字节截取模式
functioncn_substr($str,$slen,$startdd=0)
把标准时间转为Unix时间戳
functionGetMkTime($dtime)
获得一个0000-00-0000:
00:
00标准格式的时间
functionGetDateTimeMk($mktime)
获得一个0000-00-00标准格式的日期
functionGetDateMk($mktime)
获得用户IP
functionGetIP()
获取拼音以gbk编码为准
functionGetPinyin($str,$ishead=0,$isclose=1)
dedecms通用消息提示框
functionShowMsg($msg,$gourl,$onlymsg=0,$limittime=0)
保存一个cookie
functionPutCookie($key,$value,$kptime=0,$pa="/")
删除一个cookie
functionDropCookie($key)
获取cookie
functionGetCookie($key)
获取验证码
functionGetCkVdValue()
过滤前台用户输入的文本内容
//$rptype=0表示仅替换html标记
//$rptype=1表示替换html标记同时去除连续空白字符
//$rptype=2表示替换html标记同时去除所有空白字符
//$rptype=-1表示仅替换html危险的标记
functionHtmlReplace($str,$rptype=0)
获得某文档的所有tag
functionGetTags($aid)
过滤用于搜索的字符串
functionFilterSearch($keyword)
处理禁用HTML但允许换行的内容
functionTrimMsg($msg)
获取单篇文档信息
functionGetOneArchive($aid)
2.2、dedesql.class.php数据库类
系统会自动载入dedesql.class.php文件,并用
$dsql=$db=newDedeSql(false);
进行初始化数据库连接,因此在工程所有文件中均不需要单独初始化这个类,可直接用$dsql或$db进行操作,为了防止错误,操作完后不必关闭数据库。
常用的方法:
1、执行一个非查询类型的SQL语句,如insert、create、update等
$rs=$db->ExecuteNoneQuery($sql);
返回值为是否执行成功。
2、执行一个非查询类型的SQL语句,并返回成功记录数
$rs=$db->ExecuteNoneQuery2($sql);
与上面相比,它返回的是影响的记录数,而不是布尔值
3、返回单个记录
$arr=$db->GetOne($sql);
$dsql如果不带limit,系统会自动加上limit0,1
4、执行条件查询语句
1$db->SetQuery($dsql);
2$db->Execute();
3while($arr=$db->GetArray())
4{
5}
可以简化为:
6$db->Execute('me',$dsql);
7while($arr=$db->GetArray())
8{
9}
'me'为记录集游标,用于区分不同的查询,如:
10$db->Execute('me',$dsql);
11while($arr=$db->GetArray())
12{
13$db->Execute('2',$dsql2);
14while($arr2=$db->GetArray())
15{
16
17}
18}
像这种情况必须指定一个值区分默认的'me'参数,否则会出错
$db->GetArray($rsid,$acctype)参数
$rsid="me"
$acctype=MYSQL_ASSOC
在查询游标中读取数据还可以用
$db->GetObject($rsid="me");
返回的结果是用类结构表示的值。
5、获取上一个插入的自动递增主键id值
$db->GetLastID();
6、获得查询的总记录数
$db->GetTotalRow($rsid="me")
7、获得MySql的版本号
$db->GetVersion($isformat=true)
默认的情况下会转换成x.xx形式浮点数
8、析放某查询的资源
$db->FreeResult($rsid="me");
9、在数据库中是否存在某数据表
$db->IsTable($tbname)
10、重新选择要操作的数据库
$db->SelectDB($dbname);
11、获得数据库连接标识
$db->linkID
获得这个连接标识后,可以直接用mysql相关函数进行数据库操作
在非不得已的情况,项目中一般不使用这个变量。
2.3、datalistcp.class.php动态分页类
类文件
include/datalistcp.class.php
适用范围:
数据量不大的数据分页
使用方法:
1$dl=newDataListCP();
2$dl->pageSize=25;//设定每页显示记录数(默认25条)
3$dl->SetParameter($key,$value);//设定get字符串的变量
//这两句的顺序不能更换
4$dl->SetTemplate($tplfile);?
//载入模板
5$dl->SetSource($sql);?
//设定查询SQL
6
7$dl->Display();?
//显示
模板
8{dede:
datalist}
9
{field.fieldname1/}-{field.fieldname2/}...10{/dede:
datalist}
11
12{tag:
pagelistlistitem="info,index,end,pre,next,pageno"listsize="5"/}
listitem、listsize是可选属性
如果需要自定义datalist相关属性,可以继续本类来创建一个新类,只需改变GetArcList($atts,$refObj='',$fields=array())方法即可。
2.4、dedetag.class.php静态模板类
类文件
include/dedetag.class.php
这个文件是dedecmsV5.3及之前版本使用的主要的模板类,它是解析式模板类,并非编译式的(区别是前者通过获得标签位置进行内容替换,后者是直接解析式PHP代码,二次执行)
一、模板语法
织梦模板引擎是一种使用XML名字空间形式的模板解析器,使用织梦解析器解析模板的最大好处是可以轻松的制定标记的属性,感觉上就像在用HTML一样,使模板代码十分直观灵活,新版的织梦模板引擎不单能实现模板的解析还能分析模板里错误的标记。
1、织梦模板引擎的代码样式有如下几种形式:
{dede:
标记名称属性='值'/}
{dede:
标记名称属性='值'}{/dede:
标记名称}
{dede:
标记名称属性='值'}自定义样式模板(InnerText){/dede:
标记名称}
提示:
如果使用带底层模板的标记,必须严格用{dede:
标记名称属性='值'}{/dede:
标记名称}这种格式,否则会报错。
2、织梦模板引擎内置有多个系统标记,这些系统标记在任何场合都是能直接使用的。
(1)global标记,表示获取一个外部变量,除了数据库密码之外,能调用系统的任何配置参数,形式为:
{dede:
globalname='变量名称'}{/dede:
global}
或
{dede:
globalname='变量名称'/}
其中变量名称不能加$符号,如变量$cfg_cmspath,应该写成{dede:
globalname='cfg_cmspath'/}。
(2)foreach用来输出一个数组,形式为:
{dede:
foreacharray='数组名称'}[field:
key/][field:
value/]{/dede:
foreach}
(3)include引入一个文件,形式为:
{dede:
includefile='文件名称'ismake='是否为dede板块模板(yes/no)'/}
对文件的搜索路径为顺序为:
绝对路径、include文件夹,CMS安装目录,CMS主模板目录
3、织梦标记允许在任何标记中使用函数对得到的值进行处理,形式为:
{dede:
标记名称属性='值'function='youfunction("参数一","参数二","@me")'/}
其中@me用于表示当前标记的值,其它参数由你的函数决定是否存在,例如:
{dede:
fieldname='pubdate'function='strftime("%Y-%m-%d%H:
%M:
%S","@me")'/}
4、织梦标记允许有限的编程扩展。
格式为:
{dede:
tagnamerunphp='yes'}
$aaa=@me;
@me="123456";
{/dede:
tagname}
@me表示这个标记本身的值,因此标记内编程是不能使用echo之类的语句的,只能把所有返回值传递给@me。
此外由于程序代码占用了底层模板InnerText的内容,因此需编程的标记只能使用默认的InnerText。
二、解析方式
在dedetag.class.php里面有四个类
classDedeAttribute属性结构表述
classDedeAttributeParse属性解析器
classDedeTag标签结构表述
classDedeTagParse标签解析器
使用解析类解析模板时一般经过下面的步骤
1、初始化:
$dtp=newDedeTagParse();
2、载入模板/模板字符串:
$dtp->LoadTemplate(模板文件(绝对路径));//会生成缓存,第二次不需解析模板
或$dtp->LoadSource(字符串);
3、给标签赋值
foreach($dtp->CTagsas$tid=>$ctag){
//判断ctag的名称和属性,并给赋不同的值,通常用函数处理
if($ctag->GetName=='mytag')$dtp->Assign($tid,mytagvalue($ctag));}
在上面例子中,直接把名称为mytag的标签转交给mytagvalue函数处理,mytagvalue里判断$ctag的各个属性,返回不同内容即可。
在V5.3版本中,通常除了field、list等专用标签之外,凡arc.*开头的类解析的文件,标签都是对应该include/taglib的源码的,这个由系统进行了自动的映射。
4、显示或保存为HTML
$dtp->display();
或
$dtp->SaveTo(静态文件名);
对于二次开发人员而言,不大需要知道dedecms模板具体解析方式,不过应该十分清楚CTag这个类的结构,从而判断标签不同属性进行处理。
1classDedeTag
2{
3var$IsReplace=FALSE;//标记是否已被替代,供解析器使用
4var$TagName="";//标记名称
5var$InnerText="";//标记之间的文本
6var$StartPos=0;//标记起始位置
7var$EndPos=0;//标记结束位置
8var$CAttribute="";//标记属性描述,即是classDedeAttribute
9var$TagValue="";//标记的值
10var$TagID=0;
11
12//获取标记的名称和值
13functionGetName()
14{
15returnstrtolower($this->TagName);
16}
17
18functionGetValue()
19{
20return$this->TagValue;
21}
22
23//下面两个成员函数仅是为了兼容旧版
24functionGetTagName()
25{
26returnstrtolower($this->TagName);
27}
28
29functionGetTagValue()
30{
31return$this->TagValue;
32}
33
34//获取标记的指定属性
35functionIsAttribute($str)
36{
37return$this->CAttribute->IsAttribute($str);
38}
39
40functionGetAttribute($str)
41{
42return$this->CAttribute->GetAtt($str);
43}
44
45functionGetAtt($str)
46{
47return$this->CAttribute->GetAtt($str);
48}
49
50functionGetInnerText()
51{
52return$this->InnerText;
53}
54}
2.5、dedetemplate.class.php动态模板类
核心类文件
include/dedetemplate.class.php
用途:
用于非核心模块的动态页面或列表页的模板解析,如:
member/content_list.php,通常是在datalistcp.class.php中使用,这个类在动态运行的情况下,由于本身是把模板编译成PHP的