Sitecore发布限制覆盖

时间:2015-08-13 17:17:48

标签: sitecore publishing

我有两个发布目标 - 一个是舞台,一个是制作。制作上的发布应遵守发布限制,但在舞台上发布不应查看或放弃有效日期和有效日期,并在任何情况下发布

我编写了一个发布管道(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; }

}

}

1 个答案:

答案 0 :(得分: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>