dedecms 添加自定义图字段,调用时出错
1:发现问题
按照以往一样高兴的认为网站就绪了,谁知道出现一个小插曲。
使用dedecms 的站长们应该知道,当一个模型的字段的不能够满足我们项目的需求的时候就会自己创建一些字段,哈今天我就遇到了耶,在创建 图片字段的时候没有问题,数据库什么的一切正常,当我调取dede标签的时候使用刚创建的图片字段,发现数据调取来的是这样的,这个{dede:img} 是什么鬼?
我理想中的目标应该是这样的
2:解决问题
后来在网上查了一些资料然后去源码里面看发现 include/customfields.func.php
else if($dtype=='img' || $dtype=='imgfile') { // 匹配到 '/upload/userup' | 'uploaduserup',可能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); }
通过分析上面的代码,可以看出,img字段的处理,却是是程序中故意加的这种格式。{dede:img}标签中,同时也存储了后端php获取到的图片的宽、高尺寸,这应该是没有问题的。所以,我们不应该在源码中,改变这种形式,程序中有的地方可能就是这么使用的。
3:解决方案
打开 /include/extend.func.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; } }
前端调用方式
[field:自定义图片字段名 function="GetOneImgUrl(@me,显示类型)"/] 比如:我们的自定义图片字段名为 imgurl ,那么调用方式有以下两种: 引用 [field:imgurl function='GetOneImgUrl(@me,0)'/] <!--调用图片的信息,自动调用宽度和高度(已包含Html代码的<img />标签)--> [field:imgurl function='GetOneImgUrl(@me,1)'/] <!--只调用图片地址,一般可用于背景图嵌套--> (一般使用这个)