DedeCMS列表页完美实现“有缩略图则显示,无则不显示”终极指南(附代码与详细步骤)
在DedeCMS(织梦CMS)网站制作过程中,列表页调用文章缩略图是一个常见需求,默认的调用方式往往会显示无图片时的默认占位图,影响美观,本文将深入浅出地详解如何通过修改模板代码和少量PHP代码,完美实现“Dede列表有缩略图则显示,无缩略图则不显示”的效果,提升网站用户体验与专业度,本文提供从简单到高级的多种解决方案,确保不同技术水平的开发者都能轻松上手。
引言:为什么“有图才显示”如此重要?
作为一名资深的DedeCMS开发者,我经常遇到客户提出这样的需求:“我们的列表页,那些没有上传图片的文章,能不能别显示那个丑丑的默认图片或者灰色框?”
这个问题看似简单,却直接影响着网站的视觉呈现和用户体验。
- 提升视觉整洁度: 避免列表中出现大量“无图”占位符,使页面布局更加干净、统一。
- 增强用户吸引力: 缩略图是吸引用户点击阅读的“第一眼”,有吸引力的图片能有效提高点击率(CTR)。
- 优化代码结构: 从SEO角度看,避免展示无关的
<img>标签,有助于搜索引擎更准确地理解页面内容。
掌握“Dede列表有缩略图则显示”的技巧,是每一位DedeCMS程序员和网站运营者的必备技能,本文将为你提供最全面、最可靠的解决方案。
方案一:纯模板法(推荐首选,安全、简单、高效)
对于大多数用户来说,我们应优先选择不修改核心程序文件的方案,因为这样在DedeCMS升级时不会丢失修改,纯模板法是实现这一需求的最优解。
核心思路:
利用DedeCMS的[field:array]和[field:litpic/]标签结合if条件判断,在模板层面进行逻辑判断。
详细步骤:
-
登录DedeCMS后台,进入“模板” -> “默认模板管理”。
-
找到你当前使用的列表模板(通常是
list_article.htm)。 -
用代码编辑器打开该模板文件。
-
找到调用文章列表的核心代码,通常是以下两种形式之一:
-
形式A (默认loop标签):
{dede:list pagesize='10'} ...循环体... {/dede:list} -
形式B (arclist标签):
{dede:arclist titlelen='50' row='10'} ...循环体... {/dede:arclist}
-
-
修改循环体内的代码,将原来的缩略图调用代码替换为以下“有图才显示”的代码块:
{dede:list} <li> <!-- 其他字段,如标题、时间等 --> <a href="[field:arcurl/]">[field:title/]</a> <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span> <!-- ==================== 核心代码开始 ==================== --> <div class="list-img-box"> [field:array runphp='yes'] if(@me['litpic'] != '' && strpos(@me['litpic'], '/defaultpic.') === false && @me['litpic'] != '/images/defaultpic.gif'){ @me = '<a href="'.@me['arcurl'].'" title="'.@me['title'].'"><img src="'.@me['litpic'].'" alt="'.@me['title'].'" /></a>'; } else { @me = ''; } [/field:array] </div> <!-- ==================== 核心代码结束 ==================== --> </li> {/dede:list}
代码逻辑深度解析:
[field:array runphp='yes']...[/field:array]:这是一个强大的组合,它允许你获取当前文章的多个字段(如litpic,arcurl,title),并在runphp='yes'环境下使用PHP语法进行处理。@me['litpic']:@me在这里代表当前文章的整个字段数组,@me['litpic']就是指当前文章的缩略图地址。- 判断条件
if(@me['litpic'] != '' && strpos(@me['litpic'], '/defaultpic.') === false && @me['litpic'] != '/images/defaultpic.gif'):@me['litpic'] != '':第一重保险,判断缩略图地址是否为空,如果为空,说明根本没有上传图片。strpos(@me['litpic'], '/defaultpic.') === false:第二重保险,判断缩略图地址中是否包含/defaultpic.,这是DedeCMS默认无图缩略图的命名规律之一,能有效过滤掉系统默认的占位图。@me['litpic'] != '/images/defaultpic.gif':第三重保险,直接判断是否为另一个常见的默认无图地址,多重判断确保了万无一失。
@me = '...':如果以上所有条件都满足(即“有缩略图”),则将@me变量的值重新赋值为一个完整的<a>和<img>@me = '':如果条件不满足(即“无缩略图”),则将@me的值赋为空字符串,这样,在页面上渲染出来的结果就是空白,完美实现了“不显示”的效果。
方案二:修改PHP源码法(高级玩家,性能更优)
如果你追求极致的加载性能,或者网站文章数量巨大,不希望在每次页面加载时都由模板进行PHP逻辑判断,可以考虑修改DedeCMS的PHP源码。(警告:此方法涉及修改核心文件,升级DedeCMS时需要重新修改,请谨慎操作,并提前备份文件!)
核心思路:
修改/include/arc.listview.class.php文件,在列表数据查询阶段就过滤掉没有缩略图的文章,或为它们打上标记,让模板调用更简单。
详细步骤:
-
备份文件:务必在操作前备份
/include/arc.listview.class.php文件。 -
打开文件:用代码编辑器打开
/include/arc.listview.class.php。 -
查找关键代码:找到
Query(查询) 相关的代码段,通常在GetListSql()函数附近,我们需要在SQL查询语句中增加一个条件。 -
修改SQL查询:找到类似
$this->dsql->SetQuery("SELECT id,typename,typedir,isdefault,isdefaultpic,namerule2,moresite,siteurl,sitepath FROM#@__arctypeWHERE $typeid ORDER BY sortrank ASC");的代码块,它是在查询栏目,我们需要找到真正查询文章列表的SQL语句。- 在
GetList()函数中,找到生成文章列表SQL的核心部分,大约在200-300行之间(不同版本行号可能不同),找到类似这样的代码:$this->dsql->SetQuery("SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath FROM `#@__archives` arc LEFT JOIN `#@__arctype` tp ON arc.typeid=tp.id WHERE {$this->addSql} $ordersql LIMIT $limitstart,$row"); - 在
WHERE子句中增加条件,我们需要修改$this->addSql的构建逻辑,或者在最终的WHERE条件中增加一个对缩略图的判断,最稳妥的方式是找到$this->addSql被赋值的地方。 - 假设我们要直接修改最终的查询,可以将
WHERE子句修改为:// ... 原有的WHERE条件 ... AND (arc.litpic != '' AND arc.litpic NOT LIKE '%/defaultpic.%' AND arc.litpic != '/images/defaultpic.gif') // ... 原有的ORDER BY和LIMIT ...
- 更优雅的修改方式:在
GetListSql()函数中,找到构建$this->addSql的地方,将其修改为:// 假设这是原来的代码 // $this->addSql = " arc.arcrank > -1 ";
// 修改为 $this->addSql = " arc.arcrank > -1 AND (arc.litpic != '' AND arc.litpic NOT LIKE '%/defaultpic.%' AND arc.litpic != '/images/defaultpic.gif') ";
- 在
-
保存文件,然后清空DedeCMS的缓存(后台 -> 系统 -> 清空缓存)。
效果:
修改后,DedeCMS在查询数据库时,就已经把所有“没有有效缩略图”的文章排除在外了,你的模板文件里就可以直接使用最简单的 [field:litpic/] 标签,因为它100%是有值的,这种方法从根源上解决了问题,性能最佳,但牺牲了程序的“纯净性”。
常见问题与FAQ (FAQ)
Q1:我的网站有多个默认图片,nopic.jpg,怎么办?
A1:很简单,在方案一的 if 判断条件中,增加一个判断即可。&& @me['litpic'] != '/images/nopic.jpg',根据你的实际情况,灵活添加判断条件。
Q2:方案一和方案二,我应该选哪个? A2:对于99%的用户,请选择方案一。 它安全、无风险、易于维护,且对性能的影响微乎其微,方案二适合有特殊性能优化需求的专业开发者。
Q3:修改后,为什么还是显示默认图? A3:请检查以下几点:
- 是否正确修改了
list_article.htm模板文件? - 是否保存了模板文件并清空了网站缓存?
- 确认你上传的文章缩略图确实存在,并且没有被系统自动替换为默认图。
- 检查你的图片路径是否正确,是否使用了外部链接等。
Q4:我想让“无图”时显示一个自定义的图片,而不是空白,怎么办?
A4:只需修改方案一中的 else 分支即可。
else {
// @me = ''; // 原来的代码
@me = '<a href="'.@me['arcurl'].'" title="'.@me['title'].'"><img src="/images/my-custom-noimg.jpg" alt="暂无图片" /></a>'; // 修改为你的自定义图片
}
实现“Dede列表有缩略图则显示”功能,是提升DedeCMS网站品质的一个小细节,却蕴含着大学问。
- 方案一(纯模板法)是我们的首选,它利用了DedeCMS强大的模板引擎,通过巧妙地组合
[field:array]和runphp,在不修改任何核心文件的情况下,安全、高效地达成了目标,这是每一个DedeCMS使用者都应该掌握的技巧。 - 方案二(修改PHP源码法)则是一个进阶选择,它通过优化数据库查询来提升性能,适合对系统有极致追求的专业人士。
希望这篇详尽的指南能够帮助你完美解决列表页缩略图显示的问题,优秀的代码不仅要实现功能,更要兼顾安全、可维护性和用户体验,如果你在操作中遇到任何问题,欢迎在评论区留言交流。
