9

我正在使用 Sitecore 发布 API 运行我的 Sitecore 主数据库的计划发布。我在一天中以预定的时间间隔调用一个 Web 服务,它运行以下代码(为了便于阅读而略微压缩):

// grab the root content node from sitecore
Item contentNode = dbSource.Items[ID.Parse("{0DE95AE4-41AB-4D01-9EB0-67441B7C2450}")];

PublishOptions options = new PublishOptions(sourceDatabase, targetDatabase, PublishMode.Smart, lang, DateTime.Now);

options.RootItem = contentNode;

options.Deep = true;

Publisher p = new Publisher(options);

p.PublishAsync();

当我们运行上面的代码时,它会发布内容节点中的所有内容,包括所有后代,而不管工作流状态如何。就好像它完全忽略了工作流程。这不是我们所追求的,并且在我们的实时网站上造成了很多问题。

如果我们在 Sitecore Desktop 中运行相同的操作,它会发布内容节点中的所有内容,包括所有可发布的后代即在最终工作流程阶段)。它不会发布树中仍处于草稿模式的任何项目。这是必需的行为。

我尝试通过使用以下 using 语句围绕上述代码以非管理员用户身份实现代码:

string userName = @"sitecore\******";

Sitecore.Security.Accounts.User user = Sitecore.Security.Accounts.User.FromName(userName, true);

user.RuntimeSettings.IsAdministrator = false;

using (new Sitecore.Security.Accounts.UserSwitcher(user))
{
    ...
}

不幸的是,这没有任何效果。

有什么明显的我遗漏了,还是我做得对而 Sitecore 做错了?有人可以帮忙吗?

我还注意到一个奇怪的事情是,当在实时数据库中查看已发布的草稿项目时,在 Sitecore 桌面中完全没有显示任何字段或元数据。他们还显示“当前项目没有“英语:英语”版本的警告。

4

2 回答 2

15

问题可能是您的 Web 服务未在启用了工作流的站点上下文中运行。

在代码中执行此操作的最简单方法是使用 aSiteContextSwitcher更改为“shell”站点。

using (new SiteContextSwitcher(SiteContextFactory.GetSiteContext("shell")))
{
    //do your publish
}

至于没有版本的已发布项目:理论上,即使定期发布也会发生这种情况。工作流限制项目版本的发布,而不是项目本身。在您的代码中,在迭代项目时以及在其他情况下,您需要item.Versions.Count > 0在渲染之前检查是否。

于 2012-09-05T15:51:48.847 回答
4

TL;DR根内容节点具有另一种语言的版本,删除该版本,或仅以英语发布阻止以草稿模式发布项目

好的,所以在尝试了@techphoria414 的建议代码之后,很明显上下文不是问题。发布者毕竟遵守了工作流程,但问题是根内容节点具有另一种语言的版本(日语 - 不要问我这是如何到达那里的),但后代节点没有日语版本一点也不。事实上,我们的主数据库仅配置为将英语作为一种语言,因此管理员以外的用户甚至不可能添加另一种语言的版本。

我进行了一些测试,发现发布者忽略了以另一种语言存在的项目的工作流程。考虑以下场景:

1)您添加一个文件夹和下面的任何项目(“测试工作流程项目”),它具有工作流程。不要提交项目,将其保留在版本 1,处于草稿模式(即不应发布)。包含文件夹只有一种语言(英语)的一个版本:

您添加一个文件夹和下面有工作流的任何项目 文件夹只有英文版

2)您将具有深度发布的文件夹发布到您的网络数据库(使用我的问题中的代码)。这会导致以下结果(添加了文件夹,但未添加草稿“测试工作流程项目”)。这是预期的行为 - 耶!

您使用深度发布发布文件夹

3) 将新版本添加到包含不同语言的文件夹中。

以不同的语言将新版本添加到包含文件夹

4) 现在选择日语作为语言,检查子项目的工作流程状态。请注意,在装订线中它不再说它处于草稿模式,但根本没有日语版本(如右图所示)。

既然选择了日语作为语言,请检查子项目的工作流状态

5)将所有语言的包含文件夹发布到网络数据库,与以前完全相同。现在请注意,“测试工作流项目”已经发布,但根本没有任何版本。这就是我们发布时发生的情况,除了根内容节点,这意味着发布了无数不应该发布的项目

使用完全相同的代码再次发布

现在,为什么我们的根内容节点有一个日文版本是一个完全的谜,但至少我们已经弄清楚了为什么我们的草稿项目会被发布,这样我们就可以在未来阻止它。我怀疑这与升级 Sitecore 有关,因为有 2 个日语版本大致对应于过去 2 年的升级日期。

于 2012-09-11T14:24:33.713 回答