当我们建立了多个栏目后,如果不想要某个栏目了,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这个参数,这个指的是目录,所以,我们要获取这个目录,要获取这个就得查询栏目表:
这里面的$id就是要删除的栏目id,然后查询之。把字段typedir查询出来,这个字段对应的内容如下图所示:
3. 判断$row['typedir']是哪种类型的栏目,若是第一种即目录相对位置是前二种如下图所示:
则,通过
进行替换,然后,调用删除目录函数
若是这种类型的并且有子栏目在在根目录,也就是上面的“武侠”栏目,则根据顶级栏目topid=$id的进行查询,把所有在根目录生成的栏目,每查询一次就删除一个,当然,如果这个栏目下面还有子栏目,还有在根目录生成的这样交叉的,也没有关系递归删除之,这就是这个函数$file->RmDirFiles($typedir)的好处。这一小段代码如下:
由于比较简单,就不分析了,这些代码在织梦基地已经多次分析过了。
4. 另外一种就是不是直接在a文件夹建立顶级栏目,而是在根目录里面建立顶级栏目,在这个栏目下面再建立子栏目,这里面的子栏目有可能有的也在根目录里面建立栏目。
这类的处理要比上面的处理简单,用了十几分钟就写完了,这个好判断直接判断typedir字段里面的第一个符号是不是“/”这个,若是说明是根目录,替换掉这个符号,然后删除之。
同样的道理在这个顶级栏目建立的子栏目不一定只在这个目录里面,如果只在这个目录里面,只写一个删除就行了,所以,还要判断一下有没有子栏目也生成在了根目录里面,若有,则跟第一类的处理方式一样,代码几乎一样,这里不用多解释了。
总结:虽然,这个小小的开发,功能不大,但是,因为是第一次开发删除栏目功能,所以,用了一下午的时间重新把织梦处理文件的代码读了一遍,通过这次小小开发,学到了不少东西:查php手册很重要、多研究织梦源码很重要、认真很重要、好好总结织梦开发方法很重要,学会分享很重要!
插件下载地址
安装方法:下载下来文件,把文件覆盖在/dede/文件夹里面,如果你改了这个后台名,那就是你改后的名,例如,我后台把dede改成abc,那么就上传到abc文件夹里面。要注意,你安装的哪个版本程序就下载哪个。
删除方法:
1. 这个就更简单了,点击栏目后面的删除,如下图所示:
2. 选择“是”,点击“确定”,如下图所示:
删除成功!
要注意的是,要删除一个栏目,由于此功能会把这个栏目下面的所有html都删除掉,所以,在删除栏目前要备份数据库,以免删错了栏目。