用途
该技能用于在 Adobe Commerce 的 Admin UI 扩展点(commerce/backend-ui/2)上添加或修改管理后台扩展。它允许 Commerce 应用扩展 Commerce Admin,增加自定义网格列、批量操作、订单查看按钮、菜单入口以及自定义 ACL 资源。其他扩展领域(webhooks、events、business config)通过各自独立的技能添加。
主要能力
支持的扩展点及其变体:
- 网格列(Grid columns):支持 order、product、customer、invoice、creditMemo、shipment、newsletter 实体,仅 worker 变体,需要服务端处理器。
- 批量操作(Mass actions):支持 order、product、customer、newsletter 实体,有 view / worker 两种变体,需要 worker 处理器。
- 订单查看按钮(Order view buttons):仅支持 order 实体,有 view / worker 两种变体,需要 worker 处理器。
- 菜单(Menu):单个入口(adminUi.menu),view(iframe)变体,无需处理器。
- 自定义 ACL(Custom ACL):列表形式(adminUi.acl),无变体,无需处理器,是 Commerce 在用户角色树中渲染的独立权限,由应用自行检查。
view 变体将 iframe 渲染到应用的 web UI(web-src)中对应路径;worker 变体在服务端调用运行时操作。网格列始终为 worker;菜单始终为 iframe。
使用方式
前置条件
需确认应用已脚手架化并初始化,要求同时满足:项目根目录存在 app.commerce.config.ts,且项目已初始化(生成 src/commerce-extensibility-1/ 目录并安装 node_modules,即 @adobe/aio-commerce-lib-app 依赖)。
若缺少 app.commerce.config.ts,需先调用 commerce-app-init。若配置存在但项目未初始化,运行 npx @adobe/aio-commerce-lib-app init。init 是幂等的。
只有在项目具备 TypeScript 构建设置(webpack-config.cjs + 根 tsconfig.json)后,才能用 TypeScript 编写操作;否则使用 JavaScript。
步骤 1 — 理解意图
针对用户想添加的每一项,收集:扩展点类型、实体、变体(批量操作和查看按钮)、该扩展点的字段。
步骤 2 — 在 app.commerce.config.ts 中声明
添加或合并到顶层 adminUi 块,保留所有其他领域。若 adminUi 已存在,合并而非替换。
共享字段包括:runtimeAction(格式 <package>/<action>)、confirm(可选确认对话框)、notifications(可选成功/错误提示)、sandboxPermissions(可选数组,用于 view/iframe 条目)。
步骤 3 — 注册扩展点
运行 npx @adobe/aio-commerce-lib-app init,将 commerce/backend-ui/2 添加到 app.config.yaml 和 install.yaml,并生成 src/commerce-backend-ui-2/ 扩展文件夹。此命令幂等。
构建会从 adminUi 配置派生扩展的 ext.config.yaml。当存在 view 操作时,init/generate 还会自动脚手架化 web 前端(若 web-src/index.html 已存在则跳过)。
若因 web-src 已存在而跳过脚手架,检查其 package.json 是否使用经典 React Spectrum(@adobe/react-spectrum 或 @react-spectrum/<component> 不带 s2)而非 @react-spectrum/s2。两者兼容,但 S2 是 Adobe 推荐迁移的版本。该技能仅配置 Admin UI 扩展,不驱动升级,需指向 commerce-app-migrate 技能。
步骤 4 — 实现处理器
Worker 变体(网格列、worker 批量操作、worker 查看按钮):每个 worker runtimeAction 需要一个操作,在 src/commerce-backend-ui-2/actions/ 下实现,并在 src/commerce-backend-ui-2/ext.config.yaml 的 runtimeManifest 中声明。Commerce 以 Adobe IMS 令牌调用这些 worker 操作,因此需要 require-adobe-auth: true 和 final: true。使用 @adobe/aio-commerce-sdk/admin-ui/* 入口点的 wire-contract 构建器实现处理器。
View 变体(view 批量操作、查看按钮、菜单):无需服务端处理器。Commerce 在应用 web-src 的对应路径打开 iframe。生成的 src/app.jsx 使用 @adobe/aio-commerce-lib-admin-ui/web 的 createExtensionApp 挂载 iframe 应用,其 routes 数组必须以 index 路由开头。
菜单没有 path,渲染在 index 路由(src/pages/main-page.jsx)。
对于每个 view 类型的批量操作和订单查看按钮(都带 path):检查路由是否存在,仅创建缺失的占位页面,仅在缺失时在 src/app.jsx 中注册路由。
按 view 类型预接线 hook(均来自 @adobe/aio-commerce-lib-admin-ui/web):批量操作(view)使用 useMassActionContext() 和 useHostConnection();订单查看按钮使用 useOrderViewButtonContext() 和 useHostConnection();菜单无 hook。
这些 hook 返回错误而非抛出。路由可在渲染时抛出返回的错误,交给 SDK 错误边界处理。路由组件也可调用 useIms() 和 useCommerce() 访问 Commerce REST API 或从宿主获取数据。
从菜单/view 页面调用自己的操作
菜单或 view 页面有时需要自行获取数据,可直接从 web-src 调用应用自己的操作。
适用场景
适用于需要扩展 Adobe Commerce 管理后台界面的开发场景,例如在订单网格中添加自定义列、为订单添加批量归档操作、在订单查看页添加同步库存按钮、添加自定义管理菜单入口,或定义自定义 ACL 权限资源。
限制
- 需项目已脚手架化并初始化。
- TypeScript 编写操作需项目具备 TypeScript 构建设置。
- 构建派生的 hooks、operations 和 web 部分由库管理,不可手动编辑。
- 不要手动挑选依赖版本;若已安装不兼容版本,脚手架会失败。
- 若 BABEL_ENV 已设置,需与 NODE_ENV 保持同步。
- 该技能仅配置 Admin UI 扩展,不驱动 React Spectrum 升级。
- 具体字段集和约束需查阅对应参考文件。