织梦中文章、图片、商品等属于不同内容模型,附加表与字段各异。当需要在首页同时调取不同模型的文档并展示其附加字段时,就需要跨模型调用。本文讲解arclist跨模型调用的方法。
一、跨模型调用的难点
不同模型有独立的附加表(如文章用dede_addonarticle,商品用dede_addonshop),字段结构不同。默认{dede:arclist}只调用主表公共字段(标题、缩略图、时间),无法直接输出附加字段。
二、addfields与channelid基础用法
调用同一模型的附加字段,使用addfields指定字段名,channelid指定模型ID:
{dede:arclist typeid='5' addfields='price,spec' channelid='6' row='10'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:price/]元</span>
<span>规格:[field:spec/]</span>
</li>
{/dede:arclist}
channelid对应内容模型ID(可在"内容模型管理"查看),addfields为该模型附加表的字段名,多个用逗号分隔。
三、跨模型调用的两种思路
1. 分区块调用
最稳妥的方式是按模型分区块调用,每个区块用对应channelid:
<!-- 商品区块 -->
{dede:arclist typeid='5' addfields='price' channelid='6' row='5'}...{/dede:arclist}
<!-- 图片区块 -->
{dede:arclist typeid='8' addfields='imgurls' channelid='2' row='5'}...{/dede:arclist}
每个模型独立调用,字段不冲突,适合首页分模块展示。
2. 用sql标签统一调用
若需将不同模型文档混排展示,可用{dede:sql}联合多张附加表查询:
{dede:sql sql="SELECT a.id,a.title,b.price FROM dede_archives a LEFT JOIN dede_addonshop b ON a.id=b.aid WHERE a.channel=6 LIMIT 10"}
[field:title/] - [field:price/]元
{/dede:sql}
但跨附加表联合查询字段不同,难以统一输出,需谨慎设计。
四、调用图片模型图集
图片模型的imgurls字段存储图集数据,需用{dede:field.imgurls}或自定义处理。列表中调用首图:
{dede:arclist typeid='8' addfields='imgurls' channelid='2' row='5'}
[field:imgurls runphp=yes]
preg_match('/
]+src="([^"]+)"/',@me,$m);
@me=$m[1];
[/field:imgurls]
{/dede:arclist}
五、跨模型调用注意事项
- addfields的字段必须存在于对应channelid的附加表,否则不输出。
- 同一arclist中只能调用一个模型的附加字段,无法混用多模型字段。
- 跨模型混排建议用sql标签,但要统一字段输出格式。
- 开启生成静态的页面,附加字段更新后需重新生成。
六、性能与缓存
带附加字段的arclist比纯主表查询开销大,首页多个区块同时调用时,建议开启列表缓存或对区块结果做文件缓存。附加表字段加索引(如price),提升排序与筛选查询效率。
七、使用建议
建议优先采用"分区块调用"的方式,每个模型独立arclist,字段清晰、维护简单。只有必须混排时才用sql联合查询,并尽量控制查询条数与字段数量。规划模型时,公共字段(如图、价格)若需跨模型展示,也可在主表统一字段中冗余一份,降低跨模型调用复杂度。