【www.bbyears.com--dedecms教程】
织梦arclist调用副栏目不显示,网上关于这个问题的解决办法有很多,其中一种是:
打开/include/taglib/arclist.lib.php,代码约位于295-296行,查找以下两行代码:
if($CrossID=="") $orwheres[] = " arc.typeid IN (".GetSonIds($typeid).")";
else $orwheres[] = " arc.typeid IN (".GetSonIds($typeid).",".$CrossID.")";
将其替换成以下代码:
if($CrossID=="") $orwheres[] = " (arc.typeid IN (".GetSonIds($typeid).") OR arc.typeid2 IN (".GetSonIds($typeid).")) ";
else $orwheres[] = " (arc.typeid IN (".GetSonIds($typeid).",".$CrossID.") OR arc.typeid2 IN (".GetSonIds($typeid).",".$CrossID.")) ";
这种办法可以解决typeid="2"的情况下不显示副栏目的问题, 如果typeid=“2,3,8”,有多个栏目需要调用副栏目就不行了
怎么解决这个问题,找到262行, $orwheres[] = " arc.typeid IN ($typeid) ";
直接替换为: $orwheres[] = " arc.typeid IN ($typeid) or arc.typeid2 IN ($typeid)";
问题产生的原因,看下arclist.lib.php原始代码:( typeid为主栏目id, typeid2为副栏目id)
找到246行:
//指定了多个栏目时,不再获取子类的id
if( preg_match("#,#", $typeid) ) //如果typeid字段匹配逗号, 就是说typeid调用多个栏目,例如:typeid=“2,3,8”
{
//指定了getall属性或主页模板例外
if($getall==1 || empty($refObj->Fields["typeid"]))
{
$typeids = explode(",", $typeid);
foreach($typeids as $ttid) {
$typeidss[] = GetSonIds($ttid);
}
$typeidStr = join(",", $typeidss);
$typeidss = explode(",", $typeidStr);
$typeidssok = array_unique($typeidss);
$typeid = join(",", $typeidssok);
}
$orwheres[] = " arc.typeid IN ($typeid)"; //导致typeid="2,3,8"情况下不能调用副栏目问题产生的地方
}
else //如果typeid不匹配逗号,就是调用一个栏目 例如 typeid="2"
{
//处理交叉栏目
$CrossID = "";
if($ctag->GetAtt("cross")=="1")
{
$arr = $dsql->GetOne("SELECT `id`,`topid`,`cross`,`crossid`,`ispart`,`typename` FROM `dede_arctype` WHERE id="$typeid" ");
if( $arr["cross"]==0 || ( $arr["cross"]==2 && trim($arr["crossid"]=="") ) )
{
$orwheres[] = " arc.typeid IN (".GetSonIds($typeid).")";
}
else
{
$selquery = "";
if($arr["cross"]==1) {
$selquery = "SELECT id,topid FROM `dede_arctype` WHERE typename LIKE "{$arr["typename"]}" AND id<>"{$typeid}" AND topid<>"{$typeid}" ";
}
else {
$arr["crossid"] = preg_replace("#[^0-9,]#", "", trim($arr["crossid"]));
if($arr["crossid"]!="") $selquery = "SELECT id,topid FROM `dede_arctype` WHERE id IN("{$arr["crossid"]}") AND id<>"{$typeid}" AND topid<>"{$typeid}" ";
}
if($selquery!="")
{
$dsql->SetQuery($selquery);
$dsql->Execute();
while($arr = $dsql->GetArray())
{
$CrossID .= ($CrossID=="" ? $arr["id"] : ",".$arr["id"]);
}
}
}
}
if($CrossID=="") $orwheres[] = " arc.typeid IN (".GetSonIds($typeid).")";
else $orwheres[] = " arc.typeid IN (".GetSonIds($typeid).",".$CrossID.")"; //导致typeid="2"情况下不能调用副栏目问题产生的地方
}