【问题标题】:Sitecore Workflow Auto "Smart" PublishSitecore Workflow 自动“智能”发布
【发布时间】:2015-05-11 02:21:57
【问题描述】:

使用 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 代码(自动发布的默认行为),发现上面链接中指定的参数是唯一的参数。所以我的理解(除非我错过了什么)是需要自定义操作。

您可以指定深度和相关,但不能指定“智能”发布对我来说似乎很奇怪,所以我希望有人已经记录了这一点,所以我不需要重新发明轮子。

【问题讨论】:

  • 我投票结束这个问题,因为它是关于使用网络应用程序而不是编程
  • 这是主题,因为 Sitecore 实施总是需要以某种能力进行自定义开发。
  • 简短回答:不,不在默认的简单工作流程中。长答案:是的,但您必须创建一个自定义 PublishAction 才能做到这一点。如果你需要,我会敲一个答案。

标签: sitecore sitecore7 sitecore7.2


【解决方案1】:

PublishAction 仅针对上下文中的项目(即工作流中批准的项目)触发。一般来说,智能与重新发布在单个项目级别上没有太大区别。此操作会触发用户通常不会选择的不同模式:SingleItem(既不智能也不重新发布)

该操作将尝试发布上下文项以及任何相关项,如果您指定相关项为真(我建议这样做)。但是,这会影响完全重新发布运行时的性能。

如果您指定“深度”,则该操作还将发布子项。我不建议启用此功能,因为您网站的 Home 节点上的批准理论上可能会触发网站中每个项目的发布。

【讨论】:

  • “您不能指定 Smart vs. Republish 的原因是因为这些特定选项仅适用于系统范围的发布” - 这是不正确的。当您发布单个项目时,您有智能与重新发布(增量仅是站点范围的选项)。我同意 'deep=0' 和 'related=1',但这仍然会重新发布和(更糟糕的是)为 1 或 2 次更改重新索引大量荒谬的项目。
  • 我一定在想别的东西(或旧的 Sitecore 版本)。刚刚在我的 7.2 中仔细检查了一下,您是正确的,项目发布确实为您提供了智能与重新发布选项。我已更新我的答案以删除不正确的详细信息。谢谢@thadmiller!我同意强制重新发布相关的“相关”发布是无效的。
【解决方案2】:

对于寻求相同解决方案的任何人,这对我有用:

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));
        }
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 2020-12-11
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多