设为首页收藏本站

水盟网

 找回密码
 加盟

QQ登录

只需一步,快速开始

水盟网 主页 网站建设 查看内容

DEDECMS模板引擎动态解析标签的使用

12-3-7 12:04| 发布者: shuimeng| 查看: 1038| 评论: 0

摘要: 什么是动态解析标签?简单的来说就是模板里存在什么标记就调用什么代码去解析,这样不必要载入一些多余的代码,而且扩展更加灵活,在具体说明前,先用一个例子简单说明DedeCms模板引擎的使用。 以下示例代码可以放在安 ...

什么是动态解析标签?简单的来说就是模板里存在什么标记就调用什么代码去解析,这样不必要载入一些多余的代码,而且扩展更加灵活,在具体说明前,先用一个例子简单说明DedeCms模板引擎的使用。

以下示例代码可以放在安装了dedecms系统的根目录中使用。

以下为引用的内容:

<?php
//引入必须文件
require_once(dirname(__FILE__)."/include/commin.inc.php");
require_once(dirname(__FILE__)."/include/channelunit.func.php");
require_once(dirname(__FILE__)."/include/dedetag.class.php");
//初始化模板类
$dtp = new DedeTagParse();
$dtp->SetNameSpace("dede","{","}");
//引用当前类([1]这里为空,后面会说明用途)
$dtp->refObj = null;
//载入模板
$dtp->LoadTemplet($filename);
//动态解析 include/taglib 里的标签 [2]
MakeOneTag($dtp, null);
//解析系统标签,显示内容
$dtp->Display();
//类似方法:GetResult() 获得解析后的HTML,SaveTo($filename)保存为文件
?
在以上例子中,比较不好理解的是两个 null,其实如果在类中调用这模板类,通常表示为 $this

具体原因需要分析 channelunit.func.php 里的

MakeOneTag(&$dtp,&$refObj)

这个函数的第一个参数不用说都知道是模板类本身的对象实例,如$refObj就是引入这个模板类的类,在Dedecms中,凡是 include/arc. 开头的文件都是这种文档解析类的具体功能类。

它的具体代码如下:

以下为引用的内容:

function MakeOneTag(&$dtp,&$refObj)
{
$alltags = array();
//读取自由调用tag列表
$dh = dir(DEDEINC.'/taglib');
while($filename = $dh->read())
{
if(ereg("\.lib\.",$filename))
{
$alltags[] = str_replace('.lib.php','',$filename);
}
}
$dh->Close();
//遍历tag元素
if(!is_array($dtp->CTags))
{
return '';
}
foreach($dtp->CTags as $tagid=>$ctag)
{
$tagname = $ctag->GetName();
//解析通用的 field 标签 [1]*
if($tagname=='field')
{
$vname = $ctag->GetAtt('name');
if(isset($refObj->Fields[$vname]))
{
$dtp->Assign($tagid, $refObj->Fields[$vname]);
}
else if( isset( $this->TypeLink->TypeInfos[$vname] ) )
{
$dtp->Assign($tagid, $this->TypeLink->TypeInfos[$vname]);
}
continue;
}
//同名标记(兼容旧版)处理
if(ereg("^(artlist|likeart|hotart|imglist|imginfolist|coolart|specart|autolist)$",$tagname))
{
$tagname='arclist';
}
if($tagname=='friendlink')
{
$tagname='flink';
}
//给不同的标记调用不同的解析文件 [2]*
if(in_array($tagname,$alltags))
{
$filename = DEDEINC.'/taglib/'.$tagname.'.lib.php';
include_once($filename);
$funcname = 'lib_'.$tagname;
$dtp->Assign($tagid,$funcname($ctag,$refObj));
}
}
}
以上代码的重点就是 [1] [2] 标注的地方

[1]是解析文档中field标签,这个标签对于文档类中,都必使用 var Fields; 数组来表示这些通用文档字段,但对于不同模板,它的值也是可变的。

[2]就是勾子技术的关键,给field以及系统标记以外的标记调用不同的具体解析代码,这里规定了这些代码必须放在include/taglib文件夹内,名称为“标记名.lib.php”,而这个文件里定义的接口函数格式为:

以下为引用的内容:

<?php
if(!defined('DEDEINC'))
{
exit("Request Error!");
}
function lib_标记名称(&$ctag,&$refObj)
{
global $dsql,$envs;
//属性处理
$attlist="row|12,titlelen|24";
FillAttsDefault($ctag->CAttribute->Items,$attlist);
extract($ctag->CAttribute->Items, EXTR_SKIP);
$revalue = '';
//你需编写的代码,不能用echo之类语法,把最终返回值传给$revalue
//------------------------------------------------------
$revalue = 'Hello Word!';
//------------------------------------------------------
return $revalue;
}
?>
到这里就完全揭开了DedeCms V5.3勾子技术的真正面目,上面还有一个没交待清楚的是

“$dtp->refObj = null;” 这个地方,其实对于Dedecms的文档解析类,100%都是面向对象的,它在类里通常是写为

“$this->dtp->refObj = $this;” 这个对象正是 function lib_标记名称(&$ctag,&$refObj) 里的第二个参数,说到这里,有点明白它的作用了吧,简单的来说就是在接口函数里获取当前解析类的一些相关信息,这是相当有用的。


鸡蛋

鲜花

雷人

握手

搞笑
发表评论

最新评论

返回顶部