Sitecore 如何在通过管道保存时以不同语言保存项目

Sitecore How to save items in different languages when saved via pipeline

使用 Sitecore item:saved 事件处理程序,我正在尝试添加其他语言的项目。所以如果你说,用一种语言添加一个项目,它应该在保存时自动添加其他给定语言的项目。

现在,我可以从 master 数据库中获取所有语言。问题是在添加新语言的新版本时,它会自行触发,因此递归添加 "infinite" 新元素直到崩溃。怎么可能绕过这个?

public void OnItemSaved(object sender, EventArgs args)
{
    Item savedItem = Event.ExtractParameter(args, 0) as Item;

    if (savedItem.Versions.Count == 1)
    {
        // Allow only non null items and allow only items from the master database | 
        if (savedItem != null && savedItem.Database.Name.ToLower() == "master")
        {
            // Do some kind of template validation to limit only the items 
            if (savedItem.TemplateID == ID.Parse("{template id}"))
            {
                // Get all the installed languages from the master database
                var installedLanguages = LanguageManager.GetLanguages(Database.GetDatabase("master"));

                // Go through every language in the list
                foreach (var language in installedLanguages)
                {

                    // Copy item to the new language
                    if (savedItem.Language.Name != language.Name)
                    {
                        using (new LanguageSwitcher(language.Name))
                        {
                            // Save the new item, but it fails since it triggers itself (the event)
                            savedItem.Versions.AddVersion();

                        }

                    }
                }
            }
        }
    }

试试这个代码:

foreach (var language in installedLanguages)
{
    if (savedItem.Language.Name != language.Name)
    {
        var otherLanguageItem = savedItem.Database.GetItem(savedItem.ID, language);
        if (otherLanguageItem.Versions.Count == 0)
        {
            otherLanguageItem.Versions.AddVersion();
        }
    }
}

自从我完成任何 Sitecore 工作以来已经有一段时间了,而且我目前无法访问 Sitecore 实例来测试代码示例,但是解决这个问题的一种方法是将更新的集合上下文中的项目 ID。该方法(在伪代码中)可以在您的模板检查之后立即插入(以保持较便宜的检查早于较昂贵的检查)并且会像这样:

- retrieve collection of updated items from context or create - if collection contains current item id, return immediately - add current item id to collection

如果需要的话,我很乐意更清楚地说明这在语法上看起来如何,但老实说,如果我用 C# 编写一些东西,我更希望能够实际看到它的工作原理