事件系统 - 可以在发布页面时发布另一个页面吗?

时间:2012-08-02 15:52:20

标签: tridion

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

我们目前有一个XML文件,用于定义我们的网站导航和站点地图,但遗憾的是,每次将新页面添加到网站时,都需要手动发布。

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

3 个答案:

答案 0 :(得分:8)

每当您想要更改Tridion为响应发布操作而发布的项目数时,我的大脑立即尖叫 自定义解析程序

克里斯·萨默斯很久以前对他们的经历做了很好的写作: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集合中。如果您始终如一地使用解析器,您也不会获得您似乎担心的发布事务的爆炸性增长,而是在单个事务中发布(和部署)所有相关项目。

答案 1 :(得分:7)

您可以通过订阅PublishTransaction Save事件来发布每个事务的Sitemap(可以包含许多页面,结构组等)。

您可以考虑验证发布队列并查看是否有等待事务,但从理论上讲,这可能会推迟Sitemap的发布很长一段时间。

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;
}

答案 2 :(得分:4)

这在实施过程中会出现很多次,当然还有导航或站点地图取决于已发布的项目(在我看来这不是一个理想的情况)。

可能的解决方案是使用事件系统将生成XML的页面置于具有低优先级的发布队列中。这将(有些)确保它仅在执行常规发布操作后发布。其次,事件应该检查​​此页面是否已经在队列中,因此它不会再次添加它。

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

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