6

我对 Tridion 2011 中的事件系统有疑问.....当其他页面被发送到发布队列时,是否可以发布另一个页面?

我们目前有一个 XML 文件来定义我们的站点导航和站点地图,但不幸的是,当前每次向网站添加新页面时都需要手动发布。

我担心从事件系统自动发布以及必须多次发布同一页面,而实际上它只需要在发布队列中的最后一个项目结束其事务后发布。

4

3 回答 3

8

每当您想更改 Tridion 为响应发布操作而发布的项目数量时,我的脑海中都会立即尖叫custom resolver

克里斯萨默斯不久前写了一篇关于他与他们的经历的精彩文章:http ://www.tridiondeveloper.com/the-story-of-sdl-tridion-2011-custom-resolver-and-the-allowwriteoperationsintemplates-attribute

努诺更简洁地写下了他的经历:http: //nunolinhares.blogspot.com/2011/10/tridion-publisher-and-custom-resolvers.html

在我看来,您应该简单地将导航添加到那里的 ResolvedItems 集合中。如果您始终使用解析器,您也不会出现您似乎担心的这种发布事务的爆炸式增长,而是将所有相关项目都发布(和部署)在一个事务中。

于 2012-08-02T18:31:33.463 回答
7

您可以通过订阅 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;
}
于 2012-08-02T16:33:14.097 回答
4

这在实施过程中经常出现,当然导航或站点地图取决于已发布的项目(我认为这不是理想的情况)。

一个可能的解决方案是您使用事件系统将生成 XML 的页面放置在低优先级的发布队列中。这将(某种程度上)确保它仅在执行常规发布操作后才发布。现在第二个事件应该检查​​这个页面是否已经在队列中,所以它不会再次添加它。

请记住,这并不能阻止它每天发布多次,但至少应该确保它永远不会在队列中两次。在具有专用多线程发布者的快速系统上,这很可能意味着它仍然每小时左右发布一次,具体取决于您的活动等。

另一种选择是安排每天发布一次该页面,使用事件系统重复该过程,以便每天在同一时间只发布一次。这将降低您的 XML 的准确性,因为它每天只更新一次,但它会防止您的发布队列被填满,这可能是一个问题。

于 2012-08-02T16:31:10.557 回答