下面我将为你详细讲解从最简单到最完整的几种调用方法,并附上实例。
核心原理
织梦的自定义模型数据存储在两个地方:
- 主表 (
dede_archives):存储所有文章/模型共有的信息,如ID、标题、发布时间、作者等。 - 附加表 (
dede_addon_xxx):存储特定模型的特有字段,xxx是你在后台创建模型时生成的表名(addonarticle是文章模型,addonshop是商品模型,自定义的可能叫addoncase等)。
调用自定义模型的图片,关键在于从附加表中取出图片字段。
准备工作:确保你的模型字段正确
在调用之前,请务必确认:
- 你已经成功创建了自定义模型(案例模型)。
- 在该模型中,你添加了一个图片类型的字段(字段名最好使用英文,
litpic或imglist)。 - 已经使用该模型添加了一些内容,并上传了图片。
页(单页)调用 {dede:field}
这是最简单的情况,在你需要显示图片的页面,通常是文章内容页(article_article.htm 或你自定义的模板文件)。
如果你的图片字段名是 litpic,直接使用:
<img src="{dede:field.litpic/}" alt="{dede:field.title/}" />
说明:
{dede:field.litpic/} 会直接输出当前文章附加表中 litpic 字段的值,这个值通常是图片的完整路径。
- 这种方法适用于当前正在浏览的这篇自定义模型文章。
在列表页(频道页)或首页调用 {dede:list}
这是最常见的需求,在频道列表页(如 list_case.htm)或首页调用自定义模型的文章列表。
关键点:addfields 和 channel
你需要告诉 {dede:list} 标签,你需要从附加表中取出哪些字段。
假设你的情况:
- 自定义模型名称:案例
- 模型ID:1 (可以在后台“频道模型” -> “内容模型管理”中查看)
- 附加表名:dede_addoncase (通常是
addon + 你的模型英文名或ID)
- 图片字段名:litpic
在列表页模板(如 list_case.htm)中,代码如下:
{dede:list pagesize='10' addfields='litpic' channelid='1'}
<li>
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title/]" />
<h3>[field:title/]</h3>
</a>
</li>
{/dede:list}
代码解释:
addfields='litpic':这是核心参数,它告诉 {dede:list} 在查询时,除了默认的主表字段,还要从附加表中取出 litpic 字段,如果需要多个字段,用逗号隔开,addfields='litpic,imgurl,description'。
channelid='1':这也是核心参数,它指定了当前调用的是哪个模型的数据。请务必替换成你自己的模型ID。
[field:litpic/]:在 {dede:list} 循环体内,使用 [field:字段名/] 来调用通过 addfields 指定的附加表字段。
在首页或任意页面调用 {dede:arclist}
如果你想在首页或其他频道页调用自定义模型的列表,而不是进入该模型的频道页,则需要使用 {dede:arclist}。
{dede:arclist} 的参数比 {dede:list} 更丰富,也更灵活。
假设你的情况同上:
{dede:arclist channelid='1' addfields='litpic' row='8' titlelen='30'}
<div class="item">
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title/]" />
<p>[field:title/]</p>
</a>
</div>
{/dede:arclist}
代码解释:
channelid='1':指定模型ID,必须要有。
addfields='litpic':从附加表获取指定字段,必须要有。
row='8':调用8条记录,len='30'`:标题长度限制为30个字符。
[field:litpic/]:同样,在循环体内调用附加表字段。
处理多图片字段(图集字段)
如果你的自定义模型中添加的是“图集”类型的字段(例如字段名为 imglist),那么调用方式会有所不同,因为你需要遍历图片数组。
假设你的情况:
- 模型ID:1
- 图集字段名:imglist
在列表页中调用图集的第一张图(通常用作缩略图):
{dede:list pagesize='10' addfields='imglist' channelid='1'}
<li>
<!-- 调用图集中的第一张图片 -->
<img src="[field:imglist function='(@me)[0]'/]" alt="[field:title/]" />
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:list}
代码解释:
[field:imglist function='(@me)[0]'/]:
@me 代表当前字段的原始值,对于图集字段,它是一个包含所有图片路径的字符串,格式如 路径1|路径2|路径3。
function='...' 允许你对 @me 进行PHP函数处理。
explode('|', @me) 将字符串按 分割成一个数组。
[0] 取出数组的第一个元素,也就是第一张图片的路径。
页调用图集的所有图片(需要配合JS或CSS实现幻灯片效果):**
{dede:field.imglist function='str_replace("|", ",", @me)'/}
这段代码会输出所有图片路径,用逗号隔开,方便JS插件(如Bootstrap Carousel)调用。
常见问题与解决方案 (FAQ)
问题:调用后图片不显示,或者显示为空。
- 原因1:
channelid 错误,请务必去后台确认你的自定义模型ID。
- 原因2:
addfields 中的字段名写错了,请去后台“内容模型管理” -> “字段管理”中确认字段名。
- 原因3:该篇文章没有填写该图片字段,检查一下后台数据。
- 原因4:图片路径问题,确保图片已经上传到服务器,并且附加表中的路径是正确的。
问题:调用后图片路径不完整或错误。
-
原因:织梦存储的可能是相对路径,可以在标签里使用 function 函数来处理。
-
解决方案:在调用时拼接网站根目录。
<!-- 在列表页中 -->
<img src="[field:litpic function='str_replace("..", "", "@me")'/]" alt="[field:title/]" />
<!-- 更稳妥的方法是判断是否以 http 开头 -->
<img src="[field:litpic runphp='yes'] if(strpos(@me, 'http') === false) @me = $cfg_cmspath . @me; @me; [/field:litpic]" alt="[field:title/]" />
第二种方法更健壮,它会检查路径是否已经是完整的URL,如果不是,则补上网站根目录。
调用场景
推荐标签
核心参数
附加表字段调用方式
页
{dede:field}
无
{dede:field.字段名/}
模型列表页
{dede:list}
addfields='字段名'
channelid='模型ID'
[field:字段名/]
首页/其他页
{dede:arclist}
addfields='字段名'
channelid='模型ID'
[field:字段名/]
图集调用
同上,配合function
同上
[field:字段名 function='处理函数'/]
channelid 和 addfields 是调用自定义模型数据的两个“魔法钥匙”,只要正确使用它们,就能灵活地调用到你想要的任何字段,包括图片。
这是最简单的情况,在你需要显示图片的页面,通常是文章内容页(article_article.htm 或你自定义的模板文件)。
如果你的图片字段名是 litpic,直接使用:
<img src="{dede:field.litpic/}" alt="{dede:field.title/}" />
说明:
{dede:field.litpic/}会直接输出当前文章附加表中litpic字段的值,这个值通常是图片的完整路径。- 这种方法适用于当前正在浏览的这篇自定义模型文章。
在列表页(频道页)或首页调用 {dede:list}
这是最常见的需求,在频道列表页(如 list_case.htm)或首页调用自定义模型的文章列表。
关键点:addfields 和 channel
你需要告诉 {dede:list} 标签,你需要从附加表中取出哪些字段。
假设你的情况:
- 自定义模型名称:案例
- 模型ID:1 (可以在后台“频道模型” -> “内容模型管理”中查看)
- 附加表名:dede_addoncase (通常是
addon + 你的模型英文名或ID)
- 图片字段名:litpic
在列表页模板(如 list_case.htm)中,代码如下:
{dede:list pagesize='10' addfields='litpic' channelid='1'}
<li>
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title/]" />
<h3>[field:title/]</h3>
</a>
</li>
{/dede:list}
代码解释:
addfields='litpic':这是核心参数,它告诉 {dede:list} 在查询时,除了默认的主表字段,还要从附加表中取出 litpic 字段,如果需要多个字段,用逗号隔开,addfields='litpic,imgurl,description'。
channelid='1':这也是核心参数,它指定了当前调用的是哪个模型的数据。请务必替换成你自己的模型ID。
[field:litpic/]:在 {dede:list} 循环体内,使用 [field:字段名/] 来调用通过 addfields 指定的附加表字段。
在首页或任意页面调用 {dede:arclist}
如果你想在首页或其他频道页调用自定义模型的列表,而不是进入该模型的频道页,则需要使用 {dede:arclist}。
{dede:arclist} 的参数比 {dede:list} 更丰富,也更灵活。
假设你的情况同上:
{dede:arclist channelid='1' addfields='litpic' row='8' titlelen='30'}
<div class="item">
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title/]" />
<p>[field:title/]</p>
</a>
</div>
{/dede:arclist}
代码解释:
channelid='1':指定模型ID,必须要有。
addfields='litpic':从附加表获取指定字段,必须要有。
row='8':调用8条记录,len='30'`:标题长度限制为30个字符。
[field:litpic/]:同样,在循环体内调用附加表字段。
处理多图片字段(图集字段)
如果你的自定义模型中添加的是“图集”类型的字段(例如字段名为 imglist),那么调用方式会有所不同,因为你需要遍历图片数组。
假设你的情况:
- 模型ID:1
- 图集字段名:imglist
在列表页中调用图集的第一张图(通常用作缩略图):
{dede:list pagesize='10' addfields='imglist' channelid='1'}
<li>
<!-- 调用图集中的第一张图片 -->
<img src="[field:imglist function='(@me)[0]'/]" alt="[field:title/]" />
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:list}
代码解释:
[field:imglist function='(@me)[0]'/]:
@me 代表当前字段的原始值,对于图集字段,它是一个包含所有图片路径的字符串,格式如 路径1|路径2|路径3。
function='...' 允许你对 @me 进行PHP函数处理。
explode('|', @me) 将字符串按 分割成一个数组。
[0] 取出数组的第一个元素,也就是第一张图片的路径。
页调用图集的所有图片(需要配合JS或CSS实现幻灯片效果):**
{dede:field.imglist function='str_replace("|", ",", @me)'/}
这段代码会输出所有图片路径,用逗号隔开,方便JS插件(如Bootstrap Carousel)调用。
常见问题与解决方案 (FAQ)
问题:调用后图片不显示,或者显示为空。
- 原因1:
channelid 错误,请务必去后台确认你的自定义模型ID。
- 原因2:
addfields 中的字段名写错了,请去后台“内容模型管理” -> “字段管理”中确认字段名。
- 原因3:该篇文章没有填写该图片字段,检查一下后台数据。
- 原因4:图片路径问题,确保图片已经上传到服务器,并且附加表中的路径是正确的。
问题:调用后图片路径不完整或错误。
-
原因:织梦存储的可能是相对路径,可以在标签里使用 function 函数来处理。
-
解决方案:在调用时拼接网站根目录。
<!-- 在列表页中 -->
<img src="[field:litpic function='str_replace("..", "", "@me")'/]" alt="[field:title/]" />
<!-- 更稳妥的方法是判断是否以 http 开头 -->
<img src="[field:litpic runphp='yes'] if(strpos(@me, 'http') === false) @me = $cfg_cmspath . @me; @me; [/field:litpic]" alt="[field:title/]" />
第二种方法更健壮,它会检查路径是否已经是完整的URL,如果不是,则补上网站根目录。
调用场景
推荐标签
核心参数
附加表字段调用方式
页
{dede:field}
无
{dede:field.字段名/}
模型列表页
{dede:list}
addfields='字段名'
channelid='模型ID'
[field:字段名/]
首页/其他页
{dede:arclist}
addfields='字段名'
channelid='模型ID'
[field:字段名/]
图集调用
同上,配合function
同上
[field:字段名 function='处理函数'/]
channelid 和 addfields 是调用自定义模型数据的两个“魔法钥匙”,只要正确使用它们,就能灵活地调用到你想要的任何字段,包括图片。
这是最常见的需求,在频道列表页(如 list_case.htm)或首页调用自定义模型的文章列表。
关键点:addfields 和 channel
你需要告诉 {dede:list} 标签,你需要从附加表中取出哪些字段。
假设你的情况:
- 自定义模型名称:案例
- 模型ID:1 (可以在后台“频道模型” -> “内容模型管理”中查看)
- 附加表名:dede_addoncase (通常是
addon+ 你的模型英文名或ID) - 图片字段名:litpic
在列表页模板(如 list_case.htm)中,代码如下:
{dede:list pagesize='10' addfields='litpic' channelid='1'}
<li>
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title/]" />
<h3>[field:title/]</h3>
</a>
</li>
{/dede:list}
代码解释:
addfields='litpic':这是核心参数,它告诉{dede:list}在查询时,除了默认的主表字段,还要从附加表中取出litpic字段,如果需要多个字段,用逗号隔开,addfields='litpic,imgurl,description'。channelid='1':这也是核心参数,它指定了当前调用的是哪个模型的数据。请务必替换成你自己的模型ID。[field:litpic/]:在{dede:list}循环体内,使用[field:字段名/]来调用通过addfields指定的附加表字段。
在首页或任意页面调用 {dede:arclist}
如果你想在首页或其他频道页调用自定义模型的列表,而不是进入该模型的频道页,则需要使用 {dede:arclist}。
{dede:arclist} 的参数比 {dede:list} 更丰富,也更灵活。
假设你的情况同上:
{dede:arclist channelid='1' addfields='litpic' row='8' titlelen='30'}
<div class="item">
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title/]" />
<p>[field:title/]</p>
</a>
</div>
{/dede:arclist}
代码解释:
channelid='1':指定模型ID,必须要有。
addfields='litpic':从附加表获取指定字段,必须要有。
row='8':调用8条记录,len='30'`:标题长度限制为30个字符。
[field:litpic/]:同样,在循环体内调用附加表字段。
处理多图片字段(图集字段)
如果你的自定义模型中添加的是“图集”类型的字段(例如字段名为 imglist),那么调用方式会有所不同,因为你需要遍历图片数组。
假设你的情况:
- 模型ID:1
- 图集字段名:imglist
在列表页中调用图集的第一张图(通常用作缩略图):
{dede:list pagesize='10' addfields='imglist' channelid='1'}
<li>
<!-- 调用图集中的第一张图片 -->
<img src="[field:imglist function='(@me)[0]'/]" alt="[field:title/]" />
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:list}
代码解释:
[field:imglist function='(@me)[0]'/]:
@me 代表当前字段的原始值,对于图集字段,它是一个包含所有图片路径的字符串,格式如 路径1|路径2|路径3。
function='...' 允许你对 @me 进行PHP函数处理。
explode('|', @me) 将字符串按 分割成一个数组。
[0] 取出数组的第一个元素,也就是第一张图片的路径。
页调用图集的所有图片(需要配合JS或CSS实现幻灯片效果):**
{dede:field.imglist function='str_replace("|", ",", @me)'/}
这段代码会输出所有图片路径,用逗号隔开,方便JS插件(如Bootstrap Carousel)调用。
常见问题与解决方案 (FAQ)
问题:调用后图片不显示,或者显示为空。
- 原因1:
channelid 错误,请务必去后台确认你的自定义模型ID。
- 原因2:
addfields 中的字段名写错了,请去后台“内容模型管理” -> “字段管理”中确认字段名。
- 原因3:该篇文章没有填写该图片字段,检查一下后台数据。
- 原因4:图片路径问题,确保图片已经上传到服务器,并且附加表中的路径是正确的。
问题:调用后图片路径不完整或错误。
-
原因:织梦存储的可能是相对路径,可以在标签里使用 function 函数来处理。
-
解决方案:在调用时拼接网站根目录。
<!-- 在列表页中 -->
<img src="[field:litpic function='str_replace("..", "", "@me")'/]" alt="[field:title/]" />
<!-- 更稳妥的方法是判断是否以 http 开头 -->
<img src="[field:litpic runphp='yes'] if(strpos(@me, 'http') === false) @me = $cfg_cmspath . @me; @me; [/field:litpic]" alt="[field:title/]" />
第二种方法更健壮,它会检查路径是否已经是完整的URL,如果不是,则补上网站根目录。
调用场景
推荐标签
核心参数
附加表字段调用方式
页
{dede:field}
无
{dede:field.字段名/}
模型列表页
{dede:list}
addfields='字段名'
channelid='模型ID'
[field:字段名/]
首页/其他页
{dede:arclist}
addfields='字段名'
channelid='模型ID'
[field:字段名/]
图集调用
同上,配合function
同上
[field:字段名 function='处理函数'/]
channelid 和 addfields 是调用自定义模型数据的两个“魔法钥匙”,只要正确使用它们,就能灵活地调用到你想要的任何字段,包括图片。
如果你想在首页或其他频道页调用自定义模型的列表,而不是进入该模型的频道页,则需要使用 {dede:arclist}。
{dede:arclist} 的参数比 {dede:list} 更丰富,也更灵活。
假设你的情况同上:
{dede:arclist channelid='1' addfields='litpic' row='8' titlelen='30'}
<div class="item">
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title/]" />
<p>[field:title/]</p>
</a>
</div>
{/dede:arclist}
代码解释:
channelid='1':指定模型ID,必须要有。addfields='litpic':从附加表获取指定字段,必须要有。row='8':调用8条记录,len='30'`:标题长度限制为30个字符。[field:litpic/]:同样,在循环体内调用附加表字段。
处理多图片字段(图集字段)
如果你的自定义模型中添加的是“图集”类型的字段(例如字段名为 imglist),那么调用方式会有所不同,因为你需要遍历图片数组。
假设你的情况:
- 模型ID:1
- 图集字段名:imglist
在列表页中调用图集的第一张图(通常用作缩略图):
{dede:list pagesize='10' addfields='imglist' channelid='1'}
<li>
<!-- 调用图集中的第一张图片 -->
<img src="[field:imglist function='(@me)[0]'/]" alt="[field:title/]" />
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:list}
代码解释:
[field:imglist function='(@me)[0]'/]:@me代表当前字段的原始值,对于图集字段,它是一个包含所有图片路径的字符串,格式如路径1|路径2|路径3。function='...'允许你对@me进行PHP函数处理。explode('|', @me)将字符串按 分割成一个数组。[0]取出数组的第一个元素,也就是第一张图片的路径。 页调用图集的所有图片(需要配合JS或CSS实现幻灯片效果):**
{dede:field.imglist function='str_replace("|", ",", @me)'/}
这段代码会输出所有图片路径,用逗号隔开,方便JS插件(如Bootstrap Carousel)调用。
常见问题与解决方案 (FAQ)
问题:调用后图片不显示,或者显示为空。
- 原因1:
channelid错误,请务必去后台确认你的自定义模型ID。 - 原因2:
addfields中的字段名写错了,请去后台“内容模型管理” -> “字段管理”中确认字段名。 - 原因3:该篇文章没有填写该图片字段,检查一下后台数据。
- 原因4:图片路径问题,确保图片已经上传到服务器,并且附加表中的路径是正确的。
问题:调用后图片路径不完整或错误。
-
原因:织梦存储的可能是相对路径,可以在标签里使用
function函数来处理。 -
解决方案:在调用时拼接网站根目录。
<!-- 在列表页中 --> <img src="[field:litpic function='str_replace("..", "", "@me")'/]" alt="[field:title/]" /> <!-- 更稳妥的方法是判断是否以 http 开头 --> <img src="[field:litpic runphp='yes'] if(strpos(@me, 'http') === false) @me = $cfg_cmspath . @me; @me; [/field:litpic]" alt="[field:title/]" />第二种方法更健壮,它会检查路径是否已经是完整的URL,如果不是,则补上网站根目录。
| 调用场景 | 推荐标签 | 核心参数 | 附加表字段调用方式 |
|---|---|---|---|
| 页 | {dede:field} |
无 | {dede:field.字段名/} |
| 模型列表页 | {dede:list} |
addfields='字段名'channelid='模型ID' |
[field:字段名/] |
| 首页/其他页 | {dede:arclist} |
addfields='字段名'channelid='模型ID' |
[field:字段名/] |
| 图集调用 | 同上,配合function |
同上 | [field:字段名 function='处理函数'/] |
channelid 和 addfields 是调用自定义模型数据的两个“魔法钥匙”,只要正确使用它们,就能灵活地调用到你想要的任何字段,包括图片。
