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字段弄合理,具体操作我今天就不讲了,上面的两个方法已经是绝对行得通的。

由于我知道怎么改数据库,我用的是第一个办法。其实第二个办法更通用。