在“
怎样自定义织梦标签初探”这篇文章中对织梦标签,作了初次探索,现在就举一个具体的例子,来学习一下织梦是标签是如何写的,这个例子比较综合,与一般简单的标签有很大不同,而且,相当复杂,做好心理准备。今天给一个朋友开发一个在线下载并且在线支付功能的网站,所以,对这个作了一个系统的研究,就是标签{dede:field name='softlinks'/}
虽然,感觉里面的还有些东西,现在不能理解,但是最后,还是开发完了,有很多东西看多了,写多了虽然,不知道具体的是什么意思,但是知道会用。今天就把我的开发成果,作一个总结,也把通过这个例子,加深一下对织梦标签的理解,相信以后,还会用到的。
因为是下载站,{dede:field name='softlinks'/}是里面最难,最核心,少了它一切都是空谈,但也是最复杂的,我们分析这个标签如何从数据库调用出来的,在数据库里面又是以什么样的形式存在,又是如何插入到数据库的。
我们倒着分析,即先分析,如何插入到数据库的,当我们发布软件的时候,如下图所示。
我们要把从本地或手动指定软件下载地址,作完这一工作后,我们点击“确实”,此时,会通过soft_add.php把我们无论手工上传的,还是手工指定的都以类似{dede:link} $softurl {/dede:link}这种形式,插入到数据库表dede_addonsoft里面的字段softlinks里面了,我添加了一个,打开对应的表找到字段softlinks,这个字段的值,如下图所示。
现在我们明白了,实际上标签{dede:softlinks/}要调用的是上图中的以{dede:link}开始以{/dede:link}结束的字符串,我们想一下,如果这样直接调用的话,是不是调出来的就是一个标签形式的字符串?是的,没有错,如果这样我们调用了来的就不是下载地址了,而是多了二个大括号,例如:上图中字段softlinks的值是:"{dede:link text='DedeCms3.1全新安装程序'} http://www.dedebase.com/upimg/soft/dedesoft/dedecmsv3.1.rar {/dede:link}",我们应当调用的是中间的http://www.dedebase.com/upimg/soft/dedesoft/dedecmsv3.1.rar,所以,我们就要对softlinks这个字段值,进行处理。
处理方法,跟另一篇“怎样自定义织梦标签初探”这篇文章里的类似,但又有很大的不同。
在内容模板即article_soft.htm里面,用标签{dede:field name='softlinks'/}来调用,这个标签调出来的是生成的静态页面,(例如 类似www.dedebase.com/a/downloads/80.html)里面的代码<a href='/plus/download.php?open=0&aid=80&cid=3'>进入下载地址列表</a>,标签源码是include/taglib/channel/softlinks.lib.php。
这个标签源码文件softlinks.lib.php的功能,就是在生成静态网页时,把标签{dede:field name='softlinks'/}通过模板引擎,变成<a href='/plus/download.php?open=0&aid=80&cid=3'>进入下载地址列表</a>,他的作用就是这个作用,也就是这个标签源码功能到此为止。但是如果在后台设置的链接方式是跳转到另一个页面下载,那么,还会生成类似/download.php?open=2&id={$refObj->ArcID}&uhash={$uhash}代码,这个代码是我们点击“进入下载地址列表”后,显示的代码。
真正下载的功能其实是plus/download.php这个文件,标签源码只是把下载连接解析出来,并生成对应的链接方式,而要真正去处理下载的是download.php,我们打开这个文件,找到else if($open==2)这句代码开始,前面几行就是做初始化准备,例如判断有没有下载软件资源等。
我们看下面的代码。
上面的代码是这个文件里面的核心代码,他的功能就是从数据库表里面,把字段softlinks的值即如下图所示。
把上面的softlinks的字段值,即字符串,循环遍历出下载地址,现在我们详细分析一下这些代码。
首先引入静态模板引擎文件dedetag.class.php,这是必须的,然后,实例化,把softlinks字段值载入,具体载入做了什么,可以去研究一下LoadSource()这个方法。实际上它的作用就是把字段softlinks的值,变成数组标记CTags,我们打印一下这个数组CTags,如下所示。
Array
(
[0] => DedeTag Object
(
[IsReplace] =>
[TagName] => link
[InnerText] => http://www.dedebase.com/upimg/Server.zip
[StartPos] => 0
[EndPos] => 113
[CAttribute] => DedeAttribute Object
(
[Count] => 0
[Items] => Array
(
[text] => 服务器环境使用版
)
)
[TagValue] =>
[TagID] => 0
)
[1] => DedeTag Object
(
[IsReplace] =>
[TagName] => link
[InnerText] => http://www.dedebase.com/upimg/Debug.zip
[StartPos] => 115
[EndPos] => 229
[CAttribute] => DedeAttribute Object
(
[Count] => 0
[Items] => Array
(
[text] => 本地测试专业完整版
)
)
[TagValue] =>
[TagID] => 1
)
)
我们看到CTags是一个二维数组,数组里面是每个成员是一对象,对象里面又包括一个对象,这个对象里面又包括一个数组。通过foreach循环遍历后,我们就可以通过$ctag->GetInnerText()取出里面对应的下载地址,例如上面的
http://www.dedebase.com/upimg/Server.zip
http://www.dedebase.com/upimg/Debug.zip
这二个就是通过$ctag->GetInnerText()取得的,这二个就是我们下载的真实的地址。
回过头来看一下,下载标签源码softlinks.lib.php,它也通过跟download.php里面的几步。
1.引入模板引擎dedetag.class.php,在include/taglib里面的文件无需引入,默认就包含了这个文件。
2.实例化对象:new DedeTagParse()
3.载入模板字符串,LoadSource($fvalue);这里面的$favlue类似,字段softlinks的值,或是含有标记的字符串。
4.循环遍历标记数组CTag foreach($dtp->CTags as $ctag),然后,通过$ctag->GetInnerText()来得到标记之间的文本,即类似上面的http://www.dedebase.com/upimg/Debug.zip。
请注意,这与织梦其它标记,例如loop.lib.php有很大的不同,在loop等这样的织梦标签里面,是先把InnerText值载入到模板字符串,因为,这个值并不是像上面的下载一样,从表中某个字段获得的,而是标记之间的文本,这样理解起来有点难,多看一下织梦这些标签就能发现这点不同。
在softlinks.lib.php里面,通过$row['downtype']即链接显示方式,分成二大部分代码,一部分是直接显示地址列表,另一部分是要求进入下载地址列表页,然后,再判断“附件下载方式”,最后,在内容页生成下载链接页。