当我们建立了多个栏目后,如果不想要某个栏目了,dedecms默认情况下在后台删除了栏目后,这个栏目对应的文件夹和这里面对应的html文件都不能删除掉,这就麻烦了,还要登录ftp再去删除相应的文件夹和相应的html文件,如果栏目多的话,不小心看花了眼可能把其它“长像”一样的文件夹错删除这就不好了,所以,织梦基地完善了织梦后台删除栏目功能,只要在后台删除这个栏目,那么,不管这个栏目下面的子栏目是在这个相对栏目里面,还是在根目录里面都可以一起删除掉。
我们先看一下如何删除栏目,其实非常简单,例如后台,直接在要删除的栏目后面点击删除即可,如下图所示:
点击“删除”后,就进入到了下面的对话界面,这时候无论你选中“是”还是“否”,织梦默认下都不能删除这个栏目生成的文件夹和对应的html文件。
经过研究作了一下简单的织梦二次开发,把下面的代码放到文件dede/catalog_del.php里面,具体位置是搜索代码:$ut = new TypeUnit();
在这行代码下面放入下面的代码:
开发原理分析:
要删除一个栏目牵涉的内容比较多,例如,当我们在后台建立一个栏目后,就会在这栏目表dede_arctype 记录了栏目相关信息,若是在这个栏目里面发布了一篇文章或图片,或软件等,如果再有用户评论,管理员再回复过,那就关系到评论表dede_feedback,微表dede_arctiny,主表dede_archives等,还有会员表,统计信息表,所以,要删除一个栏目就要连带着把这些相关的信息一起删除掉,如果你上传了附件的话,还要把这个附件内容也删除掉。
是不是很麻烦?是的,非常麻烦,但是,不用担心织梦帮我们做好了,都已经封装好了(不过那个附件织梦好没有写),我们直接拿过来用就行了,这就是二次开发的好处,省不少事,如果自己去写一个系统的话,光处理这个栏目得花太多时间。
现在的问题是具体细节问题织梦帮我们做好了,而接下来就是我们如何删除栏目及其相关的html,要把这个问题弄明白,需要研究一下建立栏目的几种方式:
1. 建立顶级栏目使用织梦默认的,就是建立顶级栏目都放在文件夹a里面,然后,假设在这个a下面建立“小说”顶级栏目如下图所示:
如果只有顶级的删除就简单了,但是,如果在下面建立几个子栏目,这样相比一个栏目就麻烦了,不过织梦也帮我们封装好了,只是用个递归遍历删除即可,这还不是麻烦的。
还有一种就是在a下面建立子栏目并且,这个子栏目不在a里面,而是放在根目录里面,这是最麻烦的,因为,如果全部在a文件夹下面的话,我们用递归就解决掉了,而现在就不行了,所以,这要重新判断一下在文件夹a下面建立的一个栏目下面是不是有子栏目,这个子栏目是不是在a下面,然后,如果不在a下面,再判断一下就是不是在根目录里面,这一系统正是这次我开发时遇到困难,不过最后,也花了很短时间搞定了。
2. 与第一种类似,这种建立的栏目是直接在根目录下面建立栏目,然后,在这个根目录下面再建立子栏目,在子栏目下面再建立栏目,这些栏目有的可能在这个目录里面,有的可能又回到根目录里面,这一点跟上面类似,所以,解决了上面的问题,就解决了第二种方法里面的子栏目在根目录的问题。
建立栏目的种类,绝对跑不出去上面二大类,通过上面的分析,我们知道要删除一个目录只要照着上面的原理写就可以了。
代码分析开始:
1. 经过我的研究发现织梦有一个文件管理逻辑类file_class.php,专门处理文件的,这里面有一个方法RmDirFiles($indir),它是用来删除栏目的,而且是递归删除,分析一下这个代码我们发现,他连文件夹里面的文件也一起删除,正好是我们需要的。
2. 查询要删除的栏目对应的路径,因为,上面的函数里面需要$indir这个参数,这个指的是目录,所以,我们要获取这个目录,要获取这个就得查询栏目表: