帝国CMS专题调用标签eshowzt不支持标签模板使用程序代码的解决方法
<p>本文讲述了帝国CMS专题调用标签eshowzt不支持标签模板使用程序代码的解决方法。涉及针对帝国CMS源码的修改。分享给大家供大家参考,具体如下:</p>
<p>
<strong>一、问题:</strong></p>
<p>
在项目开发中需要在首页调用专题,且专题增加了“专题自定义字段”:副标题(ftitle),需要在栏目名调用出比较简短的副标题。</p>
<p>
使用【专题调用标签】eshowzt并设置对应的标签模板,在标签模板的list.var部分勾选【使用程序代码】,编写代码如下:<br>
</p>
<div>
代码如下:</div>
<div id="phpcode9">
$listtemp='<br>
<li><a href="[!--classurl--]">'.ReturnZtAddField('[!--classid--]','ftitle').'</a></li><br>
';</div>
<p>
</p>
<p>
专题调用标签写好后刷新首页,发现勾选【使用程序代码】无效,就是说使用【专题调用标签】eshowzt的时候list.var部分无法使用程序代码。</p>
<p>
<strong>二、分析:</strong></p>
<p>
查看帝国CMS源码,找到专题调用标签eshowzt对应的函数:sys_ShowZtData(位于e/class/t_functions.php约1860行)</p>
<p>
分析源码找到如下代码:<br>
</p>
<div>
代码如下:</div>
<div id="phpcode10">
//取得模板<br>
$tr=sys_ReturnBqTemp($tempid);</div>
<p>
</p>
<p>
此处获取模板ID号对应的模板相关变量,包括:模板名(tempname),页面模板内容(temptext)、列表内容模板(list.var)(listvar)以及是否使用程序代码(docode)等。</p>
<p>
注意:此处的关键就在于是否使用程序代码(docode)字段!</p>
<p>
再找到<br>
</p>
<div>
代码如下:</div>
<div id="phpcode11">
//替换列表变量<br>
$repvar=ReplaceShowClassVars($no,$listvar,$r,$num,1,$subnews);</div>
<p>
</p>
<p>
分析函数ReplaceShowClassVars可以发现该函数并未接受与处理【使用程序代码】字段docode,至此就明白了为什么【专题调用标签】eshowzt在标签模板勾选【使用程序代码】的情况下并未作出代码解析的原因!</p>
<p>
<strong>三、解决方法:</strong></p>
<p>
步骤1. 新增【使用程序代码】字段,在e/class/t_functions.php页面下找到函数function sys_ShowZtData,并在“取得模板”部分添加$docode字段:<br>
</p>
<div>
代码如下:</div>
<div id="phpcode12">
//取得模板<br>
$tr=sys_ReturnBqTemp($tempid);<br>
$docode=$tr;//新增项,判断标签模板是否使用程序代码</div>
<p>
</p>
<p>
</p>
<p>
该步骤可获取是否使用程序代码的标志信息。</p>
<p>
步骤2. 还是在步骤1中e/class/t_functions.php页面的函数function sys_ShowZtData中,修改“替换列表变量”部分为自定义函数user_ReplaceShowClassVars,代码如下:<br>
</p>
<div>
代码如下:</div>
<div id="phpcode13">
//替换列表变量<br>
//$repvar=ReplaceShowClassVars($no,$listvar,$r,$num,1,$subnews);<br>
$repvar=user_ReplaceShowClassVars($no,$listvar,$r,$num,1,$subnews,$docode);</div>
<p>
</p>
<p>
</p>
<p>
PS:仔细对比就能看出,此处的自定义函数比原先的函数多了一个针对$docode的接收处理。</p>
<p>
步骤3. 在e/class/t_functions.php页面底部添加自定义函数user_ReplaceShowClassVars:</p>
<p>
具体代码如下:<br>
</p>
<div>
代码如下:</div>
<div id="phpcode14">
////**************自定义替换栏目导航标签********************//<br>
function user_ReplaceShowClassVars($no,$listtemp,$r,$num,$ecms=0,$subnews=0,$docode){<br>
global $public_r,$class_r;<br>
//栏目链接<br>
if($ecms==1)<br>
{<br>
$classurl=sys_ReturnBqZtname($r);<br>
$r['classname']=$r['ztname'];<br>
$r['classid']=$r['ztid'];<br>
$r['classimg']=$r['ztimg'];<br>
}<br>
else<br>
{<br>
$classurl=sys_ReturnBqClassname($r,9);<br>
}<br>
if($subnews)<br>
{<br>
$r=sub($r,0,$subnews,false);<br>
}<br>
$listtemp=str_replace("[!--classurl--]",$classurl,$listtemp);<br>
//栏目名称<br>
$listtemp=str_replace("[!--classname--]",$r,$listtemp);<br>
//栏目id<br>
$listtemp=str_replace("[!--classid--]",$r,$listtemp);<br>
//栏目图片<br>
if(empty($r))<br>
{<br>
$r=$public_r."e/data/images/notimg.gif";<br>
}<br>
$listtemp=str_replace("[!--classimg--]",$r,$listtemp);<br>
//栏目简介<br>
$listtemp=str_replace("[!--intro--]",nl2br($r),$listtemp);<br>
//记录数<br>
$listtemp=str_replace("[!--num--]",$num,$listtemp);<br>
//序号<br>
$listtemp=str_replace("[!--no--]",$no,$listtemp);<br>
//针对docode=1(执行程序代码)的情况statr<br>
if($docode==1)<br>
{<br>
$listtemp=stripSlashes($listtemp);<br>
eval($listtemp);<br>
}<br>
//针对docode=1(执行程序代码)的情况end<br>
return $listtemp;<br>
}</div>
<p>
</p>
<p>
经过上述三步,问题解决!</p>
<p>
PS:这里主要修改的代码就是针对$docode的判断与执行代码,如果将ReplaceShowClassVars函数也添加对应的$docode处理:<br>
</p>
<div>
代码如下:</div>
<div id="phpcode15">
if($docode==1)<br>
{<br>
$listtemp=stripSlashes($listtemp);<br>
eval($listtemp);<br>
}</div>
<p>
</p>
<p>
也能解决问题,但考虑到还有其他页面调用该函数的情况,因此使用自定义函数user_ReplaceShowClassVars相对来说不会影响其他程序的运行。</p>
頁:
[1]