织梦开发实战手册

织梦列表页无图显示默认图片

织梦列表页在展示图文列表时,如果文档没有上传缩略图,litpic 字段会是空的或返回 /images/defaultpic.gif,前端就会出现破图或一片空白。要让它优雅地显示一张默认占位图,有模板判断、SQL 过滤、JS 兜底几种思路,下面分别说明。

一、问题原因分析

织梦在文档未上传缩略图时,dede_archives 表的 litpic 字段默认写入 /images/defaultpic.gif。但有两种情况会偏离预期:

  • 采集或批量导入的文档,litpic 可能是空字符串 ''
  • 迁移服务器后默认图路径变了,原 defaultpic.gif 不存在
  • 自定义模型没有继承默认图逻辑,字段直接为 NULL

所以单纯靠系统默认值并不稳妥,需要在模板层做一次判断。

二、方案一:模板标签 runphp 判断

这是最推荐的做法,在 listarclist 标签里用 runphp="yes"litpic 做判断:

{dede:arclist row="10" typeid="5"}
<li>
  [field:array runphp="yes"]
    if(empty(@me['litpic']) || @me['litpic']=='/images/defaultpic.gif'){
      @me['litpic']='/images/no-img.png';
    }
  [/field:array]
  <a href="[field:arcurl/]">
    <img src="[field:litpic/]" alt="[field:title/]">
  </a>
</li>
{/dede:arclist}

核心逻辑:[field:array] 把整行数据作为数组传入,@me['litpic'] 取缩略图字段,为空或等于系统默认图时替换成自定义占位图。

更简洁的写法

[field:litpic runphp="yes"]
if(@me=='' || @me=='/images/defaultpic.gif'){
  @me='/images/no-img.png';
}
[/field:litpic]

这种写法只针对单字段,不用调 array,性能更好。

三、方案二:SQL 标签里直接判断

dede:sql 自定义查询时,可以在 SQL 层用 IFCASE 处理:

{dede:sql sql="SELECT 
  id,title,
  IF(litpic='' OR litpic='/images/defaultpic.gif',
     '/images/no-img.png',litpic) AS litpic,
  typedir
FROM dede_archives WHERE typeid=5 ORDER BY id DESC LIMIT 10"}
  <a href="[field:typedir/]/[field:id/].html">
    <img src="[field:litpic/]">[field:title/]
  </a>
{/dede:sql}

好处是数据库层就处理好,模板里直接输出,不依赖织梦标签引擎,渲染速度更快。

四、方案三:前端 JS 兜底

如果不想动模板,可以在页面底部加一段 JS,对所有 img 的 onerror 做兜底:

<script>
document.querySelectorAll('img[data-src]').forEach(function(img){
  img.onerror=function(){
    this.src='/images/no-img.png';
    this.onerror=null;
  };
});
</script>

配合 img 标签加 data-src 属性使用。这种方案对动态加载的内容也有效,但依赖 JS 执行,爬虫抓取时可能仍看到破图,对 SEO 不友好,不建议作为首选。

五、默认图片的尺寸与样式处理

占位图最好和真实缩略图保持相同比例,否则列表会出现高度跳变。建议:

  • 占位图尺寸与 arclistimg 标签的 width/height 一致
  • CSS 里给 imgobject-fit:cover 防止变形
  • 占位图用纯色背景 + 文字提示(如“暂无图片”),视觉上不突兀
.list-img img{
  width:200px;
  height:140px;
  object-fit:cover;
  background:#f5f5f5;
}

六、修改系统默认图路径

如果不想逐个模板改,可以直接替换系统默认图。打开 /images/defaultpic.gif,用同名文件覆盖即可。但要注意:

升级织梦版本时 /images/ 目录可能被覆盖,自定义默认图会丢失。建议把改动后的图备份一份,或直接在模板里写死路径更稳妥。

也可以改系统参数:后台 → 系统设置 → 系统基本参数 → 附件设置里,把“缩略图默认图片”改成自定义路径(部分版本不支持此项,需看具体版本)。

七、注意事项

  • runphp 标签里不能用单引号包裹含单引号的字符串,字符串里有斜杠要注意转义
  • 列表页用 list 标签时同样支持 runphp,写法一致
  • 动态浏览模式下 runphp 性能略低,建议开启页面缓存
  • 如果用了自定义模型,litpic 字段名可能不同,需对应改成实际字段名

把默认图兜底逻辑统一封装进公共模板片段(如 list_item.htm),全站列表位 include 引用,后续换占位图只改一处即可。这个细节看似小,却直接影响列表页的视觉完整度,值得在模板开发初期就规划好。