【发布时间】:2012-08-02 15:52:20
【问题描述】:
我对 Tridion 2011 中的事件系统有疑问.....当其他页面被发送到发布队列时,是否可以发布另一个页面?
我们目前有一个 XML 文件来定义我们的网站导航和站点地图,但不幸的是,目前每次向网站添加新页面时都需要手动发布。
我担心从事件系统自动发布以及必须多次发布同一页面,而实际上它只需要在发布队列中的最后一个项目结束其事务后发布。
【问题讨论】:
标签: tridion
我对 Tridion 2011 中的事件系统有疑问.....当其他页面被发送到发布队列时,是否可以发布另一个页面?
我们目前有一个 XML 文件来定义我们的网站导航和站点地图,但不幸的是,目前每次向网站添加新页面时都需要手动发布。
我担心从事件系统自动发布以及必须多次发布同一页面,而实际上它只需要在发布队列中的最后一个项目结束其事务后发布。
【问题讨论】:
标签: tridion
每当您想更改 Tridion 为响应发布操作而发布的项目数量时,我的脑海中都会立即出现自定义解析器。
克里斯·萨默斯(Chris Summers)不久前写了一篇关于他与他们的经历的精彩文章:http://www.tridiondeveloper.com/the-story-of-sdl-tridion-2011-custom-resolver-and-the-allowwriteoperationsintemplates-attribute
Nuno 把他的经历写得更简洁一点:http://nunolinhares.blogspot.com/2011/10/tridion-publisher-and-custom-resolvers.html
在我看来,您应该简单地将导航添加到那里的 ResolvedItems 集合中。如果您始终如一地使用解析器,您也不会遇到您似乎担心的发布事务的爆炸式增长,而是会在单个事务中发布(和部署)所有相关项目。
【讨论】:
您可以通过订阅 PublishTransaction Save 事件来发布每个事务的站点地图(可以包含许多页面、结构组等)。
您可以考虑验证发布队列并查看是否有等待事务,但理论上这可能会将站点地图的发布推迟非常非常长的时间。
EventSystem.SubscribeAsync<PublishTransaction, SaveEventArgs>(
(subject, args, phase) =>
{
if (!PublishStransactionStateIsSuccessfullyCompleted(subject))
return;
// Code to publish sitemap
},
EventPhases.TransactionCommitted
);
static bool PublishStransactionStateIsSuccessfullyCompleted(PublishTransaction transaction)
{
return transaction.State == PublishTransactionState.Success ||
transaction.State == PublishTransactionState.Warning;
}
【讨论】:
这是在实施过程中经常出现的问题,当然导航或站点地图取决于已发布的项目(我认为这不是理想的情况)。
对此的一个可能解决方案是您使用事件系统将生成 XML 的页面以低优先级放置在发布队列中。这将(在某种程度上)确保它仅在执行常规发布操作后才发布。现在第二个事件应该检查这个页面是否已经在队列中,所以它不会再次添加它。
请记住,这并不能阻止它每天发布多次,但至少应该确保它永远不会排在队列中两次。在具有专用多线程发布者的快速系统上,这很可能意味着它仍然会每隔一小时左右发布一次,具体取决于您的活动等。
另一种选择是安排该页面每天发布一次,使用事件系统重复该过程,以便每天在同一时间只发布一次。这会降低您的 XML 的准确性,因为它每天只更新一次,但它会防止您的发布队列被填满,这可能是个问题。
【讨论】: