dede5.7图片onclick事件如何正确设置?

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

DedeCMS 5.7 是一个比较经典的版本,其模板引擎使用的是 dede:arclistdede:list 等标签,为这些标签中的图片添加 onclick 属性,主要有以下几种常用且有效的方法。

dede 5.7 图片 onclick
(图片来源网络,侵删)

在列表页(如首页、列表页)为文章缩略图添加 onclick

这是最常见的需求,比如点击文章缩略图弹出图片大图、或者直接跳转到文章详情页。

方法 1:使用 field 函数直接修改(推荐,最灵活)

dede:arclistdede:list 标签中的 function 属性可以让你对字段值进行二次处理,非常适合这个场景。

示例:点击图片在新窗口打开文章详情页

假设你有一个文章列表,想在 <img> 标签中添加 onclick="window.open('文章链接地址')"

dede 5.7 图片 onclick
(图片来源网络,侵删)

模板代码:

{dede:arclist typeid='1' row='4' titlelen='30'}
  <li>
    <!-- 
      1. [field:array runphp='yes']...[/field:array] 是一个数组循环,可以获取字段的多个值。
      2. @me 是当前处理的变量,在这里是文章数据数组。
      3. 我们通过 @me['arcurl'] 获取文章链接,@me['picname'] 获取缩略图地址。
      4. 将拼接好的 HTML 字符串重新赋值给 @me。
    -->
    [field:array runphp='yes']
      @me = '<img src="' . @me['picname'] . '" alt="' . @me['title'] . '" onclick="window.open(\'' . @me['arcurl'] . '\')" />';
    [/field:array]
    <a href="[field:arcurl/]">[field:title/]</a>
  </li>
{/dede:arclist}

代码解析:

  • [field:array runphp='yes']...[/field:array]:这是一个强大的技巧,它会将当前文章的所有字段信息(如 arcurl, picname, title 等)作为一个数组 @me 传递给你。
  • @me['picname']:获取文章的缩略图地址。
  • @me['arcurl']:获取文章的链接地址。
  • onclick="window.open(...)":这就是我们要添加的点击事件,点击后会新开一个窗口打开文章链接。

示例:点击图片弹出大图(使用灯箱效果)

如果你使用了 jQuery 灯箱(如 Fancybox、ColorBox)等插件,可以这样实现。

假设你已经在页面中引入了灯箱插件,并且图片地址是 [field:litpic/]

{dede:arclist typeid='1' row='4' titlelen='30'}
  <li>
    <a href="[field:litpic/]" class="fancybox" title="[field:title/]">
      <img src="[field:litpic/]" alt="[field:title/]" />
    </a>
    <a href="[field:arcurl/]">[field:title/]</a>
  </li>
{/dede:arclist}

模板代码(如果不想用 <a> 标签包裹,直接给 imgonclick):

{dede:arclist typeid='1' row='4' titlelen='30'}
  <li>
    [field:array runphp='yes']
      @me = '<img src="' . @me['litpic'] . '" alt="' . @me['title'] . '" onclick="$.fancybox.open({ href : \'' . @me['litpic'] . '\', helpers : { title : { type : \'inside\' } } });" />';
    [/field:array]
    <a href="[field:arcurl/]">[field:title/]</a>
  </li>
{/dede:arclist}

注意: 这种方式直接在 onclick 里写 JS 调用,要求你的页面已经正确加载了 jQuery 和 Fancybox 插件。


方法 2:在后台自定义字段

如果你希望这个 onclick 行为是固定的,并且不想每次修改模板,可以在后台添加一个自定义字段。

  1. 进入后台[核心] -> 模型管理] -> [普通文章] (或其他模型) -> [字段管理]
  2. 添加字段:点击 [增加新字段]
    • 字段名imgonclick (英文,不含空格)
    • 字段类型文本
    • 字段提示图片点击事件
    • 其他选项保持默认,提交。
  3. 在文章发布页添加输入框
    • 进入 [核心] -> 模型管理] -> [普通文章] -> [字段管理]
    • 找到你刚添加的 imgonclick 字段,在右侧的 显示 栏中打勾,并设置好它的位置(比如放在 缩略图 下面)。
  4. 在模板中调用: 在列表页模板中,你可以直接调用这个自定义字段。
{dede:arclist typeid='1' row='4' titlelen='30'}
  <li>
    <img src="[field:litpic/]" alt="[field:title/]" onclick="[field:imgonclick/]" />
    <a href="[field:arcurl/]">[field:title/]</a>
  </li>
{/dede:arclist}

