删除栏目的织梦函数DelType()

admin2019-12-21912

函数名: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。

网友评论