Dede二次开发之代码篇:[2]
织梦CMS是集简单、健壮、灵活、开源几大特点的开源内容管理系统,是国内开源CMS的领先品牌,目前程序安装量已达七十万,超过六成的站点正在使用织梦CMS或基于织梦CMS核心开发.
2.1、common.func.php公用函数
获得当前的脚本网址functionGetCurUrl()返回格林威治标准时间functionMyDate($format='Y-m-dH:i:s',$timest=0)把全角数字转为半角functionGetAlabNum($fnum)把含HTML的内容转为纯textfunctionHtml2Text($str,$r=0)把文本转HTMLfunctionText2Html($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)获得用户IPfunctionGetIP()获取拼音以gbk编码为准functionGetPinyin($str,$ishead=0,$isclose=1)dedecms通用消息提示框functionShowMsg($msg,$gourl,$onlymsg=0,$limittime=0)保存一个cookiefunctionPutCookie($key,$value,$kptime=0,$pa="/")删除一个cookiefunctionDropCookie($key)获取cookiefunctionGetCookie($key)获取验证码functionGetCkVdValue()过滤前台用户输入的文本内容//$rptype=0表示仅替换html标记//$rptype=1表示替换html标记同时去除连续空白字符//$rptype=2表示替换html标记同时去除所有空白字符//$rptype=-1表示仅替换html危险的标记functionHtmlReplace($str,$rptype=0)获得某文档的所有tagfunctionGetTags($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,14、执行条件查询语句
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
10{/dede:datalist}
11
12{tag:pagelistlistitem="info,index,end,pre,next,pageno"listsize="5"/}listitem、listsize是可选属性如果需要自定义datalist相关属性,可以继续本类来创建一个新类,只需改变GetArcList($atts,$refObj='',$fields=array())方法即可。
s'; C-ipY����0; font-family:'Times New Roman'; " >获取单篇文档信息functionGetOneArchive($aid)
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的,因此性能上会优级于旧的解析类,这个方法将在未来版本中作为通用的方式。一、使用方法:$tpl=newDedeTemplate(模板对象实例名称,通常是'tpl',[模板存放目录(生成缓存时会存放在这个目录),include语法默认引用目录]);通常情况下参数二和参数三是不必要的,如:$tpl=newDedeTemplate('tpl');如果在类文件中调用,应该加上设置:$this->tpl->SetObject($this);在一些块调用中默认将使用当前类的成员函数。$tpl->LoadTemplate(模板的物理路径);如果模板中带有{dede:configname=''value=''/}可以在载入模板后,通过$tpl->GetConfig($name)获得这些变量的值。显示页面或保存页面为文件$tpl->Display();$tpl->SaveTo(物理绝对路径的文件名);二、模板标记语法1、标记通用特性(1)短标记{dede:tagname.name/}等同于{dede:tagnamename=''/}(2)块标记{dede:tagname}循环代码{/dede:tagname}2、标记的具体语法及对应的PHP代码(1)配置变量{dede:configname=''value=''/}配置变量可以在载入模板后通过$tpl->GetConfig($name)获得,仅作为配置,不在模板中显示。(2)短标记{dede:global.name/}外部变量等同于{dede:var.name/}var数组等同于{dede:field.name/}field数组等同于{dede:cfg.name/}系统配置变量等同于考虑到大多数情况下都会在函数或类中调用模板,因此$_vars、$fields数组必须声明为global数组,否则模板引擎无法获得它的值从而导致产生错误。(3)自由调用块标记{tag:blocknamebind='GetArcList'bindtype='class'}循环代码{/tag:blockname}必要属性:bind数据源来源函数bindtype函数类型,默认是class可选为subrstype返回结果类型,默认是array,可选项为string自定义函数格式必须为function(array$atts,object$refObj,array$fields);在没有指定bind绑定的函数的情况下,默认指向MakePublicTag($atts,$tpl->refObj,$fields)统一管理,这个函数存放在cls_dede_tplinc.php。(4)固定块标记datalist从绑定类成员函数GetArcList中获取数组并输出{dede:datalist}循环代码{/dede:datalist}遍历一个二给维数组,数据源是固定的,只适用用类调用。等同于{tag:blocknamebind='GetArcList'bindtype='class'rstype='arrayu'}循环代码{/tag:blockname}label从绑定函数中获取字符串值并输出等同于{tag:blocknamebind='func'bindtype='sub'rstype='string'/}pagelist从绑定类成员函数GetPageList中获取字符串值并输出等同于{tag:blocknamebind='GetPageList'bindtype='class'rstype='string'/}(5)include语法{dede:includefile=''/}{dede:includefilename=''/}(6)php代码块{dede:phpphp代码/}或{dede:php}php代码{/dede:php}(7)if条件仅支持if,else,else直接用{else}表示,但不支持{elseif}这样的语法,一般建议模板中不要使用太复杂的条件语法,如果确实有需要,可以直接使用php语法。{dede:if条件}a-block{else}b-block{/dede:if}条件中允许使用var.name、global.name、field.name、cfg.name表示相应的变量。如:{dede:iffield.id>10}{/dede:if}(8)遍历一个array数组{dede:array.name}{dede:key/}={dede:value/}{/dede:array}各种语法的具体编译后的代码,可查看dede-template-class.php的functionCompilerOneTag(&$cTag)。块调用示例代码:1、示例一
1{tag:datalisttimeformat=""}
2
3
4
5
6
7
8
9{/tag:datalist}
编译后的代码
10
11$atts=array();
12$atts['tagname']='datalist';
13$atts['timeformat']='';
14$blockValue=$this->refObj->GetArcList($atts,$this->refObj,$fields);
15foreach($blockValueas$key=>$fields)
16{
17?>
18
19
20
21
22
23
24
25
26}
27?>
28
2、示例二
29{tag:articlesort='new'titlelen='36'row='10'}
30
31{/tag:article}编译后的代码
32
33$atts=array();
34$atts['tagname']='article';
35$atts['sort']='new';
36$atts['titlelen']='36';
37$atts['row']='10';
38$blockValue=MakePublicTag($atts,$this->refObj,$fields);
39if(is_array($blockValue)&&count($blockValue)>0){
40foreach($blockValueas$key=>$fields)
41{
42?>
43
44
45}
46}
47?>
48
版权声明:本站【趣百科】文章素材来源于网络或者用户投稿,未经许可不得用于商用,如转载保留本文链接:https://www.qubaik.com/answer/92028.html