dede独立模型无法调用缩略图的问题

dede有很强的扩展性,对于会二次开发的人来说,这极大的增加了灵活性,其中独立模型就是一种很好的设计。

但是这个独立模型在底层代码方面不是很严谨(dede的不严谨之处还有很多),我在前台调用litpic属性的时候,发现无论我是否添加了缩略图,显示的都是dede的默认图片。这绝对是一个bug

这篇文章在我的个人网站发表:http://jcodecraeer.com/a/phpjiaocheng/2012/0712/312.html

一 我们先来分析一下出现这个错误的原因


调用文章列表的标签是arclist,而独立模型的文章列表的调用标签是arclistsg,注意别用错了。下面是调用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   {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_infofunction='(strlen("@me")>50 ? cn_substr("@me",50)."…":"@me")'/]都显示不出来。


根据arclistsg这个调用标签我们知道处理独立问题文章列表的php文件是/include/taglib/arclistsg.php。

在大约229行附近有这么一段代码

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值