BLOG

Sitecore ブログ
Sitecoreのワークボックスのカスタマイズ

2017/11/29 17:00
潮田 潤一郎

はじめまして、潮田と申します。

私は現在、主にSitecoreを利用したシステム開発・導入プロジェクトに携わっています。

今日は、Sitecoreのワークボックスに検索条件を追加する方法についてご紹介したいと思います。

※Sitecoreのバージョンは8.2 rev. 170728 (Update-5)を使用しています。

 

1 ワークボックスのリボンに検索条件を追加

下図のRefreshボタンの右側に検索条件を追加したいと思います。

(カスタマイズ前のワークボックス)

 

 

1.1 C#にてSitecore.Shell.Web.UI.WebControls.RibbonPanelを継承したクラスを用意し、Renderメソッドをoverrideします。

        using Sitecore.Data.Items;

        using Sitecore.Globalization;

        using Sitecore.Shell.Framework.Commands;

        using Sitecore.Shell.Web.UI.WebControls;

        using Sitecore.Web.UI.HtmlControls;

        using Sitecore.Web.UI.WebControls.Ribbons;

        using System.Web;

        using System.Web.UI;

        namespace Foundation.Custom.CustomWorkflow

        {

            public class SearchPanel : RibbonPanel

            {

                public override void Render(HtmlTextWriter output, Ribbon ribbon, Item button, CommandContext context)

                {

                    var condition =  HttpUtility.HtmlEncode(Registry.GetString("/Current_User/Workbox/condition"));

                    var label = HttpUtility.HtmlEncode(Translate.Text("Search"));

 

                    output.Write("<script type='text/javascript'>");

                    output.Write("function Search_Execution(obj, event)");

                   output.Write("{");

                    output.Write("    var proce = 'Search_Execution()';");

                    output.Write("    return scForm.postEvent(obj, event, proce);");

                    output.Write("}");

                    output.Write("</script>");

                    output.Write("<div class='scRibbonToolbarPanel'>");

                    output.Write("  <table");

                    output.Write("  <tbody>");

                    output.Write("  <tr>");

                    output.Write("    <td>");

                    output.Write("      <input type='text' id='txtCondition' class='scRibbonToolbarSmallInputBoxInput' value='" + condition + "' />");

                    output.Write("    </td>");

                    output.Write("    <td>");

                    output.Write("      <input type='button' id='btnCondition' value='" + label + "' style='margin-left: 15px;' onclick='return Search_Execution(this, event);' />");

                    output.Write("    </td>");

                    output.Write("  </tr>");

                    output.Write("  </tbody>");

                    output.Write("  </table>");

                    output.Write("</div>");

                }

            }

        }

 

1.2 Sitecoreのcoreデータベースに移動し、コンテンツエディターから「/sitecore/content/Applications/Workbox/Ribbon/Home」にChunk(/sitecore/templates/System/Ribbon/Chunk )を挿入します。

1.3 ChunkにPanel(/sitecore/templates/System/Ribbon/Panel)を挿入し、typeフィールドに上記のクラスを設定します。


検索条件が追加された事が確認できます。
(カスタマイズ後のワークボックス)



2 検索処理の実装

2.1 C#にてSitecore.Shell.Applications.Workbox.WorkboxFormを継承したクラスを用意します。

2.2 ワークボックス画面の検索ボタン押下時のメソッドを用意します。

        namespace Foundation.Custom.CustomWorkflow

        {

            public class CustomWorkboxForm : WorkboxForm

            {

                protected void Search_Execution()

                {

                    Registry.SetString("/Current_User/Workbox/condition", Context.ClientPage.ClientRequest.Form["txtCondition"]);

                    base.Refresh();

                }

            }

        }

 

2.3 既存の「GetStateItems」メソッドに検索条件を追加します。

※「GetStateItems」メソッドは元々 private で定義されている為、関連する処理も適宜追加が必要になります。

 

        namespace Foundation.Custom.CustomWorkflow

        {

            public class CustomWorkboxForm : WorkboxForm

            {

                private WorkboxForm.StateItems GetStateItems(WorkflowState state, IWorkflow workflow)

                {

                    List<Item> list = new List<Item>();

                    List<string> list2 = new List<string>();

                    DataUri[] items = workflow.GetItems(state.StateID);

                    bool flag = items.Length > Settings.Workbox.StateCommandFilteringItemThreshold;

                    if (items != null)

                    {

                        // Add start
                        var condition = Registry.GetString("/Current_User/Workbox/condition");
                        // Add end

 

                        DataUri[] array = items;

                       for (int i = 0; i < array.Length; i++)

                        {

                            DataUri uri = array[i];

                            Item item = Context.ContentDatabase.GetItem(uri);

                            if (item != null && item.Access.CanRead() && item.Access.CanReadLanguage() && item.Access.CanWriteLanguage() && (Context.IsAdministrator || item.Locking.CanLock() || item.Locking.HasLock()))

                            {

                                // Add start
                                if (!string.IsNullOrEmpty(condition))
                                {
                                    if (item.Fields["condition"] != null)
                                    {
                                        if (condition != item.Fields["condition"].Value)
                                        {
                                            continue;
                                        }
                                    }
                                }
                                // Add end

 

                                list.Add(item);

                                if (!flag)

                                {

                                    WorkflowCommand[] array2 = WorkflowFilterer.FilterVisibleCommands(workflow.GetCommands(item), item);

                                    for (int j = 0; j < array2.Length; j++)

                                    {

                                        WorkflowCommand workflowCommand = array2[j];

                                        if (!list2.Contains(workflowCommand.CommandID))

                                        {

                                            list2.Add(workflowCommand.CommandID);

                                        }

                                    }

                                }

                            }

                        }

                    }

                    WorkboxForm.StateItems expr_164 = new WorkboxForm.StateItems();

                    expr_164.Items = list;

                    expr_164.CommandIds = list2;

                    return expr_164;

                }

            }

        }

 

2.4 Sitecoreがインストールされているディレクトリに移動し、「Website\sitecore\shell\Applications\Workbox\Workbox.xml」の以下の部分を上記のクラスに書き換えます。

   (例)

    変更前:<CodeBeside Type="Sitecore.Shell.Applications.Workbox.WorkboxForm,Sitecore.Client"/>

    変更後:<CodeBeside Type="Foundation.Custom.CustomWorkflow.CustomWorkboxForm,Foundation.Custom"/>

 

 

3 動作確認

3.1 コンテンツの検索条件フィールドに値を設定します。


3.2 検索条件を指定せずにワークボックスを開くと下書き状態のアイテムが全て表示されています。


3.3 検索条件を入力し、検索ボタンを押下すると、該当のアイテムのみが表示されます。


以上になります。
他にも、有用なカスタマイズがありましたら随時ご紹介していきたいと思います。
それでは、ありがとうございました。