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

在列表页(如首页、列表页)为文章缩略图添加 onclick
这是最常见的需求,比如点击文章缩略图弹出图片大图、或者直接跳转到文章详情页。
方法 1:使用 field 函数直接修改(推荐,最灵活)
dede:arclist 和 dede:list 标签中的 function 属性可以让你对字段值进行二次处理,非常适合这个场景。
示例:点击图片在新窗口打开文章详情页
假设你有一个文章列表,想在 <img> 标签中添加 onclick="window.open('文章链接地址')"。

模板代码:
{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> 标签包裹,直接给 img 加 onclick):
{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 行为是固定的,并且不想每次修改模板,可以在后台添加一个自定义字段。
- 进入后台:
[核心]->模型管理]->[普通文章](或其他模型) ->[字段管理]。 - 添加字段:点击
[增加新字段]。- 字段名:
imgonclick(英文,不含空格) - 字段类型:
文本 - 字段提示:
图片点击事件 - 其他选项保持默认,提交。
- 字段名:
- 在文章发布页添加输入框:
- 进入
[核心]->模型管理]->[普通文章]->[字段管理]。 - 找到你刚添加的
imgonclick字段,在右侧的显示栏中打勾,并设置好它的位置(比如放在缩略图下面)。
- 进入
- 在模板中调用: 在列表页模板中,你可以直接调用这个自定义字段。
{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 文件,可以实现全局、可控的修改。
-
找到文件: 在你的网站根目录下,找到
include文件夹,里面的arc.archives.class.php文件,这个文件是解析文章内容的核心类。 -
修改文件: 用代码编辑器(如 VS Code, Sublime Text, Notepad++)打开
arc.archives.class.php。 -
找到
ReplaceLib函数: 在文件中搜索function ReplaceLib,你会找到这个用于替换文章内容中特定标签的函数。 -
添加自定义替换规则: 在
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>
-
页模板中使用: 在你的文章详情页模板(通常是
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 这两种方法,它们能解决绝大多数关于内容模板定制的问题。
