PAYATHON 2026

如何在多个 portals 之间保持 2sxc content types 同步?

技术老齐

新项目优先考虑 App Inheritance

如果这些 portals 位于同一个 DNN 安装中,需要复用同一个 2sxc app,可以优先考虑 Inherited Apps(App Inheritance):集中维护一个 Ancestor App,再在各 portal 中创建继承它的 Descendant App。

Ghost Content Types 仍然存在,当前文档称其为 App Shared Content-Types。官方文档将 Inherited Apps 列为解决这类问题的较新方案。官方说明

使用前,需要确认所用版本支持 App Inheritance,且相应授权和功能已启用。如果只需共享少数 content types,可以单独评估 App Shared Content-Types。

为什么适合用 App Inheritance

App Inheritance 可以集中复用 content types、queries、views 和共享目录中的模板文件。修改 Ancestor App 会影响继承它的各个 Descendant App,从而减少逐个 portal 更新的工作。

Descendant App 也会继承 Ancestor App 中的数据,可以添加本地内容,但不能直接修改继承的数据。如果各 portal 需要分别维护内容,Ancestor App 中就应只保留适合所有子站使用的数据。继承范围与限制

配置步骤

以下步骤采用当前文档中的 DNN 配置流程,旧版本的界面入口可能不同。

  1. 在 Manage Zone → Extensions / Features 中搜索 shared,确认授权包含所需功能,并启用 SharedAppCode 和 SharedApps。
  2. 准备 Ancestor App,建议放在专门的非公开管理站点。在 App Settings → App → Configuration → Metadata 中添加 Is-Shared (Decorator) - for Apps。
  3. 将 app 文件夹复制到 /Portals/_default/2sxc/,保持文件夹名称一致。
  4. 将每个 view 的模板 Location 改为 App Files in Shared (Global) section。备份并移除旧的站点本地 app 文件夹后,检查模板和资源是否正常加载。
  5. 在目标 portal 的 Apps 管理界面中,展开 + 菜单,选择 Create inherited app,再选择 Ancestor App,创建 Descendant App。每个目标 portal 都需要执行一次。官方配置步骤

文件复制示例

第 3 步可以使用以下 Bash 命令。执行前,请将占位符替换为实际路径,完成备份,并确认目标目录没有同名 app:

# 创建共享 Apps 目录
mkdir -p "<web-root>/Portals/_default/2sxc"

# 将 app 文件夹复制到共享位置,保留原文件夹名
cp -R \
  "<web-root>/Portals/<site-id>/2sxc/<app-folder>" \
  "<web-root>/Portals/_default/2sxc/"

命令只负责复制文件,共享标记、模板位置和继承关系仍需在管理界面中配置。

如果只需要共享 content types

可以继续使用 App Shared Content-Types:

  1. 在一个管理用的 Master App 中维护类型定义。
  2. 在其他 apps 中创建引用这些定义的共享类型。
  3. 后续在 Master App 中统一修改定义。

当前文档说明,创建 Ghost 类型的隐藏按钮只有在 developer mode 下才会显示。按旧教程操作时找不到入口,并不代表该机制已经移除。

这类 app 导出时不会包含所引用的类型定义。因此,迁移到其他环境时,必须先部署持有定义的 Master App。App Shared Content-Types 文档

Global Shared Content-Types 通过文件提供整个安装中都可用的类型,适用范围更广。对于“同一个 app 安装在多个站点”的场景,官方文档仍建议优先考虑 App Shared Types,不宜仅凭名称就改用 Global Shared Content-Types。此外,使用 Global Shared Content-Types 时,字段重命名后,已有数据不会自动跟随改名。Global Content-Types 文档

上线前需要注意什么

  • Ancestor App 的数据也会被继承,因此不要把某个生产 portal 的专属内容直接用作所有子站的公共基础。
  • 共享模板应放在全局目录中。Ancestor App 的站点本地模板及 ADAM 文件不会随继承自动提供给其他站点。文件继承限制
  • 如果各 portal 已经有独立的类型和数据,应先在测试环境规划迁移,核对字段映射、关联和已有内容。上述流程主要用于新建继承关系,不能据此假定已有 apps 会自动合并。
  • 如果 portals 分属不同 DNN 安装,应按多个部署环境管理类型定义和 app 更新。这里的跨站继承流程不能直接用作跨安装实时同步方案。

备注:内容仅供参考。