4

Sitecore アイテムを保存するときに、ユーザーと対話するためにポップアップを表示しようとしています。変更されたデータに応じて、続行するかどうかを尋ねる一連の 1 つまたは 2 つのポップアップを表示することがあります。OnItemSaving パイプラインを利用する方法を理解しました。それは簡単です。私が理解できないのは、ポップアップを表示してユーザーからの入力に反応する方法です。現在、Sitecore.Context.ClientPage.ClientResponse オブジェクトを使用する必要があると考えています。ここに私がやろうとしていることを示すいくつかのコードがあります:

public class MyCustomEventProcessor
{
    public void OnItemSaving(object sender, EventArgs args)
    {
      if([field criteria goes here])
      {
        Sitecore.Context.ClientPage.ClientResponse.YesNoCancel("Are you sure you want to continue?", "500", "200");
        [Based on results from the YesNoCancel then potentially cancel the Item Save or show them another dialog]
      }
    }
}

別の方法を使用する必要がありますか? ShowModalDialog、ShowPopUp、ShowQuestion などもあります。これらに関するドキュメントが見つからないようです。また、これがこのようなことを行う正しい方法であるかどうかもわかりません。

4

1 に答える 1

7

プロセスは次のようになります (アイテム:保存イベントからこれを試したことはありませんが、うまくいくはずです):

  1. イベント内item:savingで、クライアント パイプラインでダイアログ プロセッサを呼び出し、一連の引数を渡します。
  2. プロセッサは次の 2 つのいずれかを行います。ダイアログを表示するか、応答を消費します。
  3. 応答が受信されると、プロセッサはそれを消費し、そこでアクションを実行できます。

上記の手順を示す例を次に示します。

private void StartDialog()
{
    // Start the dialog and pass in an item ID as an argument
    ClientPipelineArgs cpa = new ClientPipelineArgs();
    cpa.Parameters.Add("id", Item.ID.ToString());

    // Kick off the processor in the client pipeline
    Context.ClientPage.Start(this, "DialogProcessor", cpa);
}

protected void DialogProcessor(ClientPipelineArgs args)
{
    var id = args.Parameters["id"];

    if (!args.IsPostBack)
    {
        // Show the modal dialog if it is not a post back
        SheerResponse.YesNoCancel("Are you sure you want to do this?", "300px", "100px");

        // Suspend the pipeline to wait for a postback and resume from another processor
        args.WaitForPostBack(true);
    }
    else
    {
        // The result of a dialog is handled because a post back has occurred
        switch (args.Result)
        {
            case "yes":

                var item = Context.ContentDatabase.GetItem(new ID(id));
                if (item != null)
                {
                    // TODO: act on the item

                    // Reload content editor with this item selected...
                    var load = String.Format("item:load(id={0})", item.ID);
                    Context.ClientPage.SendMessage(this, load);
                }

                break;

            case "no":

                // TODO: cancel ItemSavingEventArgs

                break;

            case "cancel":
                break;
        }
    }
}
于 2013-05-01T17:44:09.643 に答える