织梦下载标签分析

在 怎样自定义织梦标签初探 这篇文章中对织梦标签,作了初次探索,现在就举一个具体的例子,来学习一下织梦是标签是如何写的,这个例子比较综合,与一般简单的标签有很大不同,而且,相当复杂,做好心理准备。今天给一个朋友开发一个在线下载并且在线支付功
  在“怎样自定义织梦标签初探”这篇文章中对织梦标签,作了初次探索,现在就举一个具体的例子,来学习一下织梦是标签是如何写的,这个例子比较综合,与一般简单的标签有很大不同,而且,相当复杂,做好心理准备。今天给一个朋友开发一个在线下载并且在线支付功能的网站,所以,对这个作了一个系统的研究,就是标签{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']即链接显示方式,分成二大部分代码,一部分是直接显示地址列表,另一部分是要求进入下载地址列表页,然后,再判断“附件下载方式”,最后,在内容页生成下载链接页。
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

dedecms织梦无需登录注册可下单购买的修改,首先找到/plus/carbuaction.php文件,找到如下代码: //确认用户登录信息if($cfg_ml-IsLogin()){ $userid = $cfg_ml-M_ID;}else{ $username = trim($username); $password = trim($password); if(empty($username)
用过织梦dedecms的人都知道,织梦会员系统相当强大,跟论坛程序差不多,对于使用会员系统的人来说,织梦系统足够用的了,但是,有时候,织梦系统很多的地方又不是我们所希望,或都说,有的地方不适合我们使用,这时候就要对织梦会员系统进行二次开发,所以,
我们在做 织梦模板 开发时,有时需要在artlist 和list标签中调用出图集中的图片,同时可以自定调用几张图片。跟版网整理了个一个这样功能的自定义函数。调用后效果如下: dedecms织梦artlist和list标签调用图集图片实现方法 函数代码 请将代码加入到 /includ
大家都知道,Discuz程序在发文章时有个【隐藏】功能,可以限制这个隐藏内容供某些级别的会员查看。 在织梦模板中,做些改动,也是可以实现的。例如:电话号码,下载地址等等。 前提是织梦开启会员功能,已经有了自定义字段。 一、建立文件 ajax_loginsta_c.p
大家在使用织梦的时候,用到会员中心可能涉及到多二级域名同步登录退出的问题,涉及到跨域,那么这个问题该如何解决呢?在一个技术大牛博客看到过此教程,特此转发分享给大家,解决大家问题。 首先打开 \include\dedeajax2.js 找到 DedeXHTTP = new XMLHttpR
大家在使用织梦标签调用手机站内容页上一篇下一篇的时候,发现下一篇调用的是上一篇的内容,织梦DEDE默认手机版内容页面点击下一篇却跳转到了上一篇怎么办? 这段代码可能是官方写错造成的,首先找到网站目录下面的/include/arc.archives.class.php文件,打