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_info
function
=
'(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字段弄合理,具体操作我今天就不讲了,上面的两个方法已经是绝对行得通的。
由于我知道怎么改数据库,我用的是第一个办法。其实第二个办法更通用。