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# 编写一些东西,我更希望能够实际看到它的工作原理
使用 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# 编写一些东西,我更希望能够实际看到它的工作原理