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)'/] <!--只调用图片地址,一般可用于背景图嵌套-->
到此,结束了!
- dedecms添加自定义图片字段,出现的问题
- DedeCMS织梦自定义图片字段调用出现{dede:img ..}
- dedecms栏目添加字段--栏目自定义字段
- dedecms 自定义模型中图片字段无法选择及无法上传问题的解决方案
- DedeCMS添加自定义字段调用不出值的解决办法
- 如何删除织梦Dedecms已添加的自定义字段
- DedeCMS添加自定义字段调用不出值的解决办法
- 织梦DedeCMS系统自定义字段的图片调用
- DedeCMS 自定义图片字段调用的有关问题解决{dede:img .}
- 织梦5.6 5.7(DedeCMS)自定义图片类型字段的调用
- 为DedeCMS系统自定义字段的图片去掉宽高
- 织梦dedecms — 添加自定义字段
- 织梦dedecms栏目添加自定义字段
- 解决dedecms中图片字段报错的问题
- 解决织梦(DedeCMS)系统自定义字段图片调用问题
- dedecms 织梦会员中心前台,自定义图片字段上传后无法选中选择问题
- Web_PHP_DedeCMS织梦自定义图片字段调用的问题出现{dede:img ..}
- dedecms的文章和栏目的自定义字段的添加、调用以及完全删除方法
- C++中的内联函数inline总结
- 回退版本
- Leetcode 126. Word Ladder II[hard]
- oracle使用DBMS_SCHEDULER调度作业
- Python列表乘法小记
- dedecms添加自定义图片字段,出现的问题
- hdu1503_Advanced Fruits LCS变形
- Fast and Accurate Image Upscaling with Super-Resolution Forests
- 怎么解决Ubuntu14.04不能打正确拼音
- UVa489
- 交叉编译器的制作
- Java中内存泄露问题
- svn 上传.a文件失败问题
- android应用获取通知栏权限