2015-08-13 2 views
1

У меня есть две цели публикации: одна - это этап, а другая - производство. Публикация на Production должна придерживаться ограничений публикации, но публикация на сцене не должна смотреть или отбрасывать действительные и действительные даты и публиковать при любых обстоятельствах.Ограничение переопределения публикации Sitecore

Я написал трубопровод публикации (PipelinePublishProvider). Я не уверен, как мне удастся временно перезаписать значения полей, чтобы он публиковал каждую сцену.

public class StagePublishOverride : PipelinePublishProvider 
{ 

    public override PublishHelper CreatePublishHelper(PublishOptions options) 
    { 

     Assert.ArgumentNotNull(options, "options"); 

     if (options.TargetDatabase.Name.ToLower() == "stage") 
     { 
      Item itemToBePublished = new Item(options.RootItem.ID, options.RootItem.InnerData, new Database("web")); 
      itemToBePublished.Editing.BeginEdit();     
      itemToBePublished.Publishing.ValidTo = DateTime.MaxValue; 
      itemToBePublished.Publishing.ValidFrom = DateTime.MinValue; 
      itemToBePublished.Editing.EndEdit(); 
      options.RootItem = itemToBePublished; 
     } 

     if (options is ExtendedPublishOptions) 

      return new ExtendedPublishHelper(options as ExtendedPublishOptions); 

     return new PublishHelper(options); 

    } 

} 

public class ExtendedPublishHelper : PublishHelper 
{ 

    private readonly ExtendedPublishOptions _options; 

    public ExtendedPublishHelper(ExtendedPublishOptions options) 

     : base(options) 
    { 

     _options = options; 

    } 

    public override Item GetVersionToPublish(Item sourceItem) 
    { 

     Assert.ArgumentNotNull(sourceItem, "sourceItem"); 

     if (Options is ExtendedPublishOptions) 
     { 

      return sourceItem.Publishing.GetValidVersion(Options.PublishDate, _options.RequireApproval); 

     } 

     return sourceItem.Publishing.GetValidVersion(Options.PublishDate, true); 

    } 

} 

public class ExtendedPublishOptions : PublishOptions 
{ 

    public ExtendedPublishOptions(Database sourceDatabase, Database targetDatabase, PublishMode mode, Language language, DateTime publishDate, bool requireApproval) 

     : base(sourceDatabase, targetDatabase, mode, language, publishDate) 
    { 

     RequireApproval = requireApproval; 

    } 

    public bool RequireApproval { get; set; } 

} 

}

ответ

2

Я считаю, что вы будете лучше добавить процессор в publishItem трубопровода. Вот некоторые UNTESTED код, который я думаю, будет служить вашей цели:

public class PublishOverride : PublishItemProcessor 
{ 
    public override void Process(PublishItemContext context) 
    { 
     Assert.ArgumentNotNull((object)context, "context"); 
     if (context.Action != PublishAction.None) 
      return; 
     Item sourceItem = this.GetSourceItem(context); 
     if (sourceItem == null) 
      return; 

     var stagingDB = Factory.GetDatabase("Stage"); 

     if (stagingDB != null && !sourceItem.Publishing.NeverPublish && context.PublishContext.PublishOptions.TargetDatabase == stagingDB) 
     { 
      context.Action = PublishAction.PublishVersion; 
      context.VersionToPublish = sourceItem; 
     } 

    } 
    private Item GetSourceItem(PublishItemContext context) 
    { 
     Assert.ArgumentNotNull((object)context, "context"); 
     return context.PublishHelper.GetSourceItem(context.ItemId); 
    } 
} 

Убедитесь, что вы залатать его перед процессором DetermineAction в конфигурации по умолчанию. Таким образом, ваш конфигурационный патч будет выглядеть так:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:x="http://www.sitecore.net/xmlconfig/"> 
    <sitecore> 
    <pipelines> 
     <publishItem> 
     <processor patch:before="*[@type='Sitecore.Publishing.Pipelines.PublishItem.DetermineAction, Sitecore.Kernel']" 
        type="YourNamespace.PublishOverride, YourAssembly" /> 
     </publishItem> 
    </pipelines> 
    </sitecore> 
</configuration> 
+1

Код обновлен. Сделано изменение, чтобы получить элемент через метод PublishHelper.GetSourceItem. Предыдущий метод «PublishHelper.GetItemToPublish» фактически проверяет дату публикации и, следовательно, не будет удовлетворять запросу публикации без ограничений. –

+0

Спасибо Амир! Этот код действительно сработал. Очень ценю вашу помощь. –