关于 enonic-controller-generator
enonic-controller-generator 是面向 Enonic XP 项目的技能,可按需求生成页面、部件、布局或响应处理器及相关文件,并检查生成结果。
主要功能
- 01检测 Enonic XP 项目与目标路径
- 02生成组件 XML 描述符和控制器
- 03生成 Thymeleaf 或 Mustache 视图
- 04配置响应处理器与站点声明
- 05更新构建依赖并验证文件
适用场景
- 01在 Enonic XP 站点中创建页面组件
- 02为部件生成配置表单和控制器
- 03添加布局区域或响应处理器
- 04检查组件文件命名与区域配置
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ webmaxru/ enonic-agent-skills --skill enonic-controller-generator安装后在 Claude Code 中输入/enonic-controller-generator确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/layout-controller.template.tspage-controller.template.tspart-controller.template.tsreferences/compatibility.mdcontroller-reference.mdexamples.mdtroubleshooting.mdscripts/find-enonic-targets.mjs详细介绍
Enonic XP 控制器生成器
流程
步骤 1:检测 Enonic XP 项目
- 执行
node scripts/find-enonic-targets.mjs <workspace-root>,定位项目根目录和现有组件。 - 如果脚本以代码 1 退出(未找到标记),告知用户未检测到 Enonic XP 项目,并停止操作。
- 记录标准输出中的
sitePath——所有生成的文件都将放在相对于此路径的目录中。
步骤 2:确定组件类型
- 确定用户需要哪种组件类型:
- 页面 — 渲染完整页面,可以声明一个或多个区域。
- Part — 带配置表单的叶组件,不包含区域。
- 布局 — 通过命名区域组织其他组件。
- 响应处理器 — 修改 HTTP 响应的站点级过滤器(例如,注入脚本)。
- 如果请求不明确,请先询问用户要使用哪种组件类型,再继续操作。
步骤 3:收集组件详情
- 询问用户或推断以下信息:
- 组件名称(kebab-case,例如
hero-banner)。 - 显示名称(易于理解的名称,例如
Hero Banner)。 - 语言 — TypeScript(
.ts,默认)或 JavaScript(.js)。请阅读references/compatibility.md,了解 TS 和 JS 之间的差异。 - 模板引擎 — Thymeleaf(默认)或 Mustache。
- 对于页面/布局:区域名称(页面默认值:
main)。 - 对于 Part:表单字段(名称、类型、出现次数)。
- 对于响应处理器:页面内容注入目标(
bodyEnd、headEnd等)及要注入的内容。
- 组件名称(kebab-case,例如
步骤 4:生成 XML 描述符
- 阅读
references/controller-reference.md,了解 XML 描述符架构。 - 创建描述符文件:
- 页面:
<sitePath>/pages/<name>/<name>.xml - Part:
<sitePath>/parts/<name>/<name>.xml - 布局:
<sitePath>/layouts/<name>/<name>.xml
- 页面:
- 加入
<display-name>、<description>、<form>(为 Part 配置输入项)以及<regions>(用于页面和布局)。
步骤 5:生成控制器
- 从
assets/中读取相应模板:- 页面使用
assets/page-controller.template.ts。 - Part 使用
assets/part-controller.template.ts。 - 布局使用
assets/layout-controller.template.ts。
- 页面使用
- 将占位符替换为实际组件名称、配置字段映射、区域名称和库导入项。
- 如果用户选择 JavaScript,请将 ES 模块语法转换为 CommonJS(
require/exports)。 - 阅读
references/controller-reference.md,了解 Portal API 的函数和导入路径。 - 将控制器放置在:
- 页面:
<sitePath>/pages/<name>/<name>.ts(或.js) - Part:
<sitePath>/parts/<name>/<name>.ts(或.js) - 布局:
<sitePath>/layouts/<name>/<name>.ts(或.js) - 处理器:
<sitePath>/processors/<name>.js
- 页面:
步骤 6:生成视图(如适用)
- 对于使用 Thymeleaf 或 Mustache 的页面、Part 和布局,在控制器所在目录中生成配对的
.html视图文件。 - 对于页面和布局,在容器元素上加入
data-portal-region="<region-name>"属性。 - 遍历区域时,使用
data-th-each="component : ${region.components}"和data-portal-component="${component.path}"。
步骤 7:接入响应处理器(如适用)
- 如果要生成响应处理器,请检查
<sitePath>/site.xml是否存在。 - 如果存在,在
<processors>块中添加一个<response-processor>条目。 - 如果不存在,则创建
<sitePath>/site.xml并加入处理器声明。 第 8 步:更新 build.gradle 依赖项 - 检查项目的
build.gradle中是否已有库引用。 - 添加缺少的依赖项:
com.enonic.xp:lib-portal:${xpVersion}— 所有控制器都必需。com.enonic.xp:lib-content:${xpVersion}— 如果控制器使用内容查询。com.enonic.lib:lib-thymeleaf:2.0.0— 如果使用 Thymeleaf 渲染。com.enonic.lib:lib-mustache:2.1.0— 如果使用 Mustache 渲染。com.enonic.lib:lib-asset:${libVersion}— 如果控制器会生成资源 URL(在 XP 7.15+ 中替代已弃用的portalLib.assetUrl)。
第 9 步:验证输出
- 确认描述符文件名与父目录名称完全一致。
- 确认控制器文件名与描述符目录名称一致。
- 确认控制器/视图中的所有区域名称均与 XML 描述符中声明的名称一致。
- 阅读
references/examples.md,将生成的代码与已验证的模式进行交叉检查。
错误处理
- 如果
scripts/find-enonic-targets.mjs以代码 1(NO_PROJECT)退出,请告知用户未找到 Enonic XP 项目,并建议在src/main/resources/site/下创建标准目录结构。 - 如果目标路径中已存在同名组件,请提醒用户并询问是要覆盖还是重命名。
- 如果用户报告部件出现 404 或区域缺失,请阅读
references/troubleshooting.md,排查常见原因。 - 如果生成的控制器在运行时出现视图解析错误,请确认视图文件与控制器位于同一目录,并确认
resolve()调用使用了正确的文件名。
评论
支持 Markdown