使用 Sitecore 7.2:
有没有办法将工作流自动发布更改为运行Smart publish
而不是Republish
?
根据 https://www.sitecore.net/learn/blogs/technical-blogs/reinnovations/posts/2014/03/auto-publish-workflow-action-updates.aspx 可以添加 6 个参数(深度、相关、目标、所有语言、语言、项目语言),但我没有发现任何提及更改发布类型的内容。
编辑:由于有人建议关闭此顶部,因为它没有编程,因此可能需要一些其他细节......
我已经查看了反编译的Sitecore.Workflows.Simple.PublishAction, Sitecore.Kernel
代码(自动发布的默认行为),以查找上面链接中指定的参数是唯一的参数。所以我的理解(除非我错过了什么)是需要自定义操作。
对我来说,您可以指定深度和相关,但不能指定"智能"发布,这对我来说似乎很奇怪,所以我希望有人已经记录了这一点,所以我不需要重新发明轮子。
发布操作旨在仅为上下文中的项目(即工作流中批准的项目)触发。通常,智能发布与重新发布在单个项目级别没有太大区别。此操作会触发用户通常不会选择的其他模式:SingleItem(既不智能也不重新发布)
该操作将尝试发布上下文项,以及任何相关项(如果您指定 related 为 true)(我建议这样做)。但是,这将影响运行完全重新发布时的性能。
如果指定"deep",该操作还将发布子项。我不建议启用此功能,因为从理论上讲,在站点的主页节点上批准可能会触发站点中每个项目的发布。
对于任何寻找相同解决方案的人来说,这对我有用:
public class PublishAction
{
public void Process(WorkflowPipelineArgs args)
{
Item dataItem = args.DataItem;
Item innerItem = args.ProcessorItem.InnerItem;
NameValueCollection parameters = WebUtil.ParseUrlParameters(innerItem["parameters"]);
bool deep = this.GetDeep(parameters, innerItem);
bool related = this.GetRelated(parameters, innerItem);
bool smart = this.GetSmart(parameters, innerItem);
Database[] targets = Enumerable.ToArray<Database>(this.GetTargets(parameters, innerItem, dataItem));
Language[] languages = Enumerable.ToArray<Language>(this.GetLanguages(parameters, innerItem, dataItem));
if (!Settings.Publishing.Enabled || !Enumerable.Any<Database>((IEnumerable<Database>)targets) || !Enumerable.Any<Language>((IEnumerable<Language>)languages))
return;
PublishManager.PublishItem(dataItem, targets, languages, deep, smart, related);
}
private bool GetDeep(NameValueCollection parameters, Item actionItem)
{
return this.GetStringValue("deep", parameters, actionItem) == "1";
}
private bool GetRelated(NameValueCollection parameters, Item actionItem)
{
return this.GetStringValue("related", parameters, actionItem) == "1";
}
private bool GetSmart(NameValueCollection parameters, Item actionItem)
{
return this.GetStringValue("smart", parameters, actionItem) == "1";
}
private IEnumerable<Database> GetTargets(NameValueCollection parameters, Item actionItem, Item dataItem)
{
using (new SecurityDisabler())
{
IEnumerable<string> targetNames = this.GetEnumerableValue("targets", parameters, actionItem);
if (!Enumerable.Any<string>(targetNames))
{
Item obj = dataItem.Database.Items["/sitecore/system/publishing targets"];
if (obj != null)
targetNames = Enumerable.Where<string>(Enumerable.Select<Item, string>((IEnumerable<Item>)obj.Children, (Func<Item, string>)(child => child["Target database"])), (Func<string, bool>)(dbName => !string.IsNullOrEmpty(dbName)));
}
foreach (string name in targetNames)
{
Database database = Factory.GetDatabase(name, false);
if (database != null)
yield return database;
else
Log.Warn("Unknown database in PublishAction: " + name, (object)this);
}
}
}
private IEnumerable<Language> GetLanguages(NameValueCollection parameters, Item actionItem, Item dataItem)
{
using (new SecurityDisabler())
{
IEnumerable<string> languageNames = Enumerable.Empty<string>();
bool allLanguages = this.GetStringValue("alllanguages", parameters, dataItem) == "1";
if (allLanguages)
{
Item obj = dataItem.Database.Items["/sitecore/system/languages"];
if (obj != null)
languageNames = Enumerable.Select<Item, string>(Enumerable.Where<Item>((IEnumerable<Item>)obj.Children, (Func<Item, bool>)(child => child.TemplateID == TemplateIDs.Language)), (Func<Item, string>)(child => child.Name));
}
else
{
languageNames = this.GetEnumerableValue("languages", parameters, actionItem);
string current = this.GetStringValue("itemlanguage", parameters, dataItem);
if ((current == "1" || current == null) && !Enumerable.Contains<string>(languageNames, dataItem.Language.Name))
yield return dataItem.Language;
}
foreach (string name in languageNames)
{
Language language = (Language)null;
if (Language.TryParse(name, out language))
yield return language;
else
Log.Warn("Unknown language in PublishAction: " + name, (object)this);
}
}
}
private string GetStringValue(string name, NameValueCollection parameters, Item actionItem)
{
string str1 = actionItem[name];
if (!string.IsNullOrEmpty(str1))
return str1;
string str2 = parameters[name];
if (!string.IsNullOrEmpty(str2))
return str2;
else
return (string)null;
}
private IEnumerable<string> GetEnumerableValue(string name, NameValueCollection parameters, Item actionItem)
{
string str1 = actionItem[name];
if (!string.IsNullOrEmpty(str1))
{
return Enumerable.AsEnumerable<string>((IEnumerable<string>)str1.Split(new char[1] { '|' }, StringSplitOptions.RemoveEmptyEntries));
}
else
{
string str2 = parameters[name];
if (string.IsNullOrEmpty(str2))
return Enumerable.Empty<string>();
return Enumerable.AsEnumerable<string>((IEnumerable<string>)str2.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries));
}
}
}