关于 bagisto-theme-sections
用于在 Bagisto 外观区域处理主题区块的开发技能。它说明区块编辑、草稿预览和发布流程,并涵盖权限、清理和缓存更新保护。
主要功能
- 01说明主题区块编辑与结构定义
- 02将内容、状态和顺序暂存为草稿
- 03区分店面正式值与草稿预览
- 04涵盖管理员权限和启用主题检查
- 05要求选项清理及生命周期事件
- 06说明缓存更新与媒体清理
适用场景
- 01添加或修改主题区块
- 02发布前预览暂存更改
- 03丢弃草稿且不影响线上店面
- 04维护区块变更时的缓存与媒体处理
MCP 相关
这是开发技能,而非 MCP 服务。输入未说明 MCP 集成。
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ bagisto/ agent-skills --skill bagisto-theme-sections安装后在 Claude Code 中输入/bagisto-theme-sections确认已加载。
附带文件drafts.mdsections.md
详细介绍
主题分区
packages/Webkul/Theme 负责 外观 区域:主题画廊,以及构成主题店面页面的分区。分区取代了旧的 settings/themes CRUD——相关路由已移除,现在可以在实时预览旁编辑分区,而不必使用独立的表单。
参考文件
| 文件 | 何时加载 |
|---|---|
| drafts.md | 暂存模型——保存了什么、发布会执行什么操作,以及预览 |
| sections.md | 分区类型、字段架构、媒体,以及各类型的规则 |
文件位置
| 路径 | 内容 |
|---|---|
admin/appearance/themes | 主题画廊——已安装主题和待选主题 |
admin/appearance/themes/{code}/sections | 某个主题在某个渠道上的编辑器 |
appearance-preview (shop) | 根据草稿渲染、嵌入编辑器中的店面页面 |
ThemeCatalog 提供主题画廊,并负责判断 isInstalled() / isActive();SectionSchema 解析主题提供的分区类型及其字段架构;SectionRepository 负责所有读取和写入操作。
发布之前不会生效
整个区域都遵循这条规则。每一项更改都会暂存——编辑内容、启用或停用分区,以及拖动分区调整位置。每项更改都会保存到对应行中,只有在操作员发布时才会应用:
| 更改 | 保存位置 |
|---|---|
| 各语言的内容 | theme_section_translations.draft_options |
| 启用/停用 | theme_sections.draft_status |
| 顺序 | theme_sections.draft_sort_order |
如果草稿列的值与当前生效值相同,就会将其设为 null。因此,将分区停用后再重新启用,不会留下暂存内容,也不会产生空的待处理更改。只要这三列中任意一列有值,hasDraft() 就会返回 true;编辑器未保存更改的计数和每行的圆点状态都依据此值判断。
publishDraft() 会应用这三项更改,然后清除已发布选项不再引用的媒体;discardDraft() 会清除这三项草稿,并以相同方式清除媒体。
不可妥协事项
- 店面读取实时值,预览读取草稿。 开关是
SectionRepository::PREVIEWING,设置在请求的内部属性包中——绝不能通过查询参数设置,否则访客就能要求店面页面显示未发布的内容。店面使用getRenderable(),预览使用getDraftedForPreview();不要自行判断此标志。 - 预览仅限管理员访问。
appearance-preview会在bouncer()->hasPermission('appearance.sections')不满足时中止——仅通过身份验证但没有此权限的管理员也不行。 - 写入时进行净化。 仓库的
sanitizeOptions()会将选项交给类型的sanitize()——StaticContent会运行sanitizeHtml()(Purify)和sanitizeCss()——适用于草稿、发布和预览路径。新的写入路径必须经过sanitizeOptions()。 - 只能自定义启用的主题。 编辑器和每个分区操作都会拒绝其渠道未运行的主题——必须在服务端执行,不能只在图库中隐藏“自定义”。
- 分区类型与主题相关。 通过
SectionSchema::types()或$section->getTypeInstance()解析分区类型,绝不能使用硬编码列表或原始字符串。 - 每个渠道只能有一个页脚。
footer_links是单例,必须在服务端控制器中进行限制——不能只在 UI 中隐藏该类型。 - 每次更改都清除页面缓存。 FPC 监听
section.create.after、section.update.after和section.delete.before;对于rendersInLayout()为 true 的类型(footer_links、services_content或主题自有的$layout类型),必须清除整个缓存,而不只是主页缓存。 - 触发前后事件。 每项操作都会分派一对事件——
section.create.*、section.update.*、section.delete.*、section.draft.save.*、section.draft.discard.*、section.media.upload.*、section.reorder.*。新增操作必须同时触发前后事件,否则 FPC 和第三方监听器会漏掉该操作。 - 防止分区已在另一个标签页中被删除。 每项操作都通过
sectionOrFail()解析分区,并以普通的“已不存在”提示作答,而不是返回 500 错误。 - 分区的媒体目录由删除时的
SectionObserver移除,而不是由控制器移除。
必需的子技能: 在确认任何更改完成之前,使用 bagisto-change-verification。
评论
支持 Markdown