这样,你在发布每篇文章时,就可以为这篇文章的图片单独指定 onclick 事件的内容了,非常灵活。


页(文章详情页)为文章内容中的图片添加 onclick

页,图片通常是通过 [field:body/][field:content/] 调用出来的,直接修改这些标签比较困难,推荐使用以下方法。

方法:使用 article_archives.php 文件进行内容处理(最专业)

这是 DedeCMS 官方推荐的处理文章内容的方式,通过修改文章内容解析的 PHP 文件,可以实现全局、可控的修改。

  1. 找到文件: 在你的网站根目录下,找到 include 文件夹,里面的 arc.archives.class.php 文件,这个文件是解析文章内容的核心类。

  2. 修改文件: 用代码编辑器(如 VS Code, Sublime Text, Notepad++)打开 arc.archives.class.php

  3. 找到 ReplaceLib 函数: 在文件中搜索 function ReplaceLib,你会找到这个用于替换文章内容中特定标签的函数。

  4. 添加自定义替换规则: 在 ReplaceLib 函数的 switch ($tagname) 语句中,添加一个新的 case

    示例:为文章内容中的所有图片添加一个点击放大效果(假设使用 FancyBox)

    找到类似这样的代码块:

    // ... 其他 case
    case 'page':
        $this->SplitPageFields($innerText, $arcID);
        break;
    // ... 其他 case

    在其中添加一个新的 case,比如叫 myimg

    // ... 其他 case
    case 'page':
        $this->SplitPageFields($innerText, $arcID);
        break;
    // ====== 在这里添加你的自定义规则 ======
    case 'myimg':
        // 使用正则表达式匹配 <img> 标签
        // $matches[0] 是整个匹配的字符串,如 <img src="..." />
        // $matches[1] 是 src 属性的值
        $innerText = preg_replace_callback('/<img\s+[^>]*?src\s*=\s*(["\'])([^"\']+)\1[^>]*?>/i', function($matches) {
            // 返回新的 <img> 标签,并添加 onclick 事件
            // 这里我们给图片包裹一个 <a> 标签,这是 FancyBox 的标准做法
            $a_tag = '<a href="' . $matches[2] . '" class="fancybox" data-fancybox="gallery">';
            $img_tag = $matches[0];
            return $a_tag . $img_tag . '</a>';
        }, $innerText);
        break;
    // ======================================
    case 'typelink':
        // ... 其他 case

    代码解析:

    • case 'myimg'::我们定义了一个新的内容标签 {dede:myimg/}
    • preg_replace_callback:这是一个强大的正则表达式替换函数,它会找到所有匹配的 <img> 标签,并对每一个找到的标签执行一个回调函数。
    • 回调函数接收 $matches 参数,$matches[2] 就是图片的 src 地址。
    • 函数返回一个新的字符串,即用 <a> 标签包裹原来的 <img>
  5. 页模板中使用: 在你的文章详情页模板(通常是 article_article.htm)中,将 [field:body/][field:content/] 替换为 {dede:myimg/}

    <div class="article-content">
      {dede:myimg/}
    </div>

优点

  • 一劳永逸:修改一次,所有文章内容都生效。
  • 逻辑与表现分离:PHP 逻辑在后台处理,模板文件保持简洁。
  • 功能强大:可以执行非常复杂的正则匹配和替换。

总结与推荐

场景 推荐方法 优点 缺点
列表页图片 方法1:field 函数 灵活、直接,无需修改后台文件,适合快速实现。 模板代码稍显复杂,如果逻辑复杂会影响模板可读性。
方法2:自定义字段 非常灵活,每篇文章可独立设置。 需要后台操作,发布文章时多一步。

对于 DedeCMS 5.7 用户,强烈推荐掌握 field 函数和修改 arc.archives.class.php 这两种方法,它们能解决绝大多数关于内容模板定制的问题。

-- 展开阅读全文 --
头像
织梦502错误,网关故障如何排查解决?
« 上一篇 12-07
dede posttocar.php漏洞如何修复?
下一篇 » 12-07

相关文章

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