已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
DedeCMS V5.3二次开发经验分享 写在前面,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、其它模板: 一般系统常规包含的模板有:主页模板、搜索模板、编译功能模板等,此外 用户也可以自定义一个模板创建为任意文件。 二、 命名,DedeCMS 模板默认命名规则如下 1、模板保存位置: 模板目录:cmspath /templets/样式名称(英文,默认为 default,其中 system 为系统底层 模板,plus 为插件使用的模板) /具体功能模板文件 2、 模板文件命名规范: ()index_识别 ID.htm: 表示板块(栏目封面)模板; ()list_ 识别 ID.htm: 表示栏目列表模板; ()article_识别 ID.htm: 表示内容查看页(文档模板,包括专题查看页) ; ()search.htm : 搜索结果列表模板; ()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 接口函数定义为:function lib_标签名( 3 me = “123456“; 4 /dede:tagname me 表示这个标记本身的值,因此标记内编程是不能使用 echo 之类的语句的,只能 把所有返回值传递给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 的内容转为纯 text function Html2Text($str,$r=0) 把文本转 HTML function Text2Html($txt) 输出 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) 获得用户 IP function GetIP() 获取拼音以 gbk 编码为准 function GetPinyin($str,$ishead=0,$isclose=1) dedecms 通用消息提示框 function ShowMsg($msg,$gourl,$onlymsg=0,$limittime=0) 保存一个 cookie function PutCookie($key,$value,$kptime=0,$pa=“/“) 删除一个 cookie function DropCookie($key) 获取 cookie function GetCookie($key) 获取验证码 function GetCkVdValue() 过滤前台用户输入的文本内容 / $rptype = 0 表示仅替换 html 标记 / $rptype = 1 表示替换 html 标记同时去除连续空白字符 / $rptype = 2 表示替换 html 标记同时去除所有空白字符 / $rptype = -1 表示仅替换 html 危险的标记 function HtmlReplace($str,$rptype=0) 获得某文档的所有 tag function GetTags($aid) 过滤用于搜索的字符串 function FilterSearch($keyword) 处理禁用 HTML 但允许换行的内容 function TrimMsg($msg) 获取单篇文档信息 function GetOneArchive($aid) 2.2、dedesql.class.php 数据库类 系统会自动载入 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); 与上面相比,它返回的是影响的记录数,而不是布尔值 3、返回单个记录 $arr = $db-GetOne($sql); $dsql 如果不带 limit ,系统会自动加上 limit 0,1 4、执行条件查询语句 $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-Execute(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($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 适用范围:数据量不大的数据分页 使用方法: $dl = 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,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 代码,二次执 行) 一、模板语法 织梦模板引擎是一种使用 XML 名字空间形式的模板解析器,使用织梦解析器解析模板的 最大好处是可以轻松的制定标记的属性,感觉上就像在用 HTML 一样,使模板代码十分直 观灵活,新版的织梦模板引擎不单能实现模板的解析还能分析模板里错误的标记。 1、织梦模板引擎的代码样式有如下几种形式: dede:标记名称 属性=值/ dede:标记名称 属性=值/dede:标记名称 dede:标记名称 属性=值自定义样式模板 (InnerText)/dede:标记名称 提示: 如果使用带底层模板的标记,必须严格用dede:标记名称 属性=值/dede:标记名称 这种 格式,否则会报错。 2、织梦模板引擎内置有多个系统标记,这些系统标记在任何场合都是能直接使用的。 (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 引入一个文件,形式为: 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、织梦标记允许有限的编程扩展。 格式为: dede:tagname runphp=yes $aaa = me; me = “123456“; /dede:tagname me 表示这个标记本身的值,因此标记内编程是不能使用 echo 之类的语句的,只能把所 有返回值传递给me。 此外由于程序代码占用了底层模板 InnerText 的内容,因此需编程的标记只能使用默认的 InnerText。 二、解析方式 在 dedetag.class.php 里面有四个类 class DedeAttribute 属性结构表述 class DedeAttributeParse 属性解析器 class DedeTag 标签结构表述 class DedeTagParse 标签解析器 使用解析类解析模板时一般经过下面的步骤 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) ); 在上面例子中,直接把名称为 mytag 的标签转交给 mytagvalue 函数处理,mytagvalue 里 判断$ctag 的各个属性,返回不同内容即可。 在 V5.3版本中,通常除了 field、list 等专用标签之外,凡 arc.*开头的类解析的文件,标签 都是对应该 include/taglib 的源码的,这个由系统进行了自动的映射。 4、显示或保存为 HTML $dtp-display(); 或 $dtp-SaveTo(静态文件名); 对于二次开发人员而言,不大需要知道 dedecms 模板具体解析方式,不过应该十分清楚 CTag 这个类的结构,从而判断标签不同属性进行处理。 2.5、dedetemplate.class.php 动态模板类 核心类文件 include/dedetemplate.class.php 用途:用于非核心模块的动态页面或列表页的模板解析,如:member/content_list.php ,通 常是在 datalistcp.class.php 中使用,这个类在动态运行的情况下,由于本身是把模板编译 成 PHP 的,因此性能上会优级于旧的解析类,这个方法将在未来版本中作为通用的方式。 一、使用方法: $tpl = new DedeTemplate( 模板对象实例名称,通常是tpl, 模板存放目录(生成缓存时会存放在这个目录), include 语法默认引用目录 ); 通常情况下参数二和参数三是不必要的,如:$tpl = new DedeTemplate(tpl); 如果在类文件中调用,应该加上设置:$this-tpl-SetObject($this); 在一些块调用中默认将使用当前类的成员函数。$tpl-LoadTemplate(模板的物理路径); 如果模板中带有 dede:config name= value=/例如 服装之家 可以在载入模 板后,通过 $tpl-GetConfig($name) 获得这些变量的值。显示页面或保存页面为文件 $tpl- Display();$tpl-SaveTo(物理绝对路径的文件名); 二、模板标记语法 1、标记通用特性 (1) 短标记 dede:/ 等同于 dede:tagname name= / (2) 块标记 dede:tagname 循环代码 /dede:tagname 2、标记的具体语法及对应的 PHP 代码 (1) 配置变量 dede:config name= value=/ 配置变量可以在载入模板后通过 $tpl-GetConfig($name) 获得,仅作为配置,不在模板中 显示。 (2) 短标记 dede:/ 外部变量 等同于 dede:/ var 数组 等同于 dede:/ field 数组 等同于 dede:/ 系统配置变量 等同于 考虑到大多数情况下都会在函数或类中调用模板,因此 $_vars、$fields 数组必须声明为 global 数组,否则模板引擎无法获得它的值从而导致产生错误。 (3) 自由调用块标记 tag:blockname bind=GetArcList bindtype=class 循环代码 /tag:blockname 必要属性: bind 数据源来源函数 bindtype 函数类型,默认是 class 可选为 sub rstype 返回结果类型,默认是 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:blockname bind=GetArcList bindtype=class rstype=arrayu 循环代码 /tag:blockname 2 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 filename=/ (6) php 代码块 dede:php php 代码 / 或 dede:php php 代码 /dede:php (7) if 条件 仅支持 if ,else ,else 直接用else表示,但不支持else if这样的语法 ,一般建议模板中 不要使用太复杂的条件语法,如果确实有需要,可以直接使用 php 语法。 dede:if 条件 a-block else b-block /dede:if 条件中允许使用 、 、 、 表示相应的变量。 如: dede:if field.id10 /dede:if (8) 遍历一个 array 数组 dede: dede:key/ = dede:value/ /dede:array 各种语法的具体编译后的代码,可查看 dede-template-class.php 的 function CompilerOneTag( foreach( $blockValue as $key=$fields ) ? ? . 2、示例二 tag:article sort=new titlelen=36 row=10 tag:field.typename/tag:field.title function=“CnSubstr(me,24)“/ /tag:article 编译后的代码 refObj,$
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 苏教版一年级数学下册全册教案
- 浙江省2024年初中学业水平考试模拟演练数学试卷附答案
- 高一化学巩固练习:气体摩尔体积基础
- 2024届云南省大理州丽江怒江高考仿真卷化学试卷含解析
- 2024高中地理第2章区域可持续发展第2节湿地资源的开发与保护-以洞庭湖区为例精练含解析湘教版必修3
- 2024高中物理第一章静电场课时6电势差与电场强度的关系训练含解析新人教版选修3-1
- 2024高中语文第5单元庄子蚜第3课东海之大乐练习含解析新人教版选修先秦诸子蚜
- 2024高中语文第六单元文无定格贵在鲜活项脊轩志作业含解析新人教版选修中国古代诗歌散文欣赏
- 2024高考历史一轮复习模块四选修部分第2讲20世纪的战争与和平学案含解析人民版
- 2024高考地理一轮复习第二部分人文地理-重在运用第一章人口的变化规范答题6人口类综合题学案新人教版
- 辐射安全知识培训课件
- 2023-2024学年八年级(上)期末数学试卷
- 2025年烟花爆竹储存证考试题库
- 2025年北京机场地服岗位招聘历年高频重点提升(共500题)附带答案详解
- ICH《M10:生物分析方法验证及样品分析》
- 2024-2030年全球及中国医用除尘器行业销售模式及盈利前景预测报告
- 2025学年人教新版英语七下Unit1随堂小测
- 全国高校第三轮学科评估按大学汇总
- 送达地址确认书(法院最新版)
- 建设工程施工合同 GF—2017—0201
- 部编版小学语文五年级下册第四单元教学计划及单元分析
评论
0/150
提交评论