mcpField
B
bagisto-theme-sections

bagisto-theme-sections

github.com/bagisto设计与 UI13123 次安装2 周前更新
代码仓库

关于 bagisto-theme-sections

用于在 Bagisto 外观区域处理主题区块的开发技能。它说明区块编辑、草稿预览和发布流程,并涵盖权限、清理和缓存更新保护。

主要功能

  1. 01说明主题区块编辑与结构定义
  2. 02将内容、状态和顺序暂存为草稿
  3. 03区分店面正式值与草稿预览
  4. 04涵盖管理员权限和启用主题检查
  5. 05要求选项清理及生命周期事件
  6. 06说明缓存更新与媒体清理

适用场景

  1. 01添加或修改主题区块
  2. 02发布前预览暂存更改
  3. 03丢弃草稿且不影响线上店面
  4. 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