是否可以以编程方式创建新版本的CQ5页面,该页面在将来某个时间有一个开始时间?
举个例子,假设我们有一个显示税率的页面。我们有一个组件允许作者上传新的费率表(以css文件的形式),并创建费率页面内容。我们希望允许作者上传将在下个月的第一天生效的费率。
我知道jcr支持多个版本的节点,但不清楚这与cq5页面版本控制的关系(或是否)。此外,是否可以在将来激活新版本。
答案 0 :(得分:1)
考虑到你所描述的要求,我可能会以稍微不同的方式完成任务......
我可能不会将我的费率表信息直接存储在页面的jcr:content节点(或其子节点)中,我可能会将其抽象到存储库中的其他位置。然后,如果您愿意,可以创建某种管理界面,以允许内容作者上传新费率的csv文件,并根据需要将其提取到存储库中。或者,假设数据来自某种类型的数据库,您可能只需编写一个作业,通过使用CQ的JDBC连接在某种计划的基础上自动对其进行控制。一旦数据在存储库中,您就可以编写显示组件以从存储库中读取数据,而不是直接在页面内部。
这种方法的优点是可以使CQ内的数据可重复使用,以便在多个页面,多个站点,甚至许多不同的显示格式上显示(如果需要)。此外,您可以设计您的jcr结构,以支持您对数据更新的任何要求,包括每日,每月,每周,每年等,显然这将取决于具体要求。
这样做的一个缺点是,由于数据和显示它的页面存在分离,您可能需要找到一种方法来确保在数据发生变化时正确清除缓存
更新(根据您的评论):
我预见到版本化页面的问题,并且我没有尝试过,所以也许它会起作用,一次只能有一个活动版本。因此,一旦下载了下个月的数据,您需要同时维护旧数据(活动)和新数据(尚未激活)。如果您在该窗口期间需要单独更改内容,那么会发生什么...从业务流程的角度来看,这对我来说似乎很麻烦。
返回缓存清除问题,如果您知道受影响的页面,特别是如果它们都在一个子树中,您可以编写一个自定义工作流程过程,使用复制器服务清除受影响页面的缓存,然后设置启动程序在节点上运行wf更改数据。
另一种选择,而且这个选项在我脑海中的定义较少,因此需要进行一些实验,即使用后来激活的CQ并取消激活以后的功能。
也许为费率数据创建一个特定的模板,隐含要求一次只有一个页面使用该模板。您的显示组件可以使用查询来查找当前有效的费率数据。
答案 1 :(得分:0)
我没有亲自试过这个,但是......
我假设您可以使用PageManager服务的createRevision方法,然后如果返回而不抛出异常,您可以调用page.getContentResource.adaptTo(Node.class),并从那里获取返回并编辑的节点税率组件的JCR属性。
请参阅PageManager
答案 2 :(得分:0)
您可以编写workflow,其中包含由日历日期到达触发的发布步骤。具有新税率的页面版本以草稿形式保留在工作流程管道中,并且仅在日期到达时发布/激活。 (所以你需要某种程序,每天醒来检查一次日历。)
答案 3 :(得分:0)
每次修改页面时,cq都会创建页面版本。 此修改页面的修改时间在页面的jcr:lastModified属性中设置。 可以使用此属性的操作来保存将来的日期并在该日期激活页面,尽管它不是首选方式。 您可以将未来日期存储为页面中的属性。 之后根据@David的建议,您可以创建工作流程或预定作业,以激活具有未来日期的页面。