使用 @me 变量 (最推荐,最灵活)
这是最常用且最灵活的方法,因为它可以在模板中直接处理,无需修改程序文件,并且可以方便地获取图片的路径、标题等信息。
适用场景:在图集列表页(如 arclist_article_image.htm页调用。
代码示例:
{dede:productimagelist}
<li>
<!-- 调用第一张图片的缩略图路径 -->
<img src="[field:imgsrc/]" alt="[field:text/]" />
<!-- 调用第一张图片的原始大图路径 -->
<a href="[field:imgsrc function='str_replace("small", "", "@me")'/]" rel="example_group">
<img src="[field:imgsrc function='str_replace("small", "", "@me")'/]" alt="[field:text/]" />
</a>
<span>[field:text/]</span>
</li>
{/dede:productimagelist}
如何只显示第一张图片?
你需要利用 DedeCMS 的循环变量 [@me]。[@me] 在每次循环开始时为空,当循环执行一次后,它就会被赋值,我们可以利用这个特性来判断是否已经显示过第一张图片。
代码示例 (只显示第一张图片):
{dede:productimagelist}
<!-- 判断 @me 是否为空,为空则执行,不为空则跳过 -->
[field:global name=autoindex runphp="yes"]
if (@me == 1) {
@me = '<li><img src="[field:imgsrc/]" alt="[field:text/]"></li>';
} else {
@me = '';
}
[/field:global]
{/dede:productimagelist}
代码解析:
{dede:productimagelist}: 开始循环图集。[field:global name=autoindex runphp="yes"]: 获取当前循环的次数(从1开始)。if (@me == 1): 判断当前是否是第一次循环。@me = '<li>...</li>': 如果是第一次,就将@me变量设置为你想要的 HTML 代码。else { @me = ''; }: 如果不是第一次,就将@me变量设置为空字符串,这样就不会输出任何内容。[/field:global]: 结束runphp逻辑。[/dede:productimagelist]: 结束图集循环。
使用 limit 属性 (最简单)
如果你的 DedeCMS 版本支持 limit 属性,这是最简单直接的方法。limit 用于限制输出的记录数。
适用场景:同样适用于列表页和内容页。
代码示例:
{dede:productimagelist limit='0,1'}
<li>
<img src="[field:imgsrc/]" alt="[field:text/]" />
</li>
{/dede:productimagelist}
代码解析:
limit='0,1'的意思是“从第 0 条记录开始,只取 1 条记录”。0代表偏移量(即跳过前 N 条)。1代表获取的数量。
注意:并非所有 DedeCMS 版本或所有标签都支持 limit 属性。{dede:arclist} 支持,但 {dede:productimagelist} 的支持情况可能因版本而异,如果此方法无效,请使用方法一。
使用PHP代码 (最强大,需要修改模板文件)
如果你需要更复杂的逻辑,或者想在图集内容页(如 article_image.htm)中调用第一张图片作为主图,可以使用原生的 PHP 代码。
适用场景页调用,或者进行更复杂的图片处理。
代码示例:
<?php
// 获取图集字段内容
$imgList = $fields['imgurls'];
// 判断是否为图集
if (!empty($imgList)) {
// 使用正则表达式匹配出所有图片信息
// DedeCMS 图集存储格式:{dede:img text=''}图片地址{/dede:img}
preg_match_all('/{dede:img.*?}(.*?){\/dede:img}/i', $imgList, $imgArray);
// 检查是否找到了图片
if (!empty($imgArray[1])) {
// 获取第一张图片的URL (通常在 imgArray[1] 的第一个元素里)
// 注意:这里的URL可能是缩略图路径,需要根据实际情况处理
$firstImgUrl = $imgArray[1][0];
// 如果需要获取大图,可能需要进一步解析,例如替换 'small' 目录
// 这是一个常见的处理方式,但请根据你的实际目录结构调整
$largeImgUrl = str_replace('/small/', '/', $firstImgUrl);
// 输出第一张图片
echo '<img src="' . $largeImgUrl . '" alt="' . $fields['title'] . '" />';
}
}
?>
代码解析:
$imgList = $fields['imgurls'];: 获取当前文章的imgurls字段内容,这是一个包含所有图片信息的字符串。preg_match_all(...): 使用正则表达式从字符串中提取出所有{dede:img}标签内的图片地址。$imgArray[1][0]:$imgArray[1]存储了所有匹配到的图片地址,[0]就是第一个。str_replace(...): 一个常见的技巧,将缩略图路径(通常在small目录下)中的/small/替换成 ,从而得到大图路径。请务必确认你的服务器上图片的实际目录结构。echo ...: 最后输出<img>
总结与推荐
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
方法一 (@me 变量) |
灵活、标准、无需修改程序,可获取图片属性 | 语法稍复杂,需要理解 runphp |
绝大多数情况下的首选,尤其是在列表页调用。 |
方法二 (limit 属性) |
语法最简单、直观 | 兼容性不确定,不是所有版本都支持 | 当你的环境支持时,这是最快的方法。 |
| 方法三 (PHP 代码) | 功能最强大,可处理复杂逻辑 | 代码量多,需要PHP知识,可读性差 | 页调用,或需要对图片进行特殊处理时。 |
对于绝大多数用户,强烈推荐使用方法一,因为它最稳定、最灵活,并且是 DedeCMS 模板开发的最佳实践。
