dedecms添加自定义图片字段,出现的问题

来源:互联网 发布:网络语笔芯是啥意思 编辑:程序博客网 时间:2024/05/17 17:15

项目中碰到一个问题,dedecms的文章模型,只有一个缩略图,然后就是文章内容,编辑器中,可能也有多图上传等,能得到图片。通过内容中得到也不明确(我研究的还未到那么深入)。

文章,除了缩略图,还需要一个logo图,所以,就打算修改下 “文章模型”,新增一个logo图片上传字段即可,这个字段,会添加到 addtable 对应的数据表中(addonarticle)。

所有都按正常走的,上传等也顺利,数据库中也有了,但打开数据库一看,里面保存的内容是:

{dede:img text='' width='2534' height='1138'} /uploads/161027/1-16102G12Z1930.png {/dede:img}

这个好像不是我们预想的,就在网上查了下,很多人碰到这个问题,解决方案一会再说,我们来看下,保存文章时,这里的逻辑:

1.article_add.php中,$dopost = "save" 逻辑块:

    //分析处理附加表数据    $inadd_f = $inadd_v = '';    if(!empty($dede_addonfields))       // 附加的字段    {        $addonfields = explode(';',$dede_addonfields);      // 以 ';' 分隔多个字段        if(is_array($addonfields))        {            foreach($addonfields as $v)     // 循环处理每个字段            {                if($v=='') continue;                $vs = explode(',',$v);      // 每个字段,有2个信息:0-得到的字段值 | 1-字段类型                if($vs[1]=='htmltext'||$vs[1]=='textdata')                {                    ${$vs[0]} = AnalyseHtmlBody(${$vs[0]},$description,$litpic,$keywords,$vs[1]);   // 处理html文本                }                else                {                    if(!isset(${$vs[0]})) ${$vs[0]} = '';                    ${$vs[0]} = GetFieldValueA(${$vs[0]},$vs[1],$arcID);        // 处理其他字段                }                $inadd_f .= ','.$vs[0];                $inadd_v .= " ,'".${$vs[0]}."' ";            }        }    }

这里就是,我们的图片字段,就是在这里的 GetFieldValueA() 里进行处理的。

2.分析GetFieldValueA()方法,在 dede/inc/inc_archives_functions.php 中,它又去调用 

---------------

就在此时,我写这篇博客时,出现了个意外。。就是要去调用的这个函数,我给找错位置了。。。

---------------

1>我是通过 ctags 插件定位的,有2个文件,我找的是:

dede/inc/inc_archives_all.php

2>而这次,看到另外一个文件好像似曾相识,在article_add.php开头好像引入过,文件名是:

include/customfields.func.php

这2个文件极度相似,都是出力自定义字段的。里面都包含3个方法:

1)GetFormItem() - 获取一个附加表单字段(用于新增)

2)GetFormItemValue() - 同样是获取一个附件表单字段,但是:是在编辑时,它里面会填充我们之前保存的值(用于编辑)

3)GetFieldValue() - 处理不同类型的数据。新增和编辑,最终字段值的处理,得使用它

---------------

其实,我写这篇博客的一个主要原因是:发现了dede/inc/inc_archives_all.php 处理img字段的一个小错误,我想记录下,没想到不是用的这个文件(怀疑这个文件可能会被弃用)

