场景分析
通常我们获取第一张图片是为了以下目的:

(图片来源网络,侵删)
- 作为封面图:在列表页或文章摘要中,只显示一张代表性的图片作为封面。
- 作为图集入口:显示一张图片,点击后弹出图集或跳转到图集详情页。
- 避免JS错误:如果图集为空,直接调用
{dede:img}会出错,而获取第一张图片的方法可以更优雅地处理空集情况。
使用 array 标签(最推荐、最灵活)
这是目前最主流和推荐的方法,它利用了 DedeCMS 的 array 功能,可以轻松获取循环中的第一个元素,并且代码清晰,易于理解。
适用标签:{dede:productimagelist} 或 {dede:imagelist}
代码示例
{dede:productimagelist}
{dede:array}
[field:imglink/]
{/dede:array}
{/dede:productimagelist}
代码解析:
{dede:productimagelist}...{/dede:productimagelist}:这是图集标签的循环体,会遍历图集中的所有图片。{dede:array}...{/dede:array}:这是关键,它会将{dede:productimagelist}循环的第一次迭代结果,打包成一个数组,它只取了循环中的第一项。[field:imglink/]:在这个被array包裹的“第一项”里,我们调用图片的链接地址,你也可以使用[field:imgsrc/]来获取图片地址。
进阶用法:带封面图判断
如果图集可能为空,我们可以用 if 标签进行判断,避免页面出现空白或错误。
{dede:productimagelist}
{dede:array}
<a href="[field:imglink/]">
<img src="[field:imgsrc/]" alt="[field:text/]" />
</a>
{/dede:array}
{dede:if empty=''}
<!-- 如果图集为空,显示一个默认图片或占位符 -->
<img src="/images/default_album.jpg" alt="暂无图片" />
{/dede:if}
{/dede:productimagelist}
注意:{dede:if empty=''} 是判断当前循环体是否为空,因为 array 只取第一张,如果图集本身就是空的,productimagelist 循环体就是空的,empty 条件就会成立。
使用 runphp='yes' 和 PHP 代码(功能强大)
如果你熟悉 PHP,这种方法非常强大,可以处理更复杂的逻辑,它通过 runphp 属性在模板中执行 PHP 代码。
适用标签:{dede:field name='images'} (直接获取图集字段原始值)
代码示例
{dede:field name='images' runphp='yes'}
// 1. 获取图集字段的原始值,它是一个 "|||" 分隔的字符串
$imgstring = @me;
// 2. 如果字符串不为空,进行处理
if(!empty($imgstring)) {
// 3. 按 "|||" 分割字符串,得到一个包含所有图片信息的数组
$img_array = explode('|||', $imgstring);
// 4. 取数组的第一个元素,它是一个由 "|::|" 分隔的字符串
$first_img_info = $img_array[0];
// 5. 再次按 "|::|" 分割,得到图片地址、链接、描述等信息
$first_img_details = explode('|::|', $first_img_info);
// 6. 获取图片地址(通常是第一个元素)
$first_img_src = $first_img_details[0];
// 7. 获取图片描述(通常是第三个元素)
$first_img_alt = $first_img_details[2];
// 8. 拼接输出 HTML
// @me 是模板中 runphp 的值,我们在这里给它重新赋值
@me = "<img src='{$first_img_src}' alt='{$first_img_alt}' />";
} else {
// 如果图集为空,输出一个默认图片
@me = "<img src='/images/default_album.jpg' alt='暂无图片' />";
}
{/dede:field}
代码解析:
@me:在runphp='yes'中,@me代表当前标签的原始值,这里就是images字段的内容,如图片地址1|::|图片链接1|::|图片描述1|||图片地址2|::|...。explode('|||', $imgstring):这是 DedeCMS 存储图集数据的默认分隔符,用它来分割出每一张图片的独立信息。explode('|::|', ...):这是分割单张图片信息的分隔符,用它来获取图片地址、链接和描述。@me = "...":通过重新给@me赋值,来改变标签的最终输出。
优点:逻辑最严谨,可以精确控制每一步。 缺点:代码量大,对 PHP 不太友好的用户不友好。
使用 limit 属性(简单直接,但有局限)
limit 属性可以限制循环输出的条数,我们可以用它只输出第一张图片。
适用标签:{dede:productimagelist}
代码示例
{dede:productimagelist limit='0,1'}
<a href="[field:imglink/]">
<img src="[field:imgsrc/]" alt="[field:text/]" />
</a>
{/dede:productimagelist}
代码解析:
limit='0,1':这个参数的意思是“从第 0 条开始,取 1 条”,因为数组索引从 0 开始,所以这正好取到了第一张图片。
优点:代码非常简洁。 缺点:
- 无法处理空图集:如果图集是空的,这个循环体不会执行,页面会留空,你需要像方法一那样,在外面套一个
{dede:if}标签来判断,反而增加了代码复杂度。 - 不够灵活:如果业务逻辑变了,需要取第二张图片,就得改成
limit='1,1',不如array方法直观。
总结与推荐
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
array |
代码简洁、可读性强、易于扩展、可结合 if 处理空集 |
理解上需要知道 array 的作用 |
绝大多数情况下的首选,特别是作为封面图时。 |
runphp |
功能最强大、逻辑最严谨、可处理复杂自定义格式 | 代码量大、需要 PHP 基础、不易维护 | 当图集存储格式有特殊自定义,或者需要非常复杂逻辑时。 |
limit 属性 |
代码极其简单 | 无法处理空图集、不够灵活 | 当你确定图集一定有图片,且只需要简单取第一张时。 |
综合来看,强烈推荐使用【方法一:array,它在代码简洁性和功能性之间取得了最好的平衡,是 DedeCMS 开发者社区公认的最佳实践。
