织梦arclist跨模型调取文档

织梦中文章、图片、商品等属于不同内容模型,附加表与字段各异。当需要在首页同时调取不同模型的文档并展示其附加字段时,就需要跨模型调用。本文讲解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}

五、跨模型调用注意事项

六、性能与缓存

带附加字段的arclist比纯主表查询开销大,首页多个区块同时调用时,建议开启列表缓存或对区块结果做文件缓存。附加表字段加索引(如price),提升排序与筛选查询效率。

七、使用建议

建议优先采用"分区块调用"的方式,每个模型独立arclist,字段清晰、维护简单。只有必须混排时才用sql联合查询,并尽量控制查询条数与字段数量。规划模型时,公共字段(如图、价格)若需跨模型展示,也可在主表统一字段中冗余一份,降低跨模型调用复杂度。