dede图片不存在时如何处理?

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

前台模板中,当图片不存在时显示默认图或文字

这是最常见的需求,比如在列表页、内容页,如果文章里的图片地址失效了,我们不希望显示一个破碎的图片图标(一个带叉的小方块),而是希望显示一个默认的图片或者一段文字。

dede当图片不存在时
(图片来源网络,侵删)

方法1:使用 dede:field 标签的 function 属性(推荐)

这是最灵活、最常用的方法,我们可以通过一个自定义的PHP函数来处理图片路径。

步骤:

  1. include/helpers/image.helper.php 文件中添加自定义函数

    打开你的DedeCMS安装目录下的 include/helpers/image.helper.php 文件,在文件末尾添加以下PHP函数:

    dede当图片不存在时
    (图片来源网络,侵删)
    /**
     * 检查图片是否存在,如果不存在则返回默认图片
     * @param string $imgUrl 图片地址
     * @param string $defaultImg 默认图片地址(相对于网站根目录)
     * @return string
     */
    function CheckAndReplaceImg($imgUrl, $defaultImg = '/images/default.jpg')
    {
        // 如果图片地址为空,直接返回默认图
        if (empty($imgUrl)) {
            return $defaultImg;
        }
        // 如果是站内图片,检查文件是否存在
        // 使用@抑制函数可能产生的警告,比如权限问题
        if (@file_exists(DEDEROOT . $imgUrl)) {
            return $imgUrl;
        }
        // 如果是站外图片(http开头的),通常无法直接检查文件存在性,我们直接返回原地址
        // 或者你也可以在这里强制返回默认图,取决于你的需求
        if (strpos($imgUrl, 'http') === 0) {
            // return $imgUrl; // 返回远程图片地址
            return $defaultImg; // 或者直接返回默认图
        }
        // 其他情况(如图片不存在),返回默认图
        return $defaultImg;
    }

    说明:

    • DEDEROOT 是 DedeCMS 定义的全局变量,代表网站根目录的物理路径。
    • 你需要先创建一个默认图片,images/default.jpg,并确保它存在于你的网站根目录下。
    • 这个函数会检查图片路径是否为空,以及文件是否真实存在。
  2. 在模板文件中使用 function 调用该函数

    假设你想在文章列表页(list_article.htm图片上使用这个功能。

    <a href="[field:arcurl/]">
        <img src="{dede:field.litpic function='CheckAndReplaceImg(@me, "/images/nopic.jpg")'/}" alt="[field:title function='html2text(@me)'/]" />
    </a>

    代码解析:

    dede当图片不存在时
    (图片来源网络,侵删)
    • {dede:field.litpic}:获取文章的缩略图地址。
    • function='CheckAndReplaceImg(@me, "/images/nopic.jpg")'
      • function:告诉DedeCMS要对这个字段进行处理。
      • CheckAndReplaceImg:是我们刚刚在 image.helper.php 中定义的函数名。
      • @me:是DedeCMS的固定用法,代表当前标签的原始值,也就是 {dede:field.litpic} 的值。
      • "/images/nopic.jpg":是我们传递给函数的第二个参数,即默认图片路径。
    • 这样,litpic 指向的图片不存在,src 的值就会自动变成 /images/nopic.jpg

方法2:使用 JavaScript 在前端处理(不推荐,但可行)

这种方法是在图片加载失败时,用JavaScript替换它。

在模板的 <head> 部分或底部加入以下JS代码:

<script>
    // 为所有带有 'replace-img' 类的图片添加错误处理
    document.addEventListener("DOMContentLoaded", function() {
        var images = document.getElementsByTagName('img');
        for (var i = 0; i < images.length; i++) {
            // 你可以给需要处理的图片加上一个特定的 class,class="replace-img"
            // 或者直接处理所有图片
            images[i].onerror = function() {
                // 这里设置你的默认图片路径
                this.src = "/images/nopic.jpg";
                // (可选) 你还可以移除图片的onerror事件,防止无限循环
                this.onerror = null; 
            };
        }
    });
</script>

然后在需要处理的 <img> 标签上,你可以不加任何特殊处理,它会自动生效,或者为了性能,只给特定图片加:

<img src="[field:litpic/]" class="replace-img" alt="..." />

缺点:

  • 用户会先看到一张破碎的图片,然后图片才闪烁一下变成默认图,体验不佳。
  • 增加了前端负担,不如后端处理直接。

后台编辑器中,当图片不存在时

在后台编辑文章时,如果引用的图片已经失效(比如从其他网站复制过来的,且原站已删除),编辑器里同样会显示一个破碎的图标,这虽然不影响前台显示(如果你用了方法一),但在后台编辑时很不方便。

解决方案:安装“图片本地化”或“一键检测替换”插件

DedeCMS的官方或第三方市场有很多此类插件,它们的功能通常包括:

  1. 一键检测文章中的无效图片:扫描文章内容,找出所有无法访问的图片链接。
  2. 一键替换为默认图片:将所有无效图片批量替换为你设定的默认图片。
  3. 图片本地化:将外链图片下载到你的服务器,并自动替换为本地链接,一劳永逸。

如何寻找和使用:

  1. 登录DedeCMS后台
  2. 进入“模块” -> “模块库”。
  3. 在搜索框中搜索关键词,如“图片检测”、“图片替换”、“内容检测”等。
  4. 找到合适的插件后,下载、安装并启用。
  5. 根据插件的说明文档,在后台设置好默认图片路径,然后就可以在内容管理页面使用插件的功能了。

这种方法是专门针对后台编辑优化的,效率很高。


总结与推荐

场景 推荐方案 优点 缺点
前台显示 方法1:PHP function 函数 体验最好,用户永远不会看到破碎图片。
逻辑清晰,在服务端完成处理。
灵活可控,可以自定义复杂的判断逻辑。
需要修改核心文件(image.helper.php),升级Dede时可能需要重复修改。
后台编辑 安装专用插件 效率高,可批量处理所有文章。
功能强大,不仅能处理不存在图片,还能处理外链等问题。
不涉及代码,对普通用户更友好。
需要寻找和安装第三方插件,可能存在兼容性风险。

给你的最终建议:

  1. 对于前台显示,强烈推荐使用 方法1(PHP函数),这是最专业、最可靠的解决方案。
  2. 对于后台编辑,可以去寻找并安装一个 图片检测/替换插件,这样能大大提高你维护网站内容的效率。

通过以上两种方式,你就可以完美解决 DedeCMS 中图片不存在时的问题了。

-- 展开阅读全文 --
头像
dede验证码如何只显示数字?
« 上一篇 02-28
C语言如何实现insertback函数?
下一篇 » 02-28

相关文章

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

目录[+]