先看下错误吧:

    /*        模型添加字段中的 '图片-img' 数据类型     */    else if($dtype=="img")    {        $iurl = stripslashes($dvalue);        if(trim($iurl)=="")        {            return "";        }        // 1.清除站点域名前缀(本站图片引用,没有http前缀)        $iurl = trim(str_replace($GLOBALS['cfg_basehost'],"",$iurl));        $imgurl = "{dede:img text='' width='' height=''} ".$iurl." {/dede:img}";        // 2.以 'http' 开头,非本站点的 '远程图片' + isUrlOpen        if(preg_match("#^http:\/\/#i", $iurl) && $GLOBALS['isUrlOpen'])     // 1>这里使用的是 '$GLOBALS['isUrlOpen']'        {            //远程图片            $reimgs = "";            /*                 2>这里使用的却是 '$isUrlOpen'                (是不是错误了?得在函数中先使用 global $isUrlOpen ?。还是上面通过$GLOBALS引过一次后,在函数内就可以直接使用了??)             */            if($isUrlOpen)            {                $reimgs = GetRemoteImage($iurl,$GLOBALS['adminid']);        // 获取远程图片到本地                if(is_array($reimgs))                {                    $imgurl = "{dede:img text='' width='".$reimgs[1]."' height='".$reimgs[2]."'} ".$reimgs[0]." {/dede:img}";                }            }            else            {                $imgurl = "{dede:img text='' width='' height=''} ".$iurl." {/dede:img}";        // 使用远程图片地址            }        }
注意红色的部分,就是这里不对!!!函数中,想调用外部的全局变量,无非就2种方式:1.global $a;  2.$GLOBALS['a'],这里我还天真的以为这种可以,测试了下,没有这种恶可能性,所以这里是错误的!!

再来看看 include/customfields.func.php 里的img的逻辑处理:

    else if($dtype=='img' || $dtype=='imgfile')    {        // 匹配到 '/upload/userup' | '\upload\userup',可能windows和linux不能的目录风格,不做处理<span style="white-space:pre"></span>if(preg_match("#[\\|/]uploads[\\|/]userup#", $dvalue)) return $dvalue;        // diy - 自定义模式(diy - do it yourself,我之前看过discuz,它里面有个专门的这种应用,很强大 )        if($admintype=='diy')        {            $iurl = MemberUploads($fieldname, '', 0, 'image', '', -1, -1, false);            return $iurl;        }        $iurl = stripslashes($dvalue);        if(trim($iurl)=='')        {            return '';        }        $iurl = trim(str_replace($GLOBALS['cfg_basehost'],"",$iurl));        $imgurl = "{dede:img text='' width='' height=''} ".$iurl." {/dede:img}";        if(preg_match("/^http:\/\//i", $iurl) && $GLOBALS['cfg_isUrlOpen'])     // 1>这里使用的是 '$GLOBALS'        {            //远程图片            $reimgs = '';            if($GLOBALS['cfg_isUrlOpen'])       // 2>这里使用的也是 '$GLOBALS',同上面的纠正过来了            {                $reimgs = GetRemoteImage($iurl,$adminid);                if(is_array($reimgs))                {                    if($dtype=='imgfile')                    {                        $imgurl = $reimgs[1];       // $reimgs[0] 应该才是 '图片地址',怀疑这里错误!!                    }                    else                    {                        $imgurl = "{dede:img text='' width='".$reimgs[1]."' height='".$reimgs[2]."'} ".$reimgs[0]." {/dede:img}";                    }                }            }            else            {                if($dtype=='imgfile')                {                    $imgurl = $iurl;                }                else                {                    $imgurl = "{dede:img text='' width='' height=''} ".$iurl." {/dede:img}";                }            }        }        else if($iurl != '')        {            //站内图片            $imgfile = $cfg_basedir.$iurl;            if(is_file($imgfile))            {                $info = '';                $imginfos = GetImageSize($imgfile,$info);                if($dtype=="imgfile")                {                    $imgurl = $iurl;                }                else                {                    $imgurl = "{dede:img text='' width='".$imginfos[0]."' height='".$imginfos[1]."'} $iurl {/dede:img}";                }            }        }        return addslashes($imgurl);    }

</pre><p></p><pre>
3.通过分析上面的代码,可以看出,img字段的处理,却是是程序中故意加的这种格式。{dede:img}标签中,同时也存储了后端php获取到的图片的宽、高尺寸,这应该是没有问题的。所以,我们不应该在源码中,改变这种形式,程序中有的地方可能就是这么使用的。

网上有一种解决方案,我就直接粘贴了,不自己再造轮子了,分2步:

1>创建自定义函数

打开 /include/extend.func.php 文件(注:这个文件就是系统预留的自定义函数接口文件,主要用于二次开发用的。如果你是老版本,默认没有这个文件,自己创建一个PHP文件即可)

// 获取 'img-图片' 附加字段图片地址// 针对 '{dede:img text='' width='2534' height='1138'} /uploads/161027/1-16102G12Z1930.png {/dede:img}' 格式function GetOneImgUrl($img,$ftype=1){       if($img <> ''){           $dtp = new DedeTagParse();           $dtp->LoadSource($img);           if(is_array($dtp->CTags)){               foreach($dtp->CTags as $ctag){                   if($ctag->GetName()=='img'){                       $width = $ctag->GetAtt('width');                       $height = $ctag->GetAtt('height');                       $imgurl = trim($ctag->GetInnerText());                       $img = '';                       if($imgurl != ''){                           if($ftype==1){                               $img .= $imgurl;                           }                           else{                               $img .= '<img src="'.$imgurl.'" width="'.$width.'" height="'.$height.'" />';                           }                       }                                                  }               }           }           $dtp->Clear();           return $img;           }   }  

2>调用我们创建的自定义函数

[field:自定义图片字段名 function="GetOneImgUrl(@me,显示类型)"/]比如:我们的自定义图片字段名为 imgurl ,那么调用方式有以下两种:引用[field:imgurl function='GetOneImgUrl(@me,0)'/] <!--调用图片的信息,自动调用宽度和高度(已包含Html代码的<img />标签)-->[field:imgurl function='GetOneImgUrl(@me,1)'/] <!--只调用图片地址,一般可用于背景图嵌套-->

到此,结束了!


0 0