1、DedeCMS V5.3二次开发希望对大家有用一、模板篇1.1、主要模板文件与功能说明DedeCMS 系统的模板是非固定的,用户可以在新建栏目时可以自行选择栏目模板,官方仅提供最基本的默认模板,即是内置系统模型的各个模板,由于 DedeCMS 支持自定义频道模型,用户自定义新频道模型后,还需要按该模型的字段设计一套新的模板,此外,DedeCMS 也支持使用风格的形式使用模板,默认风格是 default,它表示系统默认使用 cmspath/templets/default 这个文件夹的模板,如果你下载了一套新的模板,你可以不必要删除 default 原有的文件,把下载的模板文件夹命名你想要的风格
2、名称,如 style2 等,然后在后台修改了默认的模板风格名称为 style2 ,那系统将使用cmspath/templets/style2 这文件当作默认模板,但是若你手工指定了栏目模板的位置,则后台参数风格的定义无效。一、概念,设计和使用模板,必须要理解下面几个概念1、板块(封面)模板:指网站主页或比较重要的栏目封面频道使用的模板,一般用“index_识别 ID.htm”命名,此外,用户单独定义的单个页面或自定义标记,也可选是否支持板块模板标记,如果支持,系统会用板块模板标记引擎去解析后才输出内容或生成特定的文件。2、列表模板:指网站某个栏目的所有文章列表的模板,一般用 “list_识别
3、ID.htm” 命名。3、档案模板:表示文档查看页的模板,如文章模板,一般用 “article_识别 ID.htm” 命名。4、其它模板:一般系统常规包含的模板有:主页模板、搜索模板、编译功能模板等,此外用户也可以自定义一个模板创建为任意文件。二、 命名,DedeCMS 模板默认命名规则如下1、模板保存位置:模板目录:cmspath /templets/样式名称(英文,默认为 default,其中 system 为系统底层模板,plus 为插件使用的模板) /具体功能模板文件2、 模板文件命名规范:()index_识别 ID.htm: 表示板块(栏目封面)模板;()list_ 识别 ID.ht
4、m: 表示栏目列表模板;()article_识别 ID.htm: 表示内容查看页(文档模板,包括专题查看页) ;()search.htm : 搜索结果列表模板;()index.htm: 主页模板;注解:识别 ID可以在“频道模型管理”的地方获得,当然,你也可以在“频道模型管理”的地方确定某个频道的模板命名。例:list_image.htm 表示是就是内容类型为图片集的栏目默认列表模板。article_article.htm 表示的是文章查看页模板。三、其它模板说明1、默认底层模板位置: cmspath/templets/system功能:在没有指定标记的默认底层模板的时候,系统将自动调用这个文
5、件夹的相应文件作为底层模板。2、插件目录模板位置: cmspath/templets/plus功能:评论、友情链接、RSS 地图等模板。3、会员后台模板位置: cmspath/member/templets功能:会员后台的模板。四、二次开发在 V5.3中已经将标签开发分离出来,您可以通过后台 模板 -标签代码管理 ,点击“新增加一个新的标签”来创建一个自己的标签,标签文件名为:标签名.lib.php接口函数定义为:function lib_标签名( 3 me = “123456“; 4 /dede:tagname me 表示这个标记本身的值,因此标记内编程是不能使用 echo 之类的语句的,只
6、能把所有返回值传递给me。此外由于程序代码占用了底层模板 InnerText 的内容,因此需编程的标记只能使用默认的 InnerText。2、代码篇2.1、common.func.php 公用函数获得当前的脚本网址function GetCurUrl()返回格林威治标准时间function MyDate($format=Y-m-d H:i:s,$timest=0)把全角数字转为半角function GetAlabNum($fnum)把含 HTML 的内容转为纯 textfunction Html2Text($str,$r=0)把文本转 HTMLfunction Text2Html($txt)输
7、出 Ajax 头function AjaxHead()中文截取2,单字节截取模式function cn_substr($str,$slen,$startdd=0)把标准时间转为 Unix 时间戳function GetMkTime($dtime)获得一个 0000-00-00 00:00:00 标准格式的时间function GetDateTimeMk($mktime)获得一个 0000-00-00 标准格式的日期function GetDateMk($mktime)获得用户 IPfunction GetIP()获取拼音以 gbk 编码为准function GetPinyin($str,$is
8、head=0,$isclose=1)dedecms 通用消息提示框function ShowMsg($msg,$gourl,$onlymsg=0,$limittime=0)保存一个 cookiefunction PutCookie($key,$value,$kptime=0,$pa=“/“)删除一个 cookiefunction DropCookie($key)获取 cookiefunction GetCookie($key)获取验证码function GetCkVdValue()过滤前台用户输入的文本内容/ $rptype = 0 表示仅替换 html 标记/ $rptype = 1 表示替
9、换 html 标记同时去除连续空白字符/ $rptype = 2 表示替换 html 标记同时去除所有空白字符/ $rptype = -1 表示仅替换 html 危险的标记function HtmlReplace($str,$rptype=0)获得某文档的所有 tagfunction GetTags($aid)过滤用于搜索的字符串function FilterSearch($keyword)处理禁用 HTML 但允许换行的内容function TrimMsg($msg)获取单篇文档信息function GetOneArchive($aid)2.2、dedesql.class.php 数据库类系
10、统会自动载入 dedesql.class.php 文件,并用$dsql = $db = new DedeSql(false);进行初始化数据库连接,因此在工程所有文件中均不需要单独初始化这个类,可直接用 $dsql 或 $db 进行操作,为了防止错误,操作完后不必关闭数据库。常用的方法:1、执行一个非查询类型的 SQL 语句,如 insert 、create 、update 等$rs = $db-ExecuteNoneQuery($sql);返回值为是否执行成功。2、执行一个非查询类型的 SQL 语句,并返回成功记录数$rs = $db-ExecuteNoneQuery2($sql);与上面相
11、比,它返回的是影响的记录数,而不是布尔值3、返回单个记录$arr = $db-GetOne($sql);$dsql 如果不带 limit ,系统会自动加上 limit 0,14、执行条件查询语句 $db-SetQuery($dsql); $db-Execute(); while($arr = $db-GetArray() 可以简化为: $db-Execute(me,$dsql); while($arr = $db-GetArray() me 为记录集游标,用于区分不同的查询,如: $db-Execute(me,$dsql); while($arr = $db-GetArray() $db-Ex
12、ecute(2,$dsql2); while($arr2 = $db-GetArray() 像这种情况必须指定一个值区分默认的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($isfor
13、mat=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适用范围:数据量不大的数据分页使用方法: $dl
14、 = new DataListCP(); $dl-pageSize = 25; /设定每页显示记录数(默认 25条) $dl-SetParameter($key,$value); /设定 get 字符串的变量 /这两句的顺序不能更换 $dl-SetTemplate($tplfile);?/载入模板 $dl-SetSource($sql);?/设定查询 SQL $dl-Display();?/显示 模板 dede:datalist field.fieldname1/ - field.fieldname2/ . /dede:datalist tag:pagelist listitem=“info,
15、index,end,pre,next,pageno“ listsize=“5“/ listitem、listsize 是可选属性如果需要自定义 datalist 相关属性,可以继续本类来创建一个新类,只需改变 GetArcList($atts,$refObj=,$fields=array() 方法即可。2.4、dedetag.class.php 静态模板类类文件include/dedetag.class.php这个文件是 dedecms V5.3及之前版本使用的主要的模板类,它是解析式模板类,并非编译式的(区别是前者通过获得标签位置进行内容替换,后者是直接解析式 PHP 代码,二次执行)一、模
16、板语法织梦模板引擎是一种使用 XML 名字空间形式的模板解析器,使用织梦解析器解析模板的最大好处是可以轻松的制定标记的属性,感觉上就像在用 HTML 一样,使模板代码十分直观灵活,新版的织梦模板引擎不单能实现模板的解析还能分析模板里错误的标记。1、织梦模板引擎的代码样式有如下几种形式:dede:标记名称 属性=值/dede:标记名称 属性=值/dede:标记名称dede:标记名称 属性=值自定义样式模板 (InnerText)/dede:标记名称提示:如果使用带底层模板的标记,必须严格用dede:标记名称 属性=值/dede:标记名称 这种格式,否则会报错。2、织梦模板引擎内置有多个系统标记,
17、这些系统标记在任何场合都是能直接使用的。(1) global 标记,表示获取一个外部变量,除了数据库密码之外,能调用系统的任何配置参数,形式为:dede:global name=变量名称/dede:global或dede:global name=变量名称/其中变量名称不能加 $ 符号,如变量 $cfg_cmspath ,应该写成 dede:global name=cfg_cmspath/ 。(2) foreach 用来输出一个数组,形式为:dede:foreach array=数组名称field:key/ field:value/dede:foreach(3) include 引入一个文件,形
18、式为:dede:include file=文件名称 ismake=是否为 dede 板块模板 (yes/no)/对文件的搜索路径为顺序为:绝对路径、include 文件夹,CMS 安装目录,CMS 主模板目录3、织梦标记允许在任何标记中使用函数对得到的值进行处理,形式为:dede:标记名称 属性=值 function=youfunction(“ 参数一“,“参数二“,“me“)/其中 me 用于表示当前标记的值,其它参数由你的函数决定是否存在,例如:dede:field name=pubdate function=strftime(“%Y-%m-%d %H:%M:%S“,“me“)/4、织梦标
19、记允许有限的编程扩展。格式为:dede:tagname runphp=yes$aaa = me;me = “123456“;/dede:tagnameme 表示这个标记本身的值,因此标记内编程是不能使用 echo 之类的语句的,只能把所有返回值传递给me。此外由于程序代码占用了底层模板 InnerText 的内容,因此需编程的标记只能使用默认的InnerText。二、解析方式在 dedetag.class.php 里面有四个类class DedeAttribute 属性结构表述class DedeAttributeParse 属性解析器class DedeTag 标签结构表述class Ded
20、eTagParse 标签解析器使用解析类解析模板时一般经过下面的步骤1、初始化:$dtp = new DedeTagParse();2、载入模板/模板字符串:$dtp-LoadTemplate(模板文件(绝对路径) ); /会生成缓存,第二次不需解析模板或$dtp-LoadSource(字符串);3、给标签赋值foreach($dtp-CTags as $tid=$ctag) /判断 ctag 的名称和属性,并给赋不同的值,通常用函数处理 if($ctag-GetName=mytag) $dtp-Assign($tid, mytagvalue($ctag) ); 在上面例子中,直接把名称为 m
21、ytag 的标签转交给 mytagvalue 函数处理,mytagvalue 里判断$ctag 的各个属性,返回不同内容即可。在 V5.3版本中,通常除了 field、list 等专用标签之外,凡 arc.*开头的类解析的文件,标签都是对应该 include/taglib 的源码的,这个由系统进行了自动的映射。4、显示或保存为 HTML$dtp-display();或$dtp-SaveTo(静态文件名);对于二次开发人员而言,不大需要知道 dedecms 模板具体解析方式,不过应该十分清楚CTag 这个类的结构,从而判断标签不同属性进行处理。 class DedeTag var $IsRepl
22、ace=FALSE; /标记是否已被替代,供解析器使用 var $TagName=“; /标记名称 var $InnerText=“; /标记之间的文本 var $StartPos=0; /标记起始位置 var $EndPos=0; /标记结束位置 var $CAttribute=“; /标记属性描述,即是 class DedeAttribute var $TagValue=“; /标记的值 var $TagID = 0; /获取标记的名称和值 function GetName() return strtolower($this-TagName); function GetValue() re
23、turn $this-TagValue; /下面两个成员函数仅是为了兼容旧版 function GetTagName() return strtolower($this-TagName); function GetTagValue() return $this-TagValue; /获取标记的指定属性 function IsAttribute($str) return $this-CAttribute-IsAttribute($str); function GetAttribute($str) return $this-CAttribute-GetAtt($str); function Get
24、Att($str) return $this-CAttribute-GetAtt($str); function GetInnerText() return $this-InnerText; 2.5、dedetemplate.class.php 动态模板类核心类文件include/dedetemplate.class.php用途:用于非核心模块的动态页面或列表页的模板解析,如:member/content_list.php ,通常是在 datalistcp.class.php 中使用,这个类在动态运行的情况下,由于本身是把模板编译成 PHP 的,因此性能上会优级于旧的解析类,这个方法将在未来版
25、本中作为通用的方式。一、使用方法:$tpl = new DedeTemplate(模板对象实例名称,通常是tpl,模板存放目录(生成缓存时会存放在这个目录),include 语法默认引用目录);通常情况下参数二和参数三是不必要的,如:$tpl = new DedeTemplate(tpl);如果在类文件中调用,应该加上设置:$this-tpl-SetObject($this);在一些块调用中默认将使用当前类的成员函数。$tpl-LoadTemplate(模板的物理路径);如果模板中带有 dede:config name= value=/可以在载入模板后,通过 $tpl-GetConfig($n
26、ame) 获得这些变量的值。显示页面或保存页面为文件$tpl-Display();$tpl-SaveTo(物理绝对路径的文件名);二、模板标记语法1、标记通用特性(1) 短标记dede:tagname.name/等同于dede:tagname name= /(2) 块标记dede:tagname循环代码/dede:tagname2、标记的具体语法及对应的 PHP 代码(1) 配置变量dede:config name= value=/配置变量可以在载入模板后通过 $tpl-GetConfig($name) 获得,仅作为配置,不在模板中显示。(2) 短标记dede:global.name/ 外部变
27、量 等同于 dede:var.name/ var 数组 等同于 dede:field.name/ field 数组 等同于 dede:cfg.name/ 系统配置变量 等同于 考虑到大多数情况下都会在函数或类中调用模板,因此 $_vars、$fields 数组必须声明为 global 数组,否则模板引擎无法获得它的值从而导致产生错误。(3) 自由调用块标记tag:blockname bind=GetArcList bindtype=class循环代码/tag:blockname必要属性:bind 数据源来源函数bindtype 函数类型,默认是 class 可选为 subrstype 返回结果
28、类型,默认是 array ,可选项为 string自定义函数格式必须为 function(array $atts,object $refObj, array $fields);在没有指定 bind 绑定的函数的情况下,默认指向 MakePublicTag($atts,$tpl-refObj,$fields) 统一管理,这个函数存放在 cls_dede_tplinc.php 。(4) 固定块标记1 datalist从绑定类成员函数 GetArcList 中获取数组并输出dede:datalist循环代码/dede:datalist遍历一个二给维数组,数据源是固定的,只适用用类调用。等同于tag:
29、blockname bind=GetArcList bindtype=class rstype=arrayu循环代码/tag:blockname2 label从绑定函数中获取字符串值并输出等同于 tag:blockname bind=func bindtype=sub rstype=string/3 pagelist从绑定类成员函数 GetPageList 中获取字符串值并输出等同于 tag:blockname bind=GetPageList bindtype=class rstype=string/(5) include 语法dede:include file=/dede:include
30、filename=/(6) php 代码块dede:phpphp 代码/或dede:phpphp 代码/dede:php(7) if 条件仅支持 if ,else ,else 直接用else表示,但不支持else if这样的语法 ,一般建议模板中不要使用太复杂的条件语法,如果确实有需要,可以直接使用 php 语法。dede:if 条件 a-block else b-block /dede:if条件中允许使用 var.name 、 global.name 、 field.name、cfg.name 表示相应的变量。如:dede:if field.id10 /dede:if(8) 遍历一个 arr
31、ay 数组dede:array.namedede:key/ = dede:value/dede:array各种语法的具体编译后的代码,可查看 dede-template-class.php 的 function CompilerOneTag(tag:field.description function=“CnSubstr(me,150)“/. tag:field.formattime/ /tag:datalist 编译后的代码 refObj-GetArcList($atts,$this-refObj,$fields); foreach( $blockValue as $key=$fields
32、) ? ? . 2、示例二 tag:article sort=new titlelen=36 row=10 tag:field.typename/tag:field.title function=“CnSubstr(me,24)“/ /tag:article 编译后的代码 refObj,$fields); if(is_array($blockValue) & count($blockValue) 0) foreach( $blockValue as $key=$fields ) ? “ 3、数据库篇dede_archives|文档主表字段 类型 整理 属性 Null 默认 额外id mediu
33、mint(8) UNSIGNED 是 0 文档 IDtypeid smallint(8) UNSIGNED 是 0 栏目 IDsortrank int(10) UNSIGNED 是 0 时间排序flag set(c,h,p,f,s,j,a,b)utf8_general_ci 是 NULL 自定义属性值ismake smallint(6) 是 0 是否审核channel smallint(6) 是 1 所属模型 IDarcrank smallint(6) 是 0 阅读权限click mediumint(8) UNSIGNED 是 0 点击数money smallint(6) 是 0 消费点数ti
34、tle char(60) utf8_general_ci 是 标题shorttitle char(36) utf8_general_ci 是 简明标题color char(7) utf8_general_ci 是 颜色writer char(20) utf8_general_ci 是 作者source char(30) utf8_general_ci 是 文档来源litpic char(60) utf8_general_ci 是 缩略图pubdate int(10) UNSIGNED 是 0 时间senddate int(10) UNSIGNED 是 0 时间mid mediumint(8)
35、UNSIGNED 是 0 会员 IDkeywords char(30) utf8_general_ci 是 关键词templet char(30) utf8_general_ci 是 lastpost int(10) UNSIGNED 是 0 最后回复scores mediumint(8) UNSIGNED 是 0 阅读权限goodpost mediumint(8) UNSIGNED 是 0 好评badpost mediumint(8) UNSIGNED 是 0 差评notpost tinyint(1) UNSIGNED 是 0 评论选项(1:充许评论)userip char(15) utf8
36、_general_ci 是 IPredirecturl varchar(255) utf8_general_ci 是 跳转地址description varchar(255) utf8_general_ci 是 摘要dede_addonarticle|文章附加表字段 类型 整理 属性 Null 默认 额外aid mediumint(8) UNSIGNED 否 0 文档 IDtypeid smallint(5) UNSIGNED 否 0 栏目 IDbody mediumtext utf8_general_ci 是 NULL 内容dede_addonimages|图片附加表字段 类型 整理 属性
37、Null 默认 额外aid mediumint(8) UNSIGNED 否 0 文档 IDtypeid smallint(5) UNSIGNED 否 0 栏目 IDpagestyle smallint(6) 否 1 表现方式(多页多图显示、多页单图显示、多行多列显示)maxwidth smallint(6) 否 600 图片宽度限制imgurls text utf8_general_ci是 NULL 图片内容(dede:pagestyle)row smallint(6) 否 0 多列式参数(行)col smallint(6) 否 0 多列式参数(列)isrm smallint(6) 否 0 特
38、殊选项(下载远程图片、从 ZIP压缩包中解压图片、网上复制图片)ddmaxwidthsmallint(6) 否 200 缩略图宽度限制pagepicnum smallint(6) 否 12 每页图片数(单页多图显示需要设置此参数)dede_addonshop|商品附加表字段 类型 整理 属性 Null 默认 额外aid mediumint(8) UNSIGNED 否 0 文档 idtypeid smallint(5) UNSIGNED 否 0 栏目 idbody mediumtext utf8_general_ci 是 NULL 商品内容price float 否 0 价格trueprice
39、float 否 0 优惠价brand varchar(250) utf8_general_ci 否 品牌units varchar(250) utf8_general_ci 否 单位dede_addonsoft|软件附加表字段 类型 整理 属性 Null 默认 额外aid mediumint(8) UNSIGNED 否 0 文档 IDtypeid smallint(5) UNSIGNED 否 0 栏目 IDfiletype varchar(10) utf8_general_ci 否 文件类型(zip、rar)language varchar(10) utf8_general_ci 否 软件语言
40、softtype varchar(10) utf8_general_ci 否 软件类型(国产.)accredit varchar(10) utf8_general_ci 否 授权方式(共享软件)os varchar(30) utf8_general_ci 否 运行环境(windows)softrank mediumint(8) UNSIGNED 否 0 软件等级(一星.)officialUrl varchar(30) utf8_general_ci 否 官方网址officialDemo varchar(50) utf8_general_ci 否 程序演示softsize varchar(10)
41、 utf8_general_ci 否 软件大小softlinks text utf8_general_ci 是 NULL 软件地址introduce text utf8_general_ci 是 NULL 软件说明daccess smallint(5) 否 0 下载权限dede_addonspec|专题附加表字段 类型 整理 属性 Null 默认 额外aid mediumint(8) UNSIGNED 否 0 文档 IDtypeid smallint(5) UNSIGNED 否 0 栏目 IDnote text utf8_general_ci 是 NULL 专题节点dede_arctype|栏
42、目表字段 类型 整理 属性 Null 默认 额外id smallint(5) UNSIGNED 是 NULL 栏目 IDreid smallint(5) UNSIGNED 是 0 上级栏目topid smallint(5) UNSIGNED 是 0 顶级栏目sortrank smallint(5) UNSIGNED 是 50 栏目排序typename char(30) utf8_general_ci 是 栏目名typedir char(60) utf8_general_ci 是 目录地址isdefault smallint(6) 是 0 栏目列表选项(1:链接到默认页;0:链接到列表第一页;-
43、1:使用动态页)defaultname char(15) utf8_general_ci 是 index.html默认页的名称issend smallint(6) 是 0 是否支持投稿(0:不支持;1:支持)channeltype smallint(5) UNSIGNED 是 1 所属频道 IDmaxpage smallint(6) 是 -1 ispart smallint(6) 是 0 栏目属性(0:最终列表栏目;1:频道封面;2:外部连接)corank smallint(6) 是 0 浏览权限tempindex char(50) utf8_general_ci 是 封面模板templist
44、 char(50) utf8_general_ci 是 列表模板temparticle char(50) utf8_general_ci 是 内容模板namerule char(50) utf8_general_ci 是 文章命名规则(typedir/YMD/aid.html)namerule2 char(50) utf8_general_ci 是 列表命名规则(typedir/list_tid_page.html)modname char(20) utf8_general_ci 是 description char(150) utf8_general_ci 是 栏目描述keywords ch
45、ar(30) utf8_general_ci 是 关键词moresite tinyint(1) UNSIGNED 是 0 多站点支持(0:不启用)sitepath char(60) utf8_general_ci 是 栏目地址siteurl char(50) utf8_general_ci 是 绑定域名ishidden smallint(6) 是 0 是否隐藏栏目(0:显示)cross tinyint(1) 是 0 栏目交(0:不交叉;1:自动获取同名栏目内容;2:手工指定交叉栏目 ID)crossid text utf8_general_ci 是 NULL 交叉栏目 IDcontent te
46、xt utf8_general_ci 是 NULL 栏目内容dede_flinktype|友情链接网站类型字段 类型 整理 属性 Null 默认 额外id mediumint(8) UNSIGNED 是 NULL 链接类型 IDtypename varchar(50) utf8_general_ci 是 类型名称dede_flink|友情链接表字段 类型 整理 属性 Null 默认 额外id smallint(5) UNSIGNED 是 NULL 友链 IDsortrank smallint(6) 是 0 排序值url char(60) utf8_general_ci 是 链接地址webname char(30) utf8_general_ci 是 网站名msg char(200) utf8_general_ci 是 网站简况email char(50) utf8_general_ci 是 站长 EMAILlogo char(60) utf8_general_ci 是 LOGOdtime int(10) UNSIGNED 是 0 链接时间typeid smallint(5) UNSIGNED 是 0 站点类型ischeck sma