当前位置:首页 > 帝国CMS学习

帝国CMS系统标签符号[!---转换成[!--问题

作者:Shu | 时间:2021-02-03 | 栏目:帝国CMS学习 | 围观热度:1264

今天在整理帝国CMS笔记的时候,突然发现帝国CMS程序会自动将“[!--”转换成[!--的问题,让人一下子看不懂了,页面显示效果如下:

后台列表效果
后台列表效果

前台显示效果
前台显示效果

这种不似显示不美观,对搜索引擎可能也不太好。因为自己不是SEO方面的专业人士,所以只是猜测。为了了解当中的具体原因,我仔细查看了帝国CMS源代码,发现帝国CMS会在你增加或者修改信息的时候,会把模型中的字段的值带有“[!--”转换成[!--,具体表现为:

1、为什么帝国CMS为有这般操作?

其实熟悉帝国CMS的人不难发现,帝国CMS的标签是以“[!--”开始的,如果程序不提前做处理,就有可能在前台输出显示造成错误显示的情况。比如讲:编辑在字段里加上[!--temp.header--],如果不转换,程序就会认为这是一个系统标签,然后把它转换成具体的变量值,这样就会造成我们的前端页面显示错误的表达信息。

2、如何处理遇到的这个问题呢?

想法1:我刚开始的想法是自己写一个公共函数,然后在输入显示的位置去调用一下这个函数就好了。但是当我真正这样去操作的时候,发现要改的地方太多了,所以不太现实。
想法2:依然使用这个公共函数,利用帝国CMS提供的字段后台增加/修改信息处理函数,发现没起效果,原因是自定义处理函数在前,模板变量字符替换在后,所以没效果。
想法3:还是使用这个公共函数,利用帝国CMS7.5版本提供的模型后台增加/修改信息函数, 这个方法是可行的。有个小缺点:就是需要多一次查询、更新数据库。
想法4:直接修改官方源码,对特定的字段做跳过处理。这个方法的缺点就是需要改源码,如果后期升级,代码一覆盖,这个功能会就还原回来。

以上想法只有3、4可使用,下面对3、4想法做具体的操作。
想法3的操作:在/e/class/userfun.php添加如下代码:(此方法只适用于帝国CMS7.5版本

//返回模板符
function sTempvarHy($mid,$isadd,$isq,$classid,$id,$cs){
    global $empire,$dbtbpre,$class_r;
    if($classid && $id) {
        $tbname = $class_r[$classid]['tbname'];
        if($_POST['checked']==0) {
            $tbname .= '_check';
        }

        //仅仅对title字段做了操作,其他字段的可以自行追加
        $infor = $empire->fetch1("select title from {$dbtbpre}ecms_{$tbname} where id='$id' limit 1");
        $title = str_replace('[!--','[!--',$infor['title']);
        $empire->query("update {$dbtbpre}ecms_{$tbname} set title='$title' where id='$id' limit 1");
    }
}

然后在后台的管理系统模型->后台增加信息后处理函数|后台修改信息后处理函数填写sTempvarHy即可。

方法4的操作:打开e/class/functions.php查找“$value=RepTempvarPostStrT($value,$modispagef);”将其替换成

//仅仅对title字段做了操作,其他字段的可以自行追加
if($f!='title') {
      $value=RepTempvarPostStrT($value,$modispagef);
}

3、此问题的使用场景

对于97%的帝国CMS用户是不会遇到这样的问题,这种问题的出现一般只存在于使用帝国CMS程序做有关于帝国CMS技术方面的网站,其他内容的网站就是字段有使用了[!--字符,程序做了转换自己也不会觉得有什么不妥的。此文章仅在记录在使用帝国CMS中发现的问题及解决问题的想法。