Sitecore 工作流程 - 以草稿状态发布项目
Sitecore workflow - publishing item in draft state
我目前正在处理处于草稿工作流状态的 sitecore 项目。发生以下情况:
- 创建一个将进入工作流草稿状态的项目
- 从主数据库发布item/publish父项目(选择了子项目)到网络数据库,忽略发布警告提示
- 该项目将出现在网络数据库中,但没有版本
这会导致我们的控件以标准值呈现项目,因为没有版本。当然我们可以添加检查 item.Versions.Count > 0 但我的问题是为什么会这样?
处于草稿工作流状态的项目绝对不应该以任何方式出现在网络数据库中吗?
正在使用的工作流程非常标准,没有自定义。状态和命令是:
- 草稿
- 提交
- 等待批准
- 拒绝
- 同意
- 验证操作
- 已批准
- 自动发布
提前致谢。
我个人的意见是您应该检查版本计数。如果您计划支持多语言站点,则完全有可能拥有一种语言的版本,而不是另一种语言的版本(例如,尚未批准的西班牙语)。您可能希望您的控件能够处理该场景(或执行回退)。
当前语言的当前用户可能没有为他们返回有效版本是完全正确的。我希望 Web 控件的业务逻辑应该处理这些情况。
为了明确回答您的问题,发生这种情况是因为该项目不为空但它没有版本。版本是项目的维度,如果没有版本,它恰好是 "empty"。因此,您的代码获得了一个有效的非空项,但没有字段值,因为没有版本,因此您的控件不会填充数据。
这只会发生在新项目上。示例:创建一个项目并且您有 v1 处于草稿状态。您 "publish" 项目。该项目输出到 Web 数据库,但它的 v1 维度没有,因此您剩下一个没有版本的非空项目。
正如 Jay 所说,解决方案是在查询项目时检查这一点。
首先,默认工作流程应设置为项目的模板“__Standard 值”。
其次,使用 "admin" 帐户的工作流不起作用。尝试另一个帐户。
我相信您可以在配置中的每个站点节点上使用以下 属性。
<site name="website" filterItems="true" ... />
如果将此设置为 true 不能解决问题,那么除了上述设置之外,您还可以在 Sitecore.Pipelines.FilterItem.EnsureFilteredItem
步骤之前添加以下管道步骤。
public class HideEmptyItem
{
public void Process(FilterItemPipelineArgs args)
{
if ((Context.Site != null && Context.Site.DisplayMode == DisplayMode.Normal) && args.Item.Paths.Path.StartsWith("/sitecore/content/"))
{
try
{
Context.Site.DisableFiltering = true;
if (args.Item.Database.GetItem(args.Item.ID, Context.Language).Versions.Count == 0)
{
args.FilteredItem = null;
}
}
finally
{
Context.Site.DisableFiltering = false;
}
}
}
}
同时确保以下设置相应,默认为false
;
<setting name="Publishing.PublishEmptyItems" value="false" />
我确实遇到过这个问题,但方式不同。如果您使用发布限制,您最终可能会得到一个没有版本但仍然可以发布的项目。有很多方法可以让一个项目最终没有版本,而不仅仅是一个没有通过工作流推送的单一版本的新项目。上面的修复实际上是由 Sitecore 支持提供的,对我有用。
如果这对您不起作用,那么我建议在项目发布时添加检查以查看它们是否有任何版本,尽管我相信这就是上面的修复应该做的。
编辑: 将 属性 从 "hideEmptyItems" 更改为 "filterItems" 并添加了进一步的解释。
我目前正在处理处于草稿工作流状态的 sitecore 项目。发生以下情况:
- 创建一个将进入工作流草稿状态的项目
- 从主数据库发布item/publish父项目(选择了子项目)到网络数据库,忽略发布警告提示
- 该项目将出现在网络数据库中,但没有版本
这会导致我们的控件以标准值呈现项目,因为没有版本。当然我们可以添加检查 item.Versions.Count > 0 但我的问题是为什么会这样?
处于草稿工作流状态的项目绝对不应该以任何方式出现在网络数据库中吗?
正在使用的工作流程非常标准,没有自定义。状态和命令是:
- 草稿
- 提交
- 等待批准
- 拒绝
- 同意
- 验证操作
- 已批准
- 自动发布
提前致谢。
我个人的意见是您应该检查版本计数。如果您计划支持多语言站点,则完全有可能拥有一种语言的版本,而不是另一种语言的版本(例如,尚未批准的西班牙语)。您可能希望您的控件能够处理该场景(或执行回退)。
当前语言的当前用户可能没有为他们返回有效版本是完全正确的。我希望 Web 控件的业务逻辑应该处理这些情况。
为了明确回答您的问题,发生这种情况是因为该项目不为空但它没有版本。版本是项目的维度,如果没有版本,它恰好是 "empty"。因此,您的代码获得了一个有效的非空项,但没有字段值,因为没有版本,因此您的控件不会填充数据。
这只会发生在新项目上。示例:创建一个项目并且您有 v1 处于草稿状态。您 "publish" 项目。该项目输出到 Web 数据库,但它的 v1 维度没有,因此您剩下一个没有版本的非空项目。
正如 Jay 所说,解决方案是在查询项目时检查这一点。
首先,默认工作流程应设置为项目的模板“__Standard 值”。
其次,使用 "admin" 帐户的工作流不起作用。尝试另一个帐户。
我相信您可以在配置中的每个站点节点上使用以下 属性。
<site name="website" filterItems="true" ... />
如果将此设置为 true 不能解决问题,那么除了上述设置之外,您还可以在 Sitecore.Pipelines.FilterItem.EnsureFilteredItem
步骤之前添加以下管道步骤。
public class HideEmptyItem
{
public void Process(FilterItemPipelineArgs args)
{
if ((Context.Site != null && Context.Site.DisplayMode == DisplayMode.Normal) && args.Item.Paths.Path.StartsWith("/sitecore/content/"))
{
try
{
Context.Site.DisableFiltering = true;
if (args.Item.Database.GetItem(args.Item.ID, Context.Language).Versions.Count == 0)
{
args.FilteredItem = null;
}
}
finally
{
Context.Site.DisableFiltering = false;
}
}
}
}
同时确保以下设置相应,默认为false
;
<setting name="Publishing.PublishEmptyItems" value="false" />
我确实遇到过这个问题,但方式不同。如果您使用发布限制,您最终可能会得到一个没有版本但仍然可以发布的项目。有很多方法可以让一个项目最终没有版本,而不仅仅是一个没有通过工作流推送的单一版本的新项目。上面的修复实际上是由 Sitecore 支持提供的,对我有用。
如果这对您不起作用,那么我建议在项目发布时添加检查以查看它们是否有任何版本,尽管我相信这就是上面的修复应该做的。
编辑: 将 属性 从 "hideEmptyItems" 更改为 "filterItems" 并添加了进一步的解释。