[Sitecore][Publishing]パブリッシュターゲットを指定 2

これは前回に話の続きになりますが、確かに.新しいアイテムが投稿してから、“Approve QA”にて、QAのみへのパブリッシュすることができたものの、ワークボックスにてどのアイテムがすでQAへパブリッシュしたのかという状態を見ることができなかった。またアイテムパブリッシュウィザードにて、LIVEがチェックした場合はアイテムがパブリッシュしてしまうのはよくない。
20140312_01

以前Alex Shybaさんがこれに関して書いた記事があったので、それをもとに更新をしてみました。

要するに、クラスSitecore.Workflows.Simple.Workflow がすべてのパブリッシュをするさいにメソッドIsApprovedが呼ばれます。それは最終状態であるかどうかを確認しているわけ。これを使って、QAとしてチェックされた場合はQAへのみパブリッシュするわけです

さて、更新して見ましょう。

1. 下記のコードを追加 PublishActionHelper.cs

using System;
using System.Collections.Generic;
using Sitecore;
using Sitecore.Configuration;
using Sitecore.Data;
using Sitecore.Data.Fields;
using Sitecore.Data.Items;

namespace local.sandbox.com.Website.Sitecore_Extensions.WorkFlow
{
    public class PublishActionHelper
    {
        public static Database Db
        {
            get { return Context.ContentDatabase jQuery15207326018577441573_1394509328988 Context.Database jQuery15206563363645691425_1394509721497 Factory.GetDatabase("master"); }
        }
        public static string GetFieldValue(Item item, string fieldName)
        {
            return item[fieldName] jQuery1520426644672639668_1394509796305 String.Empty;
        }
        public static Item GetItemById(string id)
        {
            if (ID.IsID(id))
            {
                return Db.GetItem(ID.Parse(id));
            }
            return null;
        }
        public static string GetTargetDatabaseName(string targetId)
        {
            var publishingTarget = Db.SelectSingleItem(targetId);
            return publishingTarget["Target database"] jQuery15205424792692065239_1394509922961 String.Empty;
        }
        public static IEnumerable<Item> GetItemsFromMultilist(Item carrier, string fieldName)
        {
            var multilistField = carrier.Fields[fieldName];
            if (FieldTypeManager.GetField(multilistField) is MultilistField)
            {
                return ((MultilistField)multilistField).GetItems();
            }
            return new Item[0];
        }
    }
}

2. 下記のコードを追加 AdvancedWorkflow.cs

using Sitecore;
using Sitecore.Data;
using Sitecore.Data.Items;
using Sitecore.Diagnostics;
using Sitecore.Workflows;

namespace local.sandbox.com.Website.Sitecore_Extensions.WorkFlow
{
   public class WorkflowProvider : Sitecore.Workflows.Simple.WorkflowProvider
   {
      public WorkflowProvider(string databaseName, HistoryStore historyStore)
         : base(databaseName, historyStore)
      {
      }
      public override IWorkflow GetWorkflow(Item item)
      {
         Assert.ArgumentNotNull(item, "item");
         string workflowId = GetWorkflowId(item);
         if (workflowId.Length > 0)
         {
            // customization
            return new AdvancedWorkflow(workflowId, this);
            // customization
         }
         return null;
      }
      private static string GetWorkflowId(Item item)
      {
         Assert.ArgumentNotNull(item, "item");
         WorkflowInfo workflowInfo = item.Database.DataManager.GetWorkflowInfo(item);
         if (workflowInfo != null)
         {
            return workflowInfo.WorkflowID;
         }
         return string.Empty;
      }
      public override IWorkflow GetWorkflow(string workflowId)
      {
         Assert.ArgumentNotNullOrEmpty(workflowId, "workflowID");
         Error.Assert(ID.IsID(workflowId), "The parameter 'workflowID' must be parseable to an ID");
         if (Database.Items[ID.Parse(workflowId)] != null)
         {
            // customization
            return new AdvancedWorkflow(workflowId, this);
            // customization
         }
         return null;
      }
      public override IWorkflow[] GetWorkflows()
      {
         Item item = this.Database.Items[ItemIDs.WorkflowRoot];
         if (item == null)
         {
            return new IWorkflow[0];
         }
         Item[] itemArray = item.Children.ToArray();
         IWorkflow[] workflowArray = new IWorkflow[itemArray.Length];
         for (int i = 0; i < itemArray.Length; i++)
         {
            // customization
            var wfId = itemArray[i].ID.ToString();
            workflowArray[i] = new AdvancedWorkflow(wfId, this);
            // customization
         }
         return workflowArray;
      }
   }
}

