织梦点缩略图打开原图,如何实现?

99ANYc3cd6
预计阅读时长 23 分钟
位置: 首页 织梦建站 正文

使用织梦自带的 [field:picname/] 标签(最简单)

这是最直接的方法,适用于大多数情况,特别是当你只需要在文章内容页(article_article.htm)中实现时。

织梦点缩略图打开原图
(图片来源网络,侵删)

核心原理: 织梦的 [field:picname/] 标签直接输出的是原图的完整路径,我们只需要用一个链接 <a> 把它包裹起来,并把缩略图 [field:litpic/] 作为链接的显示内容即可。

操作步骤:

  1. 打开文章内容页模板 找到并打开你当前使用的文章内容页模板文件,通常位于 /templets/你的模板目录/article_article.htm

  2. 找到缩略图代码 在模板文件中,找到调用文章缩略图的代码,它通常是这样的:

    织梦点缩略图打开原图
    (图片来源网络,侵删)
    <img src='{dede:field name='litpic'/}' alt='{dede:field.title/}' />

    这里的 litpic 指的是缩略图。

  3. 修改代码,添加链接 将上面的 <img> 标签用 <a> 标签包裹起来,并做如下修改:

    • <a> 标签的 href 属性指向原图,使用 {dede:field name='picname'/}
    • 可以给 <a> 标签添加一些属性,target="_blank" 让原图在新窗口打开,class="fancybox" 用于调用灯箱效果(如果模板支持)。
    • <img> 标签保持不变,它仍然显示缩略图。

修改后的代码示例:

<!-- 方式一:在新窗口打开原图 -->
<a href="{dede:field name='picname'/}" target="_blank">
    <img src='{dede:field name='litpic'/}' alt='{dede:field.title/}' />
</a>
<!-- 方式二:如果启用了Fancybox等灯箱效果,推荐这种方式,体验更好 -->
<a href="{dede:field name='picname'/}" class="fancybox" data-fancybox="gallery" rel="gallery">
    <img src='{dede:field name='litpic'/}' alt='{dede:field.title/}' />
</a>

优点:

织梦点缩略图打开原图
(图片来源网络,侵删)
  • 非常简单,无需修改任何PHP文件。
  • 织梦原生支持,稳定可靠。

缺点:

  • 只能针对文章内容页的缩略图,无法直接用于列表页的缩略图(列表页的 picname 逻辑不同)。

使用JavaScript实现(通用性强)

这种方法非常灵活,可以应用于页面上的任何图片,无论是文章内容里的、列表页的还是其他地方的,它通过JavaScript动态地为所有缩略图添加点击事件。

核心原理:

  1. 给所有需要点击的缩略图 <img> 标签添加一个共同的 classorigin-img
  2. 编写一小段JavaScript代码,查找所有带有 origin-img 类的图片。
  3. 为这些图片绑定一个 onclick 点击事件。
  4. 当图片被点击时,事件触发,使用 window.open() 方法打开原图的URL。

操作步骤:

  1. 修改模板中的缩略图标签 在你需要应用的模板文件中(例如列表页 list_article.htm 或内容页 article_article.htm),给缩略图 <img> 标签添加一个 class

    示例(列表页):

    <li>
        <a href="[field:arcurl/]">
            <!-- 给img标签添加 class="origin-img" -->
            <img src="[field:litpic/]" alt="[field:title/]" class="origin-img" />
        </a>
        <a href="[field:arcurl/]">[field:title/]</a>
    </li>
  2. 在模板中添加JavaScript代码 在模板文件的底部,</body> 标签之前,添加以下 <script> 代码。

    <script>
    document.addEventListener('DOMContentLoaded', function() {
        // 获取所有带有 'origin-img' class 的图片
        var images = document.getElementsByClassName('origin-img');
        // 遍历这些图片
        for (var i = 0; i < images.length; i++) {
            (function(img) {
                // 为每张图片添加点击事件
                img.onclick = function() {
                    // 获取当前缩略图的 src,并将其中的缩略图标识替换为原图标识
                    // 织梦的缩略图通常在文件名后缀前有 '_s' 或其他标记
                    // /uploads/202510/s_1.jpg  -> /uploads/202510/1.jpg
                    var originalSrc = this.src.replace(/_[^\/]+(\.[a-zA-Z0-9]+)$/, '$1');
                    // 在新窗口中打开原图
                    window.open(originalSrc, '_blank');
                };
            })(images[i]);
        }
    });
    </script>

代码解释:

  • document.getElementsByClassName('origin-img'): 找到所有我们添加了 origin-img 类的图片。
  • img.onclick = function() {...}: 为每张图片绑定点击事件。
  • this.src.replace(/_[^\/]+(\.[a-zA-Z0-9]+)$/, '$1'): 这是核心的替换逻辑。
    • this.src: 获取被点击图片的当前路径(缩略图路径)。
    • ...replace(...): 使用正则表达式进行替换。
    • _[^\/]+: 匹配下划线 _ 后面直到最后一个斜杠 之前的所有字符(这通常就是织梦生成的缩略图标记,如 _s, _m)。
    • (\.[a-zA-Z0-9]+)$: 匹配文件后缀(如 .jpg, .png)。
    • '$1': 将匹配到的第一个分组(即文件后缀)替换回去,从而去掉了缩略图标记。
  • window.open(originalSrc, '_blank'): 打开处理后的原图路径,并在新标签页中显示。

