Custom Lightning Types 实战:酒店预订集合渲染器

Custom Lightning Types Collection Renderer 完整实战:酒店搜索示例,从六个 Apex 类(HotelReservation/HotelResponse/Hotel/Room/HotelCategory/HotelRequest)到 hotelResponse CLT Collection Renderer,含完整 schema.json/renderer.json(collection 模式)+ LWC hotelDetails(双层嵌套遍历+listType sourceType)、集成步骤、Collection vs 单对象 Renderer 对比表。...

📅 2026/7/22 ✍️ ponybai 🏷️ agentforce, salesforce, lwc

酒店预订示例:Collection Renderer 列表输出覆盖

s238

本示例演示 Collection Renderer Override——当 Agent Action 返回酒店列表时,使用自定义 CLT 覆盖默认的 JSON 数组显示。与航班示例(单对象输出+自定义输入表单)不同,本例的核心是列表类型输出的集合渲染器覆盖

下载示例文件:apexClasses.ziphotelLWCandCLT.zip

酒店 Agent Action 的 Apex 类

s239

使用六个 Apex 类协同创建 Find Hotels 自定义 Agent Action:

类名职责关键字段
HotelReservation主类,含 @InvocableMethod Find hotelsfindHotels(List<HotelRequest>) → List<HotelResponse>
HotelResponse响应包装List<Hotel> hotels
Hotel酒店详情name, address, List<Room> rooms, HotelCategory
Room房间详情type, available, discountPercentage, price, petAllowed
HotelCategory星级评分star
HotelRequest搜索输入city, checkInDate, checkOutDate
注意:示例中硬编码了酒店数据(Sahara Hotels + Taj Vivanta)。生产环境从外部服务获取实时数据。

默认 UI 与结果数据

s240

Agent Action 配置:输入 checkInDate/checkOutDate/city(标准 Lightning Types:dateType/textType),输出 hotels(列表类型,引用 @apexClassType/c__Hotel)。

默认输出问题:返回的酒店列表以原始 JSON 数组展示——name/address/rooms(嵌套 type/price/petAllowed)/hotelCategory(嵌套 star)。所有数据扁平堆叠,无标签、无格式化、完全不可读。

{"hotels":[{"rooms":[{"type":"DELUX","price":2000,"petAllowed":false,"discountPercentage":15.15,"available":2}],"name":"Sahara Hotels","hotelCategory":{"star":"four"},"address":"Gacchibowli Hyderabad"},{"rooms":[{"type":"DELUX","price":2000,"petAllowed":false,"discountPercentage":15.15,"available":2}],"name":"Taj Vivanta","hotelCategory":{"star":"five"},"address":"Kokapet"}]}

自定义输出:hotelResponse CLT

s241

创建 CLT hotelResponse 覆盖列表输出 UI。关键区别:与航班示例的单对象 renderer 不同,这里使用 collection renderer

文件结构

lightningTypes/
  hotelResponse/
    schema.json
    lightningDesktopGenAi/
      renderer.json

schema.json — 声明类型映射

{"title":"Hotel Reservation","description":"Hotel Reservation","lightning:type":"@apexClassType/c__Hotel"}

renderer.json — Collection Renderer(关键区别!)

{"collection":{"renderer":{"componentOverrides":{"$":{"definition":"c/hotelDetails"}}}}}

对比航班示例:航班用 "renderer":{"componentOverrides":...}(单对象),酒店用 "collection":{"renderer":{...}}(列表)。这是两种模式的核心区别

LWC:hotelDetails

  • js-meta.xml Target:lightning__AgentforceOutput + sourceType lightning__listType + itemTypeName c__hotelResponse注意:sourceType 是 listType 而非直接 Apex 类型——因为渲染的是列表
  • JS:@api value;——Agent 传递的整个酒店列表作为 value。渲染逻辑完全在 HTML 中通过 for:each 处理
  • HTML 结构:酒店卡片(name+address+location 图标)→ 房间列表(type 粗体 + Available 数量 + Pets Allowed 状态 + 价格标签 ₹ + 折扣芯片 % Off)。两层嵌套遍历:外层 for:each={value}(酒店列表),内层 for:each={hotel.rooms}(房间列表)

集成与最终效果

s242

集成步骤

  1. 打开 Find hotels Agent Action
  2. 编辑 HotelResponse 输出的 Output Rendering 参数
  3. 选择 hotelResponse CLT → 保存("Unsupported Data Type" 可安全忽略)
  4. 重新加载 Agent 页面后测试

最终效果

搜索"Hyderabad"→ Agent 返回结构化的酒店卡片列表:Sahara Hotels(四星)+ Taj Vivanta(五星),每家含 DELUX 房间详情(₹2000/晚、15.15% 折扣、2 间可用、宠物友好状态)。从原始 JSON 到消费级酒店搜索体验。

Collection Renderer vs 单对象 Renderer 对比

维度航班示例(单对象)酒店示例(Collection)
renderer.json 结构"renderer":{"componentOverrides":...}"collection":{"renderer":{"componentOverrides":...}}
LWC sourceTypec__flightResponse(Apex 类型名)lightning__listType + itemTypeName="c__hotelResponse"
数据接收@api value 接收单个对象@api value 接收整个数组,HTML 中 for:each 遍历
适用场景返回单个复杂对象(如航班详情)返回列表(如搜索结果、多酒店、多产品)

总结:航班和酒店两个示例完整覆盖了 Custom Lightning Types 的两大核心模式——单对象输出+自定义输入表单(编辑器+渲染器),以及列表输出的集合渲染器覆盖。选择哪种模式取决于 Agent Action 的输出是单个对象还是列表。