dede列表有缩略图则显示

99ANYc3cd6
预计阅读时长 22 分钟
位置: 首页 DEDE建站 正文

DedeCMS列表页完美实现“有缩略图则显示,无则不显示”终极指南(附代码与详细步骤)

在DedeCMS(织梦CMS)网站制作过程中,列表页调用文章缩略图是一个常见需求,默认的调用方式往往会显示无图片时的默认占位图,影响美观,本文将深入浅出地详解如何通过修改模板代码和少量PHP代码,完美实现“Dede列表有缩略图则显示,无缩略图则不显示”的效果,提升网站用户体验与专业度,本文提供从简单到高级的多种解决方案,确保不同技术水平的开发者都能轻松上手。


引言:为什么“有图才显示”如此重要?

作为一名资深的DedeCMS开发者,我经常遇到客户提出这样的需求:“我们的列表页,那些没有上传图片的文章,能不能别显示那个丑丑的默认图片或者灰色框?”

这个问题看似简单,却直接影响着网站的视觉呈现用户体验

  • 提升视觉整洁度: 避免列表中出现大量“无图”占位符,使页面布局更加干净、统一。
  • 增强用户吸引力: 缩略图是吸引用户点击阅读的“第一眼”,有吸引力的图片能有效提高点击率(CTR)。
  • 优化代码结构: 从SEO角度看,避免展示无关的<img>标签,有助于搜索引擎更准确地理解页面内容。

掌握“Dede列表有缩略图则显示”的技巧,是每一位DedeCMS程序员和网站运营者的必备技能,本文将为你提供最全面、最可靠的解决方案。


方案一:纯模板法(推荐首选,安全、简单、高效)

对于大多数用户来说,我们应优先选择不修改核心程序文件的方案,因为这样在DedeCMS升级时不会丢失修改,纯模板法是实现这一需求的最优解。

核心思路:

利用DedeCMS的[field:array][field:litpic/]标签结合if条件判断,在模板层面进行逻辑判断。

详细步骤:

  1. 登录DedeCMS后台,进入“模板” -> “默认模板管理”。

  2. 找到你当前使用的列表模板(通常是 list_article.htm)。

  3. 用代码编辑器打开该模板文件。

  4. 找到调用文章列表的核心代码,通常是以下两种形式之一:

    • 形式A (默认loop标签):

      {dede:list pagesize='10'}
      ...循环体...
      {/dede:list}
    • 形式B (arclist标签):

      {dede:arclist titlelen='50' row='10'}
      ...循环体...
      {/dede:arclist}
  5. 修改循环体内的代码,将原来的缩略图调用代码替换为以下“有图才显示”的代码块:

    {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文件,在列表数据查询阶段就过滤掉没有缩略图的文章,或为它们打上标记,让模板调用更简单。

详细步骤:

  1. 备份文件:务必在操作前备份 /include/arc.listview.class.php 文件。

  2. 打开文件:用代码编辑器打开 /include/arc.listview.class.php

  3. 查找关键代码:找到 Query (查询) 相关的代码段,通常在 GetListSql() 函数附近,我们需要在SQL查询语句中增加一个条件。

  4. 修改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') ";

  5. 保存文件,然后清空DedeCMS的缓存(后台 -> 系统 -> 清空缓存)。

效果: 修改后,DedeCMS在查询数据库时,就已经把所有“没有有效缩略图”的文章排除在外了,你的模板文件里就可以直接使用最简单的 [field:litpic/] 标签,因为它100%是有值的,这种方法从根源上解决了问题,性能最佳,但牺牲了程序的“纯净性”。


常见问题与FAQ (FAQ)

Q1:我的网站有多个默认图片,nopic.jpg,怎么办? A1:很简单,在方案一的 if 判断条件中,增加一个判断即可。&& @me['litpic'] != '/images/nopic.jpg',根据你的实际情况,灵活添加判断条件。

Q2:方案一和方案二,我应该选哪个? A2:对于99%的用户,请选择方案一。 它安全、无风险、易于维护,且对性能的影响微乎其微,方案二适合有特殊性能优化需求的专业开发者。

Q3:修改后,为什么还是显示默认图? A3:请检查以下几点:

  1. 是否正确修改了 list_article.htm 模板文件?
  2. 是否保存了模板文件并清空了网站缓存?
  3. 确认你上传的文章缩略图确实存在,并且没有被系统自动替换为默认图。
  4. 检查你的图片路径是否正确,是否使用了外部链接等。

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源码法)则是一个进阶选择,它通过优化数据库查询来提升性能,适合对系统有极致追求的专业人士。

希望这篇详尽的指南能够帮助你完美解决列表页缩略图显示的问题,优秀的代码不仅要实现功能,更要兼顾安全、可维护性和用户体验,如果你在操作中遇到任何问题,欢迎在评论区留言交流。


-- 展开阅读全文 --
头像
Simulink如何高效集成C语言代码?
« 上一篇 02-23
织梦首页调用友情链接
下一篇 » 02-23

相关文章

取消
微信二维码
支付宝二维码