优点:

  • 通用性强,可以应用到任何地方的图片。
  • 只需修改模板,无需改动核心文件。
  • 逻辑清晰,易于理解和修改。

缺点:

  • 依赖于客户端的JavaScript,如果用户禁用了JS则无法使用。
  • 正则表达式替换路径的逻辑可能需要根据你网站缩略图的命名规则进行微调。

修改PHP文件(最彻底,适合列表页)

如果你想从根本上改变织梦在列表页调用图片的行为,可以直接修改PHP文件,这种方法更底层,性能也更好。

核心原理: 修改织梦的列表页解析文件,让 {dede:field name='picname'/} 在列表页也能正确输出原图路径,而不是缩略图路径。

操作步骤:

  1. 找到并打开核心文件 使用FTP或文件管理器,打开织梦的核心文件: /include/arc.listview.class.php

  2. 查找并修改代码 在该文件中,搜索 this->Fields['picname'],你会找到类似下面这样的代码块:

    // 在 arc.listview.class.php 文件中
    if($this->Fields['litpic'] != '' && $this->Fields['litpic'] != '/images/defaultpic.gif')
    {
        $this->Fields['picname'] = $this->Fields['litpic'];
    }
    else
    {
        $this->Fields['picname'] = '';
    }

    这段代码的意思是:如果存在缩略图,就把 picname 字段的值设置为缩略图的路径。

  3. 修改代码 我们需要将 $this->Fields['litpic'] 改为 $this->Fields['picname'] 的原始值,织梦在获取文章信息时,picname 字段本身就存储了原图路径,我们需要找到这个原始值。

    经过查找,正确的做法是找到获取 litpic 的地方,并将其替换为获取 picname,在 this->Fields 数组被填充之前,原始数据是从 GetArcList 函数获取的,我们可以在 this->Fields 被赋值后进行干预。

    更稳妥的修改方法是,找到设置 litpic 的地方,同时让它也设置 picname,或者,直接覆盖 picname

    找到设置 litpic 的代码段(通常就在上面那段代码附近),将其修改为:

    // 修改后的代码
    if($this->Fields['litpic'] != '' && $this->Fields['litpic'] != '/images/defaultpic.gif')
    {
        // 将 litpic 的值赋给 picname,这样在模板中 {dede:field.name='picname'/} 就能拿到缩略图路径
        // 但这不是我们想要的,我们想要的是原图。
        // 我们直接保留 picname 的原始值(即原图路径),不进行覆盖。
        // 这里我们什么都不做,或者将下面的逻辑反过来。
        // 正确的思路是:我们不覆盖 picname,而是让模板直接使用 {dede:field.name='litpic'/} 作为缩略图链接。
        // 但既然要改PHP,我们可以让 picname 在列表页也指向原图。
        // $this->Fields['picname'] 在这里就已经是原图了。
        // 我们只需要删除或注释掉下面这行覆盖代码即可。
        // $this->Fields['picname'] = $this->Fields['litpic']; // 注释掉或删除这行
    }
    else
    {
        $this->Fields['picname'] = '';
    }

    重要提示: 直接修改核心文件有风险,升级织梦时可能会被覆盖,建议修改前先备份文件,经过测试,在 arc.listview.class.php 中,$this->Fields['picname'] 在进入这个判断之前就已经被赋值为原图路径了,后面那行 $this->Fields['picname'] = $this->Fields['litpic']; 正是导致它在列表页变成缩略图的“元凶”。

    最简单的修改就是: 找到并删除或注释掉这一行:

    $this->Fields['picname'] = $this->Fields['litpic'];

    这样,在列表页中,{dede:field.name='picname'/} 就会恢复为调用原图路径。

  4. 更新列表页缓存 修改文件后,登录织梦后台 -> “生成” -> “更新主页HTML” / “更新栏目HTML” / “更新文档HTML”,让修改生效。

优点:

  • 从根本上解决问题,列表页和内容页的调用方式统一。
  • 性能最好,不依赖前端JS。

缺点:

  • 修改核心文件,有一定风险。
  • 织梦升级后,修改可能会被覆盖,需要重新修改。
  • 操作稍复杂。

总结与推荐

方法 优点 缺点 适用场景
[field:picname/] 极其简单,原生支持 页,不灵活 强烈推荐用于文章内容页
JavaScript 通用性强,灵活,不修改核心 依赖JS,需微调正则 强烈推荐用于列表页、首页或其他任何需要的地方,最常用和最安全的方案。
修改PHP 彻底,性能好 有风险,升级会失效 对技术有信心,且希望一劳永逸解决列表页问题的用户。

对于绝大多数用户,我推荐您采用 组合方案

  • 页(article_article.htm:使用 方法一,简单直接。
  • 列表页、首页等(list_article.htm, index.htm:使用 方法二,灵活且安全。
-- 展开阅读全文 --
头像
严蔚敏数据结构(C语言版)如何学透?
« 上一篇 今天
织梦图片集模板不存在怎么办?
下一篇 » 今天

相关文章

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

目录[+]