【问题标题】:How to programmatically create a new version of a CQ5 page?如何以编程方式创建 CQ5 页面的新版本?
【发布时间】:2013-01-11 19:15:12
【问题描述】:

是否可以以编程方式创建具有未来某个时间开始时间的 CQ5 页面的新版本?

例如,假设我们有一个显示税率的页面。我们有一个组件允许作者上传新的费率表(以 css 文件的形式)并创建费率页面内容。我们希望允许作者上传下月初生效的费率。

我知道 jcr 支持多个版本的节点,但不清楚这与 cq5 页面版本控制如何(或是否)相关。以及,未来是否可以激活新版本。

【问题讨论】:

  • 我假设你的意思是 csv,而不是 css 文件?

标签: aem


【解决方案1】:

鉴于您所描述的要求,我可能会以稍微不同的方式完成任务...

我可能会将我的费率表信息直接存储在页面的 jcr:content 节点(或它们的子节点)中,而不是将其抽象到存储库中的其他位置。然后,如果您愿意,您可以创建某种管理界面,以允许内容作者上传他们的新费率 csv 文件,并根据需要将其摄取到存储库中。或者,假设数据来自某种数据库,您可能只需编写一个作业,通过使用来自 CQ 的 JDBC 连接在某种预定的基础上自动注入它。一旦数据在存储库中,您就可以编写显示组件以从存储库中读取数据,而不是直接在页面内。

这种方法的优点是可以在 CQ 中重复使用这些数据,以便在多个页面、多个站点上显示,如果需要,甚至可以在许多不同的显示格式上显示。此外,您可以设计您的 jcr 结构以支持您对数据更新的任何要求,包括每日、每月、每周、每年等,显然这将取决于具体要求。

这样做的一个缺点是,由于数据和显示数据的页面之间存在分离,因此您可能需要找到一种方法来确保在数据发生更改时正确清除缓存.

更新(根据您的评论):

我预见到对页面进行版本控制的问题,并且我没有尝试过,所以也许它会起作用,一次只能有一个活动版本。因此,一旦下个月的数据上传,您需要同时维护旧数据(活动)和新数据(尚未活动)。如果您需要在该窗口期间单独更改内容会发生什么......从业务流程的角度来看,这对我来说似乎很混乱。

回到缓存清除问题,如果您知道受影响的页面,特别是如果它们都在一个子树中,您可以编写一个自定义工作流程,使用复制器服务来清除受影响页面的缓存,然后设置一个启动器在数据节点更改时运行 wf。

另一个选项,这个选项在我的脑海中定义较少,因此需要进行一些实验,将使用内置的 CQ,稍后激活并停用以后的功能。

也许为费率数据创建一个特定的模板,其中隐含的要求是一次只有一个使用该模板的页面处于活动状态。您的显示组件可以使用查询来查找当前有效的费率数据。

【讨论】:

  • 这是我们目前已经实现的。我们对缓存也有同样的担心。看来我们应该能够更好地利用 cq5/sling/jcr 提供的功能。
【解决方案2】:

我没有亲自尝试过,但是...

我假设您可以使用 PageManager 服务的 createRevision 方法,然后如果该方法返回而不抛出异常,您可以调用 page.getContentResource.adaptTo(Node.class),然后从那里获取返回的节点并进行编辑税率组件的 JCR 属性。

PageManager

【讨论】:

    【解决方案3】:

    您可以编写一个workflow,其中包含一个由日历日期的到来触发的发布步骤。具有新税率的页面版本以草稿形式保留在工作流管道中,并且仅在日期到达时发布/激活。 (因此,您需要某种每天唤醒一次的进程来检查日历。)

    【讨论】:

      【解决方案4】:

      每次修改页面时,cq 都会创建该页面的一个版本。 此修改页面的修改时间在页面的 jcr:lastModified 属性中设置。 可以操作此属性以保存未来日期并在该日期激活页面,尽管它不是首选方式。 您可以将未来日期作为属性存储在页面中。 稍后按照@David 的建议,您可以创建工作流或计划作业,以激活具有未来日期的页面。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-25
        • 1970-01-01
        • 2015-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多