删除栏目的织梦函数DelType()
函数名:DelType($id, $isDelFile),其中, $id 栏目ID,$isDelFile 是否删除文件。
所在文件:include/typeunit.class.php,在约339行。
功能:
删除类目,但不能删除栏目对应的文件夹以及静态文件。
这个函数用到的知识比较多,但是这个函数不能删除对应的文件夹和里面的静态文件,所以,如果我们在后台删除了一个栏目,那么,还要到空间里面把相应的文件夹和静态html文件删除。这可能是出织梦官方出于安全考虑,但是,我们会完善一下,只要在后台删除一个栏目,那么,相关的静态文件,以及附件一起删除。
源码分析:
1、该函数先定义二个变量,$this->idCounter、$this->idArray,以备后用。
2、获得栏目id,当然包括要删除栏目的本身的id的函数$this->GetSunTypes($id),关于这个函数已经有详细分析,如果对这个函数不了解请去看一下这个函数的分析。
3、查询栏目表#@__arctype和#@__channeltype,把栏目表里面的字段全部取出,因为,是删除栏目,当然就要把栏目表取出来,以备后用,并且,把模型表#@__channeltype里面的“频道名称”typename和该栏目对应的附加表取出来,一起构成一个新表。然后,从这个表执行GetOne($query),把查询出来的数组存放到变量$typeinfos里面。
4、把“多站点支持”和“绑定域名”查询出来:SELECT moresite,siteurl FROM `#@__arctype` WHERE id='".$typeinfos['topid']."',从这个sql查询来看,查出来的是些id,我们以删除栏目“网页基础”也就是这个顶级栏目id为1的栏目,通过这个条件只要是id='".$typeinfos['topid']即,id=0的栏目的查出对应的moresite,siteurl,但是,id=0在数据库里面不存在,因为,栏目表或其它表最小的值也是1。难道织梦写错了?不要这么快下结论,先向下看代码。
5、取出要删除栏目id对应的:目录地址、附加表、栏目属性值和默认页的名称(一般栏目默认的名称是index.html),对应的代码分析别是
$indir = $typeinfos['typedir']; $addtable = $typeinfos['addtable']; $ispart = $typeinfos['ispart']; $defaultname = $typeinfos['defaultname'];
6、删除数据库里的相关记录:通过一下个foreach遍历,来删除数据库里面的数据,代码如下。
因为通过上面的我们知道$this->idArray是一个数组,所以,foreach一下,然后,通过GetOne("SELECT * FROM `#@__arctype` WHERE id='$id'")获取一个条件为id=$id的数组$myrow,这个数组会在后面用到。接下来判断这个取出的记录顶级id,即$myrow['topid']是不是大于零,若等于零则说明是顶级栏目,若大于零说明是某一栏目的子栏目,例如,我们以栏目“HTML”为例子,他对应的id为2,他对应的$myrow['topid']值为1,即$myrow['topid']>0。
接着执行:$mytoprow = $this->dsql->GetOne("SELECT moresite,siteurl FROM `#@__arctype` WHERE id='".$myrow['topid']."'")这一行代码是查询id=$myrow['topid']的,即id=1栏目,也就是栏目“html”的顶级栏目“网页基础”栏目对应的moresite,siteurl字段。
若$mytoprow是一个数组,且不空,说明,我们查询到了栏目“html”的顶级栏目了。
再遍历一下$mytoprow,代码如下。
foreach($mytoprow as $k=>$v) { if(!preg_match("/[0-9]/",$k)) { $myrow[$k] = $v; } }
通过遍历这个$mytoprow,最后得到的是$myrow['moresite']=1,$myrow['siteurl']='http://www.xxxcom。我们看一下数据库表dede_arctype,如下图所示。
对应的后台如下图所示。
以下代码全部是为下面删除服务的,到此为止,下面才是真正要删除的代码。
7、删除单独页面代码如下:
if($myrow['ispart']==2 && $myrow['typedir']=='') { if( is_file($this->baseDir.'/'.$myrow['defaultname']) ) { @unlink($this->baseDir.'/'.$myrow['defaultname']); } }
上面代码是删除文件保存目录即$myrow['typedir']为空的,且是“外部边接”文件的默认页。只要在织梦后台建立栏目,一定会在对应的栏目里面建立一个默认页面index.html上面的代码就是要删除这个文件。
8、 删除数据库信息代码如下:
$this->dsql->ExecuteNoneQuery("DELETE FROM `#@__arctype` WHERE id='$id'"); $this->dsql->ExecuteNoneQuery("DELETE FROM `#@__arctiny` WHERE typeid='$id'"); $this->dsql->ExecuteNoneQuery("DELETE FROM `#@__archives` WHERE typeid='$id'"); $this->dsql->ExecuteNoneQuery("DELETE FROM `#@__spec` WHERE typeid='$id'"); $this->dsql->ExecuteNoneQuery("DELETE FROM `#@__feedback` WHERE typeid='$id'"); if($addtable!="") { $this->dsql->ExecuteNoneQuery("DELETE FROM $addtable WHERE typeid='$id'"); }
上面这段代码都非常简单,从上面的代码我们可以看出,一个栏目的建立后,都会在栏目表#@__arctype,微表#@__arctiny,主表#@__archives,专题表#@__spec和附加表中记录下栏目的相关信息,还要删除评论表里面的相应的评论信息,因为,要评论首页要在某个栏目下面的某个页面,这个页面不可能不属于某个栏目。
9、删除独立页面,代码如下。
if($ispart==2 && $indir=="") { if( is_file($this->baseDir."/".$defaultname) ) { @unlink($this->baseDir."/".$defaultname); } }
跟上面的代码几乎完全一样,但是,二者是有区别是的,假如,我们删除栏目id为1的栏目,这个代码里面的判断$indir是为空,指的是栏目id=1的栏目为空。而上面的$myrow['typedir']等于空,指的是栏目id=1的子栏目是否为空。一个是顶级,一个是子栏目。
10、将数组的内部指针指向第一个单元,代码是@reset($this->idArray),为什么要把数组重新指向第一个单元,因为,上面我们用了一个遍历,指针指到最后一个了,所以,要重新指向第一个单元,万一后面再用到。成功删除返回true。