dede独立模型无法调用缩略图的问题
dede有很强的扩展性,对于会二次开发的人来说,这极大的增加了灵活性,其中独立模型就是一种很好的设计。
但是这个独立模型在底层代码方面不是很严谨(dede的不严谨之处还有很多),我在前台调用litpic属性的时候,发现无论我是否添加了缩略图,显示的都是dede的默认图片。这绝对是一个bug。
一 我们先来分析一下出现这个错误的原因
调用文章列表的标签是arclist,而独立模型的文章列表的调用标签是arclistsg,注意别用错了。下面是调用示例
{dede:arclistsg titlelen='60' row='3' }
<div class="zhuant">
<a href="\[field:arcurl /\]" target="_blank">
<img style="float: left; border: #CCCCCC 1px solid; margin: 6px 4px 4px 4px;" src="\[field:litpic/\]" height="63" width="84">
<font style="margin-left: 10px;">
<strong>
\[field:title /\]
</strong>
<br>
</font>
</a>
<p>
<a href="\[field:arcurl /\]" target="_blank"><font style="margin-left: 10px;">\[field:person_info function='(strlen("@me")>50 ? cn_substr("@me",50)."…":"@me")' /\]\[详情\]</font> </a>
</p>
</div>
{/dede:arclistsg}
这样调用从dede的官方规则上来说是没有任何问题的,但是,你会发现[field:litpic/]
和[field:person_info
function``=``'(strlen("@me")>50 ? cn_substr("@me",50)."…":"@me")'``/]
都显示不出来。
根据arclistsg这个调用标签我们知道处理独立问题文章列表的php文件是/include/taglib/arclistsg.php。
在大约229行附近有这么一段代码
if($row\['litpic'\] == '-' || $row\['litpic'\] == '')
{
$row\['litpic'\] = $GLOBALS\['cfg_cmspath'\].'/images/defaultpic.gif';
}
if(!preg_match("#^http:\\/\\/#i", $row\['litpic'\]) && $GLOBALS\['cfg_multi_site'\] == 'Y')
{
$row\['litpic'\] = $GLOBALS\['cfg_mainsite'\].$row\['litpic'\];
}
这段代码的意思是如果缩略图的url不存在,就将他的url设置成默认图片的url。
经过测试,发现在这个地方无论如何$row[``'litpic'``]
都是不存在的。
怪事!
而在普通文章中$row[``'litpic'``]
是能显示出来的,我们去看看普通文章列表的底层代码,/include/taglib/arclist.php。
这个文件的代码和/arclistsg.php几乎差不多,为什么一个能显示出来而一个显示不出来呢,仔细对比才发现,这两个文件在查询文章列表的时候sql语句的限制条件是不一样的。
查询普通模型下的文章直接查处这个表的所有字段,而查询独立模型文章字段必须包含在这个变量里面
$arclistquery
我调试出来发现$arclistquery变量里面确实没有litpic和person_info 两个字段。
而$arclistquery得内容来自于频道模型的dede_channeltype表的listfields字段。dede_channeltype表的listfields字段里面没有litpic和我自定义的person_name.所以你得不到这两个的内容。
现在清楚了,dede在我们建立独立模型的时候,没有将我们可能想获取的字段合理的保存下来。这是根本原因。
我的疑问有两点
1.为什么要这样设计,为什么不像普通文章一样,读取文章的所有字段,而是要单独做限制。
2.既然单独限制了,为什么不考虑全面些,让用户用的如此不爽。
二 原因分析清楚了,现在我们来看看解决办法
1.如果你能修改数据库,我的建议是你在独立模型的表channeltype里面找到对应的模型listfields字段,将你想显示的字段名称加上去,比如我有个人物的独立模型,
这个模型对应的listfields字段里面本来是channel,arcrank,mid,click,title,senddate,flag,lastpost,scores,goodpost,badpost
我修改成channel,arcrank,mid,click,title,senddate,flag,lastpost,scores,goodpost,badpost,litpic,person_info
灰色是我增加的。
这样修改的好处是不需修改源码,但是每增加一个独立模型,你都需要修改一次。
2.在/include/taglib/arclistsg.php里面将读取文章的sql语句不做查询字段限制。
找到$arclistquery = join(',', $listarcs);在这一行下面添加
$arclistquery="arc.*";
这样限制就被我的覆盖了。
这个方法的好处是可以不必管数据库,但是dede的设计思想就被我们阉割了一点点,虽然她本身的设计就有问题。
3.在添加模型的代码里面设法将channeltype的listfields字段弄合理,具体操作我今天就不讲了,上面的两个方法已经是绝对行得通的。
由于我知道怎么改数据库,我用的是第一个办法。其实第二个办法更通用。