找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1864|回复: 0

[分享] 织梦下载标签分析

[复制链接]
发表于 2018-3-22 09:35:59 | 显示全部楼层 |阅读模式 来自 中国–河南–新乡
在“怎样自定义织梦标签初探”这篇文章中对织梦标签,作了初次探索,现在就举一个具体的例子,来学习一下织梦是标签是如何写的,这个例子比较综合,与一般简单的标签有很大不同,而且,相当复杂,做好心理准备。今天给一个朋友开发一个在线下载并且在线支付功能的网站,所以,对这个作了一个系统的研究,就是标签{dede:field name='softlinks'/}

  虽然,感觉里面的还有些东西,现在不能理解,但是最后,还是开发完了,有很多东西看多了,写多了虽然,不知道具体的是什么意思,但是知道会用。今天就把我的开发成果,作一个总结,也把通过这个例子,加深一下对织梦标签的理解,相信以后,还会用到的。

  因为是下载站,{dede:field name='softlinks'/}是里面最难,最核心,少了它一切都是空谈,但也是最复杂的,我们分析这个标签如何从数据库调用出来的,在数据库里面又是以什么样的形式存在,又是如何插入到数据库的。

  我们倒着分析,即先分析,如何插入到数据库的,当我们发布软件的时候,如下图所示。
1.webp

  我们要把从本地或手动指定软件下载地址,作完这一工作后,我们点击“确实”,此时,会通过soft_add.php把我们无论手工上传的,还是手工指定的都以类似{dede:link} $softurl {/dede:link}这种形式,插入到数据库表dede_addonsoft里面的字段softlinks里面了,我添加了一个,打开对应的表找到字段softlinks,这个字段的值,如下图所示。
2.webp


  现在我们明白了,实际上标签{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)这句代码开始,前面几行就是做初始化准备,例如判断有没有下载软件资源等。

  我们看下面的代码。

3.webp

  上面的代码是这个文件里面的核心代码,他的功能就是从数据库表里面,把字段softlinks的值即如下图所示。
4.webp


  把上面的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']即链接显示方式,分成二大部分代码,一部分是直接显示地址列表,另一部分是要求进入下载地址列表页,然后,再判断“附件下载方式”,最后,在内容页生成下载链接页。

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

关闭

站长推荐上一条 /1 下一条

QQ|侵权投诉|广告报价|手机版|小黑屋|西部数码代理|飘仙建站论坛 ( 豫ICP备2022021143号-1 )

GMT+8, 2024-12-23 17:26 , Processed in 0.042470 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表