2016-06-14 8 views
2

私はEpiServer 8で作業しており、スケジュールされた公開が保存されるときにカスタムAPI呼び出しを実行する必要があります。エディタは、すぐにコンテンツを公開する際にEpiServer 8では、Scheduled Publishイベントをどのように拡張できますか?

[InitializableModule] 
[ModuleDependency(typeof(EPiServer.Web.InitializationModule))] 
public class ContentEventInitializer : IInitializableModule 
{ 
    public void Initialize(InitializationEngine initializationEngine) 
    { 
     var events = ServiceLocator.Current.GetInstance<IContentEvents>(); 
     events.PublishingContent += EventsPublishingContent; 
    } 

    public void Preload(string[] parameters) 
    { 
    } 

    public void Uninitialize(InitializationEngine initializationEngine) 
    { 
     var events = ServiceLocator.Current.GetInstance<IContentEvents>(); 
     events.PublishingContent -= EventsPublishingContent; 
    } 

    private void EventsPublishingContent(object sender, ContentEventArgs contentEventArgs) 
    { 
     // Tell our API that maintenance started. 
    } 
} 

上記EventsPublishingContentイベントに動作します。現在、私はそうは次のように、初期化モジュールを介して即時公開イベントをキャプチャすることができますよ。そのメソッドのVisual Studioブレークポイントが正常にヒットします。しかし、サイトエディタが「公開スケジュール」を選択したときに実行されることはありません。

エディタ]ダイアログ「を公開のスケジュール」を見て、「スケジュール」ボタンを選択した場合、私は次のことをキャプチャし、私たちのAPIに送信したいと思います:

  • の「公開の変更"値。
  • 公開されるページ。

これを実行する適切な方法は何ですか?ありがとう。

+1

パブリッシュをスケジュールするまでの時間枠はどのくらいですか?エディタアクションと実際のスケジュールされたジョブ実行の間にアプリケーションプールがリサイクルされていないことは確かですか?ジョブのコードを見ると、パブリッシュ/パブリッシュされたイベントを起動するコンテンツリポジトリのPublish()アクションが呼び出されました。 –

+0

ありがとうValdis。現在、このプロジェクトはまだ開発中ですが、私はプログラミングとテストを行うエディターです。基本的には、「公開スケジュール」イベントをインターセプトして、公開タイムスタンプと公開されるページを別々のAPIに送信できるようにしたいと考えています。 –

+1

あなたは* ContentSaved *イベントを潜在的に配線して、コンテンツの* StartPublish *プロパティを見ることができるようなサウンドはありますか? –

答えて

1

ここでは、私が実行したソリューションの重要な部分があります。最終的に私はIContentEventsから約10件の潜在的なイベントでブレークポイントを突きつけ、私の目的に役立つ2つの独立したイベントを見つけました。残念ながら、EpiServerデータベースからスケジュールされた公開タイムスタンプをフェッチしなければなりませんでした。コード内のいくつかのTODOノートが提供されています。これは答えを合理化するためのものです。

コード内の備考は私の所見に基づいています。私はEpiServerの達人ではありません。

using EPiServer; 
using EPiServer.Core; 
using EPiServer.Framework; 
using EPiServer.Framework.Initialization; 
using EPiServer.ServiceLocation; 

namespace MySite.Helpers 
{ 
    [InitializableModule] 
    [ModuleDependency(typeof(EPiServer.Web.InitializationModule))] 
    public class ContentEventInitializer : IInitializableModule 
    { 
     public void Initialize(InitializationEngine initializationEngine) 
     { 
      var events = ServiceLocator.Current.GetInstance<IContentEvents>(); 
      events.CheckedInContent += checkedInContent; 
      events.PublishedContent += publishedContent; 
     } 

     public void Uninitialize(InitializationEngine initializationEngine) 
     { 
      var events = ServiceLocator.Current.GetInstance<IContentEvents>(); 
      events.CheckedInContent -= checkedInContent; 
      events.PublishedContent -= publishedContent; 
     } 

     /// <summary> 
     /// Occurs when a version of a content item has been checked in. 
     /// </summary> 
     /// <remarks> 
     /// This is called after a scheduled publish gets saved. It's not called after an immediate publish. 
     /// Useful for executing custom events following a scheduled publish. When this event occurs, 
     /// you can fetch the publish timestamp from dbo.tblWorkContent.DelayPublishUntil. 
     /// Prior to this event the DelayPublishUntil value will be NULL. 
     /// </remarks> 
     public static void checkedInContent(object sender, ContentEventArgs contentEventArgs) 
     { 
      // Fetch timestamp from dbo.tblWorkContent.DelayPublishUntil. 
      ConnectInfo connectInfo = new ConnectInfo("MyEpiServerDatabase"); 
      PlannedMaintenanceInfo plannedMaintenanceInfo = new PlannedMaintenanceInfo(ref connectInfo, contentEventArgs.Content.ContentLink.WorkID); 
      connectInfo = null; 
      // The PlannedMaintenanceInfo method above uses the following SQL query: 
      // string query = string.Format("SELECT URLSegment, DelayPublishUntil FROM tblWorkContent WHERE pkId = {0}", WorkID); 

      // TODO: Notify API about this planned maintenance window. 
     } 

     /// <summary> 
     /// Occurs when a content item or a version of a content item has been published. 
     /// </summary> 
     /// <remarks> 
     /// This is called after an immediate publish. It's not called after a scheduled publish gets saved. 
     /// Useful for executing custom events following an immediate publish. 
     /// </remarks> 
     public void publishedContent(object sender, ContentEventArgs contentEventArgs) 
     { 
      // TODO: Notify API that an immediate maintenance window has started. 
     } 
    } 
} 

簡潔にするために、データ検索コードおよびその他の可動部分は省略されています。あなたがこれを読んでいるなら、私はあなたがデータを取得する方法を知っていると仮定し、とにかくそれを行うための独自の設定やフレームワークを持っています。私が書いた実際のSQLクエリは、checkedInContentメソッドのコメントにあります。だからあなたはそれを取って自分のデータベースでそれを実行することができます。そこで重要なことは、WorkIDをクエリに渡すことです。そのIDはcontentEventArgs.Content.ContentLink.WorkIDから取得されます。

EpiServerは、タイムスタンプ値を公開して、フォーム提出中に最終的にtblWorkContent.DelayPublishUntilに保存されることを希望します。そうすれば、データベースから値をフェッチする必要はありません。これは、より一般的な方法でこれを再利用することを容易にします。そこで、タイムスタンプを抽出するためにデータベース接続文字列を提供する必要はありません。その値がいくつかの不動産に公開されていて、それを逃してしまった場合は、私に知らせてください。

このコードが誰かを助けてくれることを願っています。

1

「公開用のスケジュール」を使用すると、スケジュールされたジョブによってページが公開されますが、少なくともそのようなイベントは発生しないと思われます。 http://world.episerver.com/blogs/Petra-Liljecrantz/Dates/2016/3/differences-between-scheduled-publish-and-normal-publish/

+0

そのリンクをありがとう。多分、私はtblWorkContentのDelayPublishUntilフィールドを見るためのタスクを作成する必要があります。スケジュールされたパブリッシュが保存されると、その値がどこにあるかがわかります。 「スケジュール」ボタンでそのクリックイベントをキャプチャできればいいですね。 –

関連する問題