3. 下記のコードを追加 WorkflowProvider.cs

using System;
using Sitecore;
using Sitecore.Data;
using Sitecore.Data.Items;
using Sitecore.Data.Managers;
using Sitecore.Diagnostics;
using Sitecore.Globalization;
using Sitecore.SecurityModel;
using Sitecore.Workflows;
using Version = Sitecore.Data.Version;
namespace local.sandbox.com.Website.Sitecore_Extensions.WorkFlow
{
    public class AdvancedWorkflow : Sitecore.Workflows.Simple.Workflow
    {
        private readonly WorkflowProvider _owner;
        public AdvancedWorkflow(string workflowID, WorkflowProvider owner) : base(workflowID, owner)
        {
            _owner = owner;
        }
        private Database Database
        {
            get
            {
                return _owner.Database;
            }
        }

        //"Final" かどうかを確認します。
        public override bool IsApproved(Item item)
        {
            var result = base.IsApproved(item);
            if (!result && Context.Site.Name.Equals("publisher", StringComparison.InvariantCultureIgnoreCase))
            {
                var stateItem = GetStateItem(item);
                if (stateItem != null && MatchTargetDatabase(stateItem) && IgnoreWorkflow(stateItem))
                {
                    result = true;
                }
            }
            return result;
        }

        protected virtual bool MatchTargetDatabase(Item stateItem)
        {
            if (Context.Job != null && !String.IsNullOrEmpty(Context.Job.Name))
            {
                var target = TargetDatabase(stateItem);
                return Context.Job.Name.Equals(
                         String.Format("Publish to '{0}'", target), StringComparison.InvariantCultureIgnoreCase);
            }
            return false;
        }
        protected virtual string TargetDatabase(Item stateItem)
        {
            var publishTargetId = stateItem["Target DB"];
            var publishTargetItem = PublishActionHelper.GetItemById(publishTargetId);
            if (publishTargetItem != null)
            {
                return PublishActionHelper.GetFieldValue(publishTargetItem, "Target database");
            }
            return String.Empty;
        }
        protected virtual bool IgnoreWorkflow(Item stateItem)
        {
            return stateItem["QA"] == "1";
        }
        private Item GetStateItem(Item item)
        {
            string stateID = GetStateID(item);
            if (stateID.Length > 0)
            {
                return GetStateItem(stateID);
            }
            return null;
        }
        private Item GetStateItem(ID stateId)
        {
            return ItemManager.GetItem(stateId, Language.Current, Version.Latest, Database, SecurityCheck.Disable);
        }
        private Item GetStateItem(string stateId)
        {
            ID id = MainUtil.GetID(stateId, null);
            return id == (ID)null ? null : this.GetStateItem(id);
        }
        private string GetStateID(Item item)
        {
            Assert.ArgumentNotNull(item, "item");
            WorkflowInfo workflowInfo = item.Database.DataManager.GetWorkflowInfo(item);
            if (workflowInfo != null)
            {
                return workflowInfo.StateID;
            }
            return string.Empty;
        }
    }
}

4. ワークフローを切り替える

<!--<workflowProvider hint="defer" type="Sitecore.Workflows.Simple.WorkflowProvider, Sitecore.Kernel">-->
<workflowProvider hint="defer" type="local.sandbox.com.Website.Sitecore_Extensions.WorkFlow.WorkflowProvider, local.sandbox.com.Website">

5. sitecore/templates/System/Workflow/Stateにて、フィールドを追加,動作確認として、新しいアイテムを追加するなり、既存のアイテムで新しいバージョンを作成して、承認待ち、QAのみ承認をして、更新がQAのみパブリッシュされたことを確認。

    また、コンテンツエディターから、アイテムを選択し、アイテムパブリッシュウィザードにてパブリッシュも確認しましょう。QAのみですので、ファイナルのチェックがされていないので、ここでLIVEをチェックしても、アイテムがQAのみパブリッシュされていることを確認。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です