2015-03-09 3 views
1

Использование Sitecore 7.2:Sitecore Workflow Авто «Смарт» Публикация

Есть ли способ, чтобы изменить Workflow Auto Опубликовать запустить Smart publish, а не Republish?

В соответствии с https://www.sitecore.net/learn/blogs/technical-blogs/reinnovations/posts/2014/03/auto-publish-workflow-action-updates.aspx есть 6 параметров, которые можно добавить (глубокие, связанные, цели, alllanguages, языки, itemlanguage), но я не нахожу никаких упоминаний об изменении типа публикации.

EDIT: Так как это было предложено этот топ будет закрыт, потому что это не программирование, некоторые дополнительные детали могут быть в порядке ...

я уже просмотрел декомпилированный Sitecore.Workflows.Simple.PublishAction, Sitecore.Kernel код (поведение по умолчанию Auto Опубликовать) для нахождения параметров, указанных в ссылке выше, являются единственными параметрами. Таким образом, мое понимание (если я не пропустил что-то) - это индивидуальное действие.

Мне кажется странным, что вы можете указать глубокие и связанные, но не можете указать «умные» публикации, поэтому я надеюсь, что кто-то уже зарегистрировал это, поэтому мне не нужно изобретать колесо.

+0

Я голосую, чтобы закрыть этот вопрос не по теме, поскольку речь идет об использовании веб-приложения, а не программирование –

+5

Это на -topic, поскольку реализация Sitecore всегда требует специальной разработки в некоторой емкости. –

+0

Короткий ответ: Нет, не в стандартном простом рабочем процессе. Длинный ответ: Да, но для этого вам нужно создать пользовательскую публикацию PublishAction. Я отвечу, если понадобится. – jammykam

ответ

0

Публикация предназначена для запуска только для элемента в контексте (т. Е. Элемента, утвержденного в рабочем процессе). В целом, умные против перепубликации не имеют большой разницы на уровне одного предмета. Это действие запускает другой режим, который обычно не выбирается пользователем: SingleItem (ни умный, ни повторно не публикуемый)

Действие будет пытаться опубликовать элемент контекста и любые связанные элементы, если вы указываете, что это правда (что я рекомендую) , Однако это повлияет на производительность при полной переиздании.

Если вы укажете «deep», действие также опубликует детей. Я не рекомендую, чтобы это было разрешено, так как одобрение на домашнем узле вашего сайта теоретически могло бы вызвать публикацию каждого элемента на сайте.

+0

«Причина, по которой вы не можете указать Smart vs. Republish, состоит в том, что эти конкретные варианты применяются только для публикации в системе» - это неверно. Когда вы публикуете отдельный элемент, у вас есть Smart vs. Republish (Incremental - это только вариант сайта). Я согласен с «deep = 0» и «related = 1», но это все еще переиздается и (что еще хуже) переиндексирует смехотворное количество элементов для 1 или 2 изменений. – thadmiller

+0

Я, должно быть, думал о чем-то другом (или более старой версии Sitecore). Просто дважды проверен в моем 7.2, и вы правы, что публикация предметов дает вам умные варианты против повторной публикации. Я обновил свой ответ, чтобы удалить неправильные данные. Спасибо @thadmiller! Я согласен с тем, что публикация, связанная с публикацией, заставляющая переиздание родственников не является результативной. –

0

Для тех, кто ищет то же решение, что это работает для меня:

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

} 
Смежные вопросы