我正在使用Sitecore 8.0 Update 5。 每当我用英语以外的语言进行“智能”发布时,我都可以看到数以千计的项目正在更新。
Job started: Publish to 'web'
Items created: 0
Items deleted: 0
Items updated: 56207
Items skipped: 13057
Job ended: Publish to 'web' (units processed: 69258)
我启用了跟踪功能,在日志中我可以看到Sitecore更新了这些项目的共享字段
##Publish Item: Name=sitecore, Uri=sitecore://master/{11111111-1111-1111-1111-111111111111}?lang=zh&ver=1, Operation=Updated, ChildAction=Allow, Explanation=Shared fields were published.
##Publish Item: Name=templates, Uri=sitecore://master/{3C1715FE-6A13-4FCF-845F-DE308BA9741D}?lang=zh&ver=1, Operation=Updated, ChildAction=Allow, Explanation=Shared fields were published.
##Publish Item: Name=List Manager, Uri=sitecore://master/{D2833213-CB77-431A-9108-55E62E4E47FD}?lang=zh&ver=1, Operation=Updated, ChildAction=Allow, Explanation=Shared fields were published.
对于树中的每个项目,列表都是这样的。 有了dotPeek,我能够在发布管道中找到一个负责确定发布操作的方法:
private void HandleSourceVersionNotFound(Item sourceItem, PublishItemContext context)
{
Assert.ArgumentNotNull((object) sourceItem, "sourceItem");
Item targetItem = context.PublishHelper.GetTargetItem(sourceItem.ID);
if (targetItem != null)
{
Item[] versions = targetItem.Versions.GetVersions(true);
if (versions.Length > 0 && versions.Any(v => v.Language != sourceItem.Language)) || Settings.Publishing.PublishEmptyItems)
context.Action = PublishAction.PublishSharedFields;
else
context.Action = PublishAction.DeleteTargetItem;
}
else if (Settings.Publishing.PublishEmptyItems)
context.Action = PublishAction.PublishSharedFields;
else
context.AbortPipeline(PublishOperation.Skipped, PublishChildAction.Skip, "No publishable source version exists (and there is no target item).");
}
在这里我们可以看到它检查项目版本,如果有除英语以外的语言版本,它会将动作设置为PublishAction.PublishSharedFields。 在我的情况下,Settings.Publishing.PublishEmptyItems设置为false,因此不应该触发共享字段发布。
我认为在我的解决方案中唯一具有非英语版本的“系统”项目是语言,但是当我查看日志中的一个项目时,我发现了一个非常有趣的事情: Sitecore default languages
这些似乎是Sitecore“默认”语言。
当我启用语言回退模块时,此行为会导致发布时出现性能问题。 (https://marketplace.sitecore.net/en/modules/language_fallback.aspx)
我的问题是:
UPD。在不同的环境中,它超过100k项目阈值并触发完整的索引重建,这是相当昂贵的操作。 (有或没有语言后备)
提前致谢!
答案 0 :(得分:1)
这是Sitecore每次发布时推送共享字段的预期行为吗? =>不,但您找到的代码并未用于每个项目。如果未找到源版本,则会发生该操作,因为该项目存在于Web中但不存在于主文档中。这就是为什么它要么发布共享字段(如果确实存在其他版本),要么完全从web中删除项目(因为它在master中不再存在)。
这是Sitecore在系统商品上只有这些默认语言的版本时推送共享字段的预期行为吗? =>我没有回答这个问题,因为没有深入调查,我现在没有时间对不起。
如何禁用这些默认语言并删除这些语言的版本? (Powershell的?)强> =>这些语言没有注册,它们出现了,因为这些项目确实有这些语言的版本。因此,如果您删除这些语言中的所有系统项的版本,它们将不再显示。您可以使用任何语言创建版本,即使是不存在的版本也可以通过代码创建。
删除这些默认语言有什么含义? =>使用该语言的任何内容编辑者可能会突然看到英语(或剩余语言),而不是他们首选的Sitecore编辑语言。除此之外,它无所谓。
我做错了会导致这种行为吗? =>不是我能从你到目前为止所看到的内容中看出来的。
答案 1 :(得分:1)
如何禁用这些默认语言并删除这些语言的版本?
如果语言是在/ sitecore / system / Languages下注册的,那么如果您删除该语言,Sitecore应删除该语言的所有项目版本。
如果语言未在/ sitecore / system / Languages下注册(或Sitecore,由于某种原因,在删除时无法将其删除),请执行数据库清理(控制面板>数据库>清理数据库) 。 Sitecore将删除使用未注册语言的任何版本的项目。
删除这些默认语言会有什么影响?
除非你打算将来使用这些语言,否则没有真正的含义。