4

コンポーネントが公開されていないときにキャプチャしようとしています。いくつかのアプローチを試みますが、希望する結果が得られません。私の試みは次のとおりです。

  1. イベントシステムで。しかし、Windows には MSXML と COM+ に関する既知のバグがあるため、これは機能しません。

  2. 独自の IResolver を構築しようとしましたが、公開アクションか非公開アクションかを判断できません。

  3. 独自の ITransportPackageHandler を構築しようとしています。そこには、HandleResolvedItemForUnPublishing という関数がありますが、PublicationTarget に関する情報がなく、ステージングまたはライブから非公開であるかどうかもわかりません。

誰かが私を助けることができますか?次の場合、問題を解決できると思います。

  1. IResolver で、コンポーネントが公開されていないかどうかを判断できます。
  2. ITransportPackageHandler で、PublicationTarget 情報にアクセスできます
  3. コンテキスト変数などで IResolver から ITransportPackageHandler に情報を渡すことができれば。

どうもありがとうございます。

グスタボ。

4

2 に答える 2

6

カスタムリゾルバーのパラメーターの1つとして取得したResolvePurposeのを確認できるはずです。ResolveInstructionこれらの線に沿った何か:

public void Resolve(IdentifiableObject item, ResolveInstruction instruction, PublishContext context, ISet<ResolvedItem> resolvedItems)
{
    if (instruction.Purpose == ResolvePurpose.Publish || instruction.Purpose == ResolvePurpose.RePublish)
    { 
        // We are publishing
    }
    else if(instruction.Purpose == ResolvePurpose.UnPublish)
    {
        // We are unpublishing
    }
    // Don't know if this one exists in 2009, it exists in 2011 SP1
    else if(instruction.Purpose == ResolvePurpose.UnknownByClient)
    {
        // The server is doing something that I don't understand (yet?)
    }
}

編集

私はこの仕事をする方法を見つけることを拒否しました...

Purpose実際、Tridion 2009では、解決手順についての説明はありません。公開トランザクションにはがありますActionが、これはリゾルバーで直接公開されていません。これが私が公開しているのか非公開しているのかを知る方法です-それがやり過ぎだと思うならあなたの電話ですが、私の非本番VMでのパフォーマンスはかなり良かったです。

  1. 解決しようとしている現在のアイテムを見つける
  2. 状態が「進行中」のPublishTransactionのリストをロードします
  3. 現在のアイテムのトランザクションを検索します
  4. Action属性を見てアクションを決定します
Filter filter = new Filter();
filter.Conditions["InfoType"] = 2; // Get transactions in Progress
foreach (XmlNode node in item.Session.GetList(typeof(PublishTransaction), filter))
{
    if(node.Attributes["ItemID"].Value.Equals(item.Id.ToString()))
    {
        // we have a winner
        string action;
        if (node.Attributes["Action"].Value.Equals("0"))
            action = "Publish";
        if (node.Attributes["Action"].Value.Equals("1"))
            action = "Unpublish";
    }
}
于 2013-03-01T10:25:58.330 に答える
1

2011 を使用すると仮定すると、イベント ハンドラーを Publish Transaction Save イベントにバインドし、State を確認できます。次に、コンポーネントが公開されていないときに、必要なロジックを実行できます。

public sealed class PublishedToEventHandler: TcmExtension
{
    public PublishedToEventHandler()
    {
        EventSystem.SubscribeAsync<PublishTransaction, SaveEventArgs>(
            (subject, args, phase) =>
            {
                if (!PublishStransactionStateIsSuccessfullyCompleted(subject))
                    return;



            },
            EventPhases.TransactionCommitted
        );
    }

    static bool PublishStransactionStateIsSuccessfullyCompleted(PublishTransaction transaction)
    {
        return transaction.State == PublishTransactionState.Success ||
               transaction.State == PublishTransactionState.Warning;
    }
}

このイベントで何かが処理される前Instruction.ResolveInstruction.Purposeに、トランザクションのプロパティを確認して、非公開で公開しているかどうかを確認できます。

トランザクションにはコレクションがあり、それぞれがオブジェクトのプロパティにProcessedItemsPage または Component を含みます。ページの場合、ページに埋め込まれたコンポーネントを取得して、何かを行う必要があります。ResolvedItem.ItemProcessedItem

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-03-01T09:20:07.373 に答える