浅谈dedecms模板引擎工作原理及自定义标签
理解织梦模板引擎有什么意义?一方面可以更好地自定义标签。更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步。理解织梦会使我们写php代码时更顺手,同时能学习一些php代码的组织方式。
这似乎不是那么简单,如果你只想学习自定义标签,可以看一下“是否需要自定义标签”和““扩展标签””就够了。
一解析式引擎
如果你还没用过dedecms的标签,先用一下,也可以看一下“dedecms网页模板编写”。熟悉一下memberlist这个标签,下面会以这个标签为例。
织梦提供的模板分析引擎有解析式和编译式两种,由于现在主要使用前者,这里也只讨论前者。
先来写个模板解析的hello world 程序
***root/test.php 封面php(root指的是根目录,以下都假设dedecms被放在了网站的根目录)
<?php
require_once (dirname(__file__).'/include/common.inc.php');
//利用解析式模板所需的文件
require_once (dirname(__file__).'/include/dedetag.class.php');
//生成解析模板引擎类对象
$dtp=new DedeTagParse();
//设置命名空间,由于下面的标签用tianya命名空间,所以要设置一下。
$dtp->SetNameSpace('tianya');
$dtp->LoadTemplate(dirname(__file__).' est.tpl.htm ');
//把标签替换成具体的值
foreach ($dtp->CTags as $id=>$tag)
{
if($tag->GetName()=='my')
//把id为$id的tag翻译成这是my标签<br/>
$dtp->Assign($id,'这是my标签<br/>');
else if($tag->GetName()=='test')
$dtp->Assign($id,'这是test标签<br/>');
}
//把解析好的html文本echo出来
$dtp->Display();
?>
***root/test.tpl.htm 网页模板
{tianya:my att1=1 att2='2'} [field:my/] {/tianya:my} {tianya:test att1=1 att2='2'} [field:test/] {/tianya:test}
执行root/test.php就能查看结果
由上面的例子可以看出解析式模板运作的套路:
1php文件调用网页模板,并显示。
2htm文件提供网页的大体框架,等待数据来完善网页的具体内容,称为网页模板。
上面的代码就是把第一个标签(my标签)显示为这是my标签<br/>;第二个标签显示为这是test标签<br/>。
上面的代码是怎么办妥的
更改***root/test.php如下
<?php
require_once (dirname(__file__).'/include/common.inc.php');
//利用解析式模板所需的文件
require_once (dirname(__file__).'/include/dedetag.class.php');
$dtp=new DedeTagParse();
//设置命名空间,由于下面的标签用tianya命名空间,所以要设置一下。
$dtp->SetNameSpace('tianya');
$dtp->LoadTemplate(dirname(__file__).' est.tpl.htm ');
var_dump($dtp); //这是查看解析结果的重要方法
?>
***root/test.tpl.htm 网页模板
{tianya:my att1=1 att2='2'} [field:my/] {/tianya:my} {tianya:test att1=1 att2='2'} [field:test/] {/tianya:test}
可以看到$dtp对象的内部结构,其中有一个DedeTag类的数组CTags,DedeTag类的定义见root/include/ dedetag.class.php。最好不要直接用DedeTag类的字段,而用DedeTag提供的函数。比如用tag1->GetName()而不是用tag1->TagName。花一小段时间就能把DedeTag类看完,这些语法在以后自定义标签时会有用。
再看一个例子,***root/test.php
<?php
require_once (dirname(__file__).'/include/common.inc.php');
require_once (dirname(__file__).'/include/dedetag.class.php');
function lib_my($att1,$att2)
{
return '这是my标签<br/>属性值'.$att1.$att2.'<br/>';
}
$dtp=new DedeTagParse();
$dtp->SetNameSpace('tianya');
$dtp->LoadTemplate(dirname(__file__).' est.tpl.htm');
foreach ($dtp->CTags as $id=>$tag)
{
if($tag->GetName()=='my')
$dtp->Assign($id , lib_my($tag->GetAtt('att1'),$tag->GetAtt('att2')));
}
$dtp->Display();
?>
***root/test.htm 网页模板
{tianya:my att1=1 att2='2'} [field:my/] {/tianya:my} {tianya:test att1=1 att2='2'} [field:test/] {/tianya:test}
会发现模板解析中有四种“势力”
在include/ DedeTagParse.class.php中定义的解析引擎类,负责读取模板,把其中的dedecms标签替换成具体html文本。DedeTagParse、SetNameSpace、LoadTemplate就是类里面的方法。
标签翻译需要一些转换规则,lib_my就是这一类根据标签的属性和具体数据得出html。
待显示的php创建编译引擎类对象,对模板进行编译,在Display时,echo出html文件。
htm模板,调用标签,用html的形式写出动态网页的效果,属于被翻译的部分。Html模板主要负责界面层次,利用封装好的标签进行内部处理。
☉本站的源码不会像其它下载站一样植入大量的广告。为了更好的用户体验以后坚持不打水印
☉本站只提供精品源码,源码在于可用,不在多!!希望在这里找到你合适的。
☉本站提供的整站程序,均带数据及演示地址。可以在任一源码详情页查看演示地址
☉本站所有资源(包括源码、模板、素材、特效等)仅供学习与参考,请勿用于商业用途。
☉如有其他问题,请加网站客服QQ(984818011)进行交流。
- 织梦dede首页列表页获取文章对应的tag标签
- 织梦dede导航栏目顶级和二级判断二级输出不同url
- 织梦dede标签array runphp静态生成乱码BUG解决方法
- 织梦dede如何禁止会员发布文章内容带超链接
- 织梦ajax跨域提交自定义表单和跨域验证码问题
- 织梦CMS MIP文章内容页图片适配百度MIP规范
- 织梦CMS时间格式实现XX秒前、XX分钟前、XX天前
- 织梦DedeCMS更新系统缓存增加清理沉余缓存的功能
- 织梦CMS让channelartlist标签支持currentstyle属性的
- 织梦dede自带编辑器替换百度ueditor编辑器
- 织梦DEDECMS整站动态化或整站静态化设置方法
- 织梦dede 模板路径templets目录都有什么?