天天看點

PHP dedecms 子欄目不見了,完美解決

今日,pm發來需求:更改中偶然發現背景 《更新文檔HTML》隻生成首頁,新作的需求看不到效果,于是就開始找問題。

此檔案inc_channel_unit_functions.php 代碼:

//--------------------------------
//獲得某ID的下級ID(包括本身)的SQL語句“($tb.typeid=id1 or $tb.typeid=id2...)”
//-----------------------------
function TypeGetSunID($ID,&$dsql,$tb="#@__archives",$channel=0,$onlydd=false)
{
	//echo "--".$ID."--".$dsql."--".$tb."--".$channel."--".$onlydd."--"."~!";
		//echo "--".$ID."--".$tb."--".$channel."--".$onlydd."--"."~!";
		$GLOBALS['idArray'] = array();
		TypeGetSunTypes($ID,$dsql,$channel);
		$rquery = "";
		foreach($GLOBALS['idArray'] as $k=>$v)
		{
			if($onlydd){
				$rquery .= ($rquery=='' ? $k : ",{$k}");
			}else{
			  if($tb!="")
			     $rquery .= ($rquery!='' ? " Or {$tb}.typeid='$k' " : " {$tb}.typeid='$k' ");
		    else
		  	   $rquery .= ($rquery!='' ? " Or typeid='$k' " : " typeid='$k' ");
		  }
		}
			//echo "+++++".$rquery."+++++";
		if($onlydd) return $rquery;
		else return " (".$rquery.") ";
}
           

找到這裡,這是查詢子欄目的sql,始終沒看明白怎麼查詢的,隻看到了結果,繼續找這個方法

TypeGetSunTypes
           
//-----------------------------
// 傳回與某個目相關的下級目錄的類目ID清單(删除類目或文章時調用)
//由于PHP有些版本存在Bug,不能直接使用同一數組在遞歸邏輯,隻能複制副本傳遞給函數
//-----------------------------
function TypeGetSunTypes($ID,&$dsql,$channel=0)
{
		global $_Cs;

		//echo "----$_Cs----------";
		$GLOBALS['idArray'] = array();
		if( !is_array($_Cs) ){ require_once(dirname(__FILE__)."/../data/cache/inc_catalog_base.php"); }
		TypeGetSunTypesLogic($ID,$_Cs,$channel);
		return $GLOBALS['idArray'];
}
           

看到這個檔案:/../data/cache/inc_catalog_base.php

部分代碼:

<?php
global $_Cs;
$_Cs=array();
$_Cs[9]=array(0,1,1);
$_Cs[7]=array(0,1,1);
$_Cs[35]=array(0,1,1);
$_Cs[11]=array(0,1,1);
$_Cs[12]=array(0,1,1);
$_Cs[13]=array(0,1,1);
$_Cs[14]=array(0,1,1);
$_Cs[17]=array(0,1,1);
$_Cs[26]=array(0,1,1);
$_Cs[21]=array(0,1,1);
$_Cs[22]=array(0,1,1);
$_Cs[16]=array(0,1,1);
$_Cs[24]=array(0,1,1);
$_Cs[15]=array(0,1,1);
$_Cs[19]=array(0,1,1);
$_Cs[23]=array(0,1,1);
$_Cs[18]=array(0,1,1);
$_Cs[820]=array(0,1,1);
$_Cs[28]=array(0,1,1);
$_Cs[822]=array(0,1,1);
$_Cs[2233]=array(0,1,1);
$_Cs[2279]=array(0,1,1);
$_Cs[2379]=array(0,1,1);
$_Cs[2391]=array(0,1,1);
$_Cs[2434]=array(0,1,1);
$_Cs[42]=array(6,1,1);
$_Cs[43]=array(6,1,1);
$_Cs[44]=array(6,1,1);
$_Cs[45]=array(6,1,1);
$_Cs[30]=array(7,1,1);
$_Cs[31]=array(7,1,1);
$_Cs[32]=array(7,1,1);
$_Cs[48]=array(7,1,1);
$_Cs[52]=array(8,1,1);
           

到此,就執行不下去啦。沒辦法調試了,問下别人,說是這個檔案是系統自動生成,添加欄目與子欄目的對應關系,都存在這個檔案。

所有這個方法:

function TypeGetSunTypesLogic($ID,$sArr,$channel=0)
{
		if($ID!=0) $GLOBALS['idArray'][$ID] = $ID;
		foreach($sArr as $k=>$v)
		{
			if( $v[0]==$ID && ($channel==0 || $v[1]==$channel ))
			{
				 TypeGetSunTypesLogic($k,$sArr,$channel);
			}
		}
}
           

就有了含義,這個代碼的目的是,周遊inc_catalog_base.php 裡面的對應關系,讀出來供我們使用。

這就明了了,原來inc_catalog_base.php 少了資料,最近的三個大欄目對應關系沒有了。原因是前段時間,伺服器被攻擊,臨時救場,誤替換了本配置檔案。

最後 根據資料庫表 archives 的對應關系select id,reid,topid,channeltype,isdefault,corank,templist,ishidden,ispart from arctype where reid='2779'  limit 100;

查找出對應關系,補充完丢失的對應關系。重新登入背景,進行HTML文檔更新,一切正常。

補充:本人以整體的方式了解php,具體文法細節,方法功能仍不太了解,望了解dedecms 的朋友,能較長的描述一下這幾個php檔案裡面,關于擷取欄目以及子欄目ID的具體細節。