本文講述了帝國CMS專題調用標簽eshowzt不支持標簽模板使用程序代碼的解決方法。涉及針對帝國CMS源碼的修改。分享給大家供大家參考,具體如下:
一、問題:
在項目開發中需要在首頁調用專題,且專題增加了“專題自定義字段”:副標題(ftitle),需要在欄目名調用出比較簡短的副標題。
使用【專題調用標簽】eshowzt并設置對應的標簽模板,在標簽模板的list.var部分勾選【使用程序代碼】,編寫代碼如下:
<li><a href="[!--classurl--]">'.ReturnZtAddField('[!--classid--]','ftitle').'</a></li>
';
專題調用標簽寫好后刷新首頁,發現勾選【使用程序代碼】無效,就是說使用【專題調用標簽】eshowzt的時候list.var部分無法使用程序代碼。
二、分析:
查看帝國CMS源碼,找到專題調用標簽eshowzt對應的函數:sys_ShowZtData(位于e/class/t_functions.php約1860行)
分析源碼找到如下代碼:
$tr=sys_ReturnBqTemp($tempid);
此處獲取模板ID號對應的模板相關變量,包括:模板名(tempname),頁面模板內容(temptext)、列表內容模板(list.var)(listvar)以及是否使用程序代碼(docode)等。
注意:此處的關鍵就在于是否使用程序代碼(docode)字段!
再找到
$repvar=ReplaceShowClassVars($no,$listvar,$r,$num,1,$subnews);
分析函數ReplaceShowClassVars可以發現該函數并未接受與處理【使用程序代碼】字段docode,至此就明白了為什么【專題調用標簽】eshowzt在標簽模板勾選【使用程序代碼】的情況下并未作出代碼解析的原因!
三、解決方法:
步驟1. 新增【使用程序代碼】字段,在e/class/t_functions.php頁面下找到函數function sys_ShowZtData,并在“取得模板”部分添加$docode字段:
$tr=sys_ReturnBqTemp($tempid);
$docode=$tr[docode];//新增項,判斷標簽模板是否使用程序代碼
如下圖所示:
該步驟可獲取是否使用程序代碼的標志信息。
步驟2. 還是在步驟1中e/class/t_functions.php頁面的函數function sys_ShowZtData中,修改“替換列表變量”部分為自定義函數user_ReplaceShowClassVars,代碼如下:
//$repvar=ReplaceShowClassVars($no,$listvar,$r,$num,1,$subnews);
$repvar=user_ReplaceShowClassVars($no,$listvar,$r,$num,1,$subnews,$docode);
如下圖所示:
PS:仔細對比就能看出,此處的自定義函數比原先的函數多了一個針對$docode的接收處理。
步驟3. 在e/class/t_functions.php頁面底部添加自定義函數user_ReplaceShowClassVars:
具體代碼如下:
function user_ReplaceShowClassVars($no,$listtemp,$r,$num,$ecms=0,$subnews=0,$docode){
global $public_r,$class_r;
//欄目鏈接
if($ecms==1)
{
$classurl=sys_ReturnBqZtname($r);
$r['classname']=$r['ztname'];
$r['classid']=$r['ztid'];
$r['classimg']=$r['ztimg'];
}
else
{
$classurl=sys_ReturnBqClassname($r,9);
}
if($subnews)
{
$r[intro]=sub($r[intro],0,$subnews,false);
}
$listtemp=str_replace("[!--classurl--]",$classurl,$listtemp);
//欄目名稱
$listtemp=str_replace("[!--classname--]",$r[classname],$listtemp);
//欄目id
$listtemp=str_replace("[!--classid--]",$r[classid],$listtemp);
//欄目圖片
if(empty($r[classimg]))
{
$r[classimg]=$public_r[newsurl]."e/data/images/notimg.gif";
}
$listtemp=str_replace("[!--classimg--]",$r[classimg],$listtemp);
//欄目簡介
$listtemp=str_replace("[!--intro--]",nl2br($r[intro]),$listtemp);
//記錄數
$listtemp=str_replace("[!--num--]",$num,$listtemp);
//序號
$listtemp=str_replace("[!--no--]",$no,$listtemp);
//針對docode=1(執行程序代碼)的情況statr
if($docode==1)
{
$listtemp=stripSlashes($listtemp);
eval($listtemp);
}
//針對docode=1(執行程序代碼)的情況end
return $listtemp;
}
經過上述三步,問題解決!
PS:這里主要修改的代碼就是針對$docode的判斷與執行代碼,如果將ReplaceShowClassVars函數也添加對應的$docode處理:
{
$listtemp=stripSlashes($listtemp);
eval($listtemp);
}
也能解決問題,但考慮到還有其他頁面調用該函數的情況,因此使用自定義函數user_ReplaceShowClassVars相對來說不會影響其他程序的運行。