浅谈dedecms模板引擎工作原理及自定义标签(2)

在include/ DedeTagParse.class.php中定义的解析引擎类,负责读取模板,把其中的dedecms标签替换成具体html文本。DedeTagParse、SetNameSpace、LoadTemplate就是类里面的方法。

标签翻译需要一些转换规则,lib_my就是这一类根据标签的属性和具体数据得出html。

待显示的php创建编译引擎类对象,对模板进行编译,在Display时,echo出html文件。

htm模板,调用标签,用html的形式写出动态网页的效果,属于被翻译的部分。Html模板主要负责界面层次,利用封装好的标签进行内部处理。

除了这四大势力,还有一个势力视图类。include/中以arc开头的文件都是解析引擎的视图类。视图类就是封装了解析引擎类的类,仅仅加了一些函数而已。在下载的cms默认模板中,root/index.php就用了PartView这个视图类,解析了templets/default/index.htm。五大势力的关系如下图。

浅谈dedecms模板引擎工作原理及自定义标签

我们现在想象一个标签如何被解析的。我们知道,一个xml标签有四个元素:命名空间(上面的tianya,在dedecms中是dede)、标签名(my)、属性(att)、InnerText(标签之间的内容)。命名空间在SetNameSpace中指明了,标签名由if($tag->GetName()=='my')这一句分配任务,属性作为函数参数使用,就差InnerText的处理。

再来看看如何处理底层模板字段([field:my/]等,field是一个关键字,在实际应用中,常常是数据库元组中的字段)

***root/test.php
 

<?php

    require_once (dirname(__file__).'/include/common.inc.php');

    require_once (dirname(__file__).'/include/dedetag.class.php');

 

//看完后面的代码再来看这个函数

function lib_zoo(&$ctag)

{    

    //还记得刚才$dtp->CTags的结构吗?这里把$ctag作为参数传递,lib__zoo外面的代码就不用涉及太多的标签处理了

    $reval='这是my标签<br/>属性值'. $ctag->GetAtt('att1').$ctag->GetAtt('att2').'<br/>';

$innerText = $ctag->GetInnerText();

 

//底层模板字段的结构都形如[field:XX]这里把它看作以field为命名空间,[]为分隔符的标签。

    $dtp=new DedeTagParse();

    $dtp->SetNameSpace('field','[',']');

    $dtp->LoadSource($innerText);

 

    //不妨把$row想想成从数据库中读取出来的出来的数据

    $row[‘name’]= 'Snoopy';

    $row[‘animal’]= 'dog';

    

    //把标签替换成具体的值

    foreach ($dtp->CTags as $id=>$tag)

    {

        if($tag->GetName()=='name')

            $dtp->Assign($id, $row[‘name’]);

        else if($tag->GetName()=='animal')

            $dtp->Assign($id, $row[‘animal’]);

    }

    $reval.=$dtp->GetResult().'<br/>';

    return $reval;

}

 

$dtp=new DedeTagParse();

$dtp->SetNameSpace('tianya');

$dtp->LoadTemplate(dirname(__file__).' est.htm');

 

foreach ($dtp->CTags as $id=>$tag)

{

    if($tag->GetName()=='zoo')

    $dtp->Assign($id, lib_zoo($tag));

}

 

$dtp->Display(); 

?>


***root/test.htm

{tianya:zoo att1=1 att2='2'} [field:name/] is a [field:animal/] {/tianya:zoo}

可见,解析底层模板和解析标签是一样的,只不过把底层模板当作是以field为命名空间,‘[’和‘]’为边界的标签而已。

接着看一下include/taglib/memberlist.lib.php,和lib_zoo很像吧。你是不是突然懂得如何定义标签了,读memberlist.lib.php里面的代码,模仿,就能自定义标签了,可参考“扩展标签”。所以自定义标签只用在include/taglib里加入XX.lib.php文件,里面定义lib_XX函数即可。快点去试一试。

***把root/index.php(默认模板根目录中的)里面的

$pv->SetTemplet($cfg_basedir . $cfg_templets_dir . "/" . $row['templet']);

改成$pv->SetTemplet($cfg_basedir .'/test.htm');

在root/test.htm使用自定义标签吧

是否需要自定义标签

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/fc1c52bd4a9bc03a6237520e99fcdb32.html