标题写得自己都觉得累赘,还是觉得表达不清楚,所以先看图:
这是无意中发现的一个问题,之前好像都是正常的,可能是调整了模板的关系。代码处本来也该同下方的卡片一样显示的,但就是没法显示。问题原因很简单,因为我在图书简介中使用了wikitext类型的数据,而且还做了内链。如果删除内链,显示就正常了。
不过,这也不是根本的解决之道,毕竟在图书页面上,采用内链也是为了方便浏览者能够快速了解和跳转到某些条目,况且之前做过多少类似的工作还不清楚,全删了好像也不现实。
看来只能修改模板了。
检查代码也没有发现什么特别之处,只是隐约觉得哪里不对劲。
原来简介部分因为字数太多,我采用了截断方式,出错的那本正好截断在内链的位置上,[[
保留了,]]
却被截掉了。既然知道问题在哪里,那么解决办法就是把wikitext整体转换成普通文本,所有的内链都不生成。
可惜,这个思路是错的。我也是在折腾许久之后才意识到,简介内容是通过Cargo直接存储和调用的,截断也是发生在Cargo查询中,所以用解析式也好扩展也好都没用。
既然是Cargo查询,那么就是做数据处理将[[]]
替换掉。原来的查询代码片段如下:
CONCAT( LEFT( Book_Others.Introduction, 80 ), IF( LENGTH( Book_Others.Introduction ) > 80, "……", "" ) )
所以只要在执行LEFT前先用REPLACE函数将[[]]
处理掉就行了(貌似要执行两次,不知道有没有更好的办法一次性解决掉):
CONCAT( LEFT( REPLACE( REPLACE( Book_Others.Introduction, "[[", ""), "]]", ""), 80 ), IF( LENGTH( Book_Others.Introduction ) > 80, "……", "" ) )
代码虽然啰嗦了一点,但好歹把问题解决了。
默认情况下,REPLACE函数是不能用的,所以要在LocalSettings.php中加入如下代码:
$wgCargoAllowedSQLFunctions[] = 'REPLACE';
注:无意中倒是解决了之前的另外一个问题,见《Cargo查询中,如果使用group by之后怎样合并数据》。