クローンアイテムにワークフローが設定されている場合、ソースアイテムの数値バージョン追加を受け入れようとすると最初にロックを取得し、その後に変更を受け入れる必要があるため、ロックを取得時にソースアイテムの数値バージョンと紐づいていない数値バージョンを1つ作成して、さらに変更を受け入れるとソースアイテムの数値バージョンと紐づいた新しい数値バージョンを作成するという流れになります。

例えば、ワークフローが設定されているクローンアイテムの場合、ソースアイテムで新しい数値バージョンを作成すると、コンテンツエディターでクローンアイテムを表示すると"オリジナルアイテムに新しいバージョンが作成されました。"というコンテンツエディターの警告がコンテンツタブの上部に表示されます。

新しい数値バージョンに対応したクローンアイテムの数値バージョンを作成するには、数値バージョンが最終状態でロックが取得されていない状態の場合最初にロックを取得する必要があります。このとき、クローンアイテムがワークフローに紐づいているため、ソースアイテムの数値バージョンとは無関係な数値バージョンがクローンアイテムに作成されます。下図では数値バージョン2が表示されました。ロックを取得して始めて "新しいバージョンに更新します" という新しい数値バージョンと紐づくクローンアイテムの数値バージョンを作成するリンクが選択できるようになります。

ここで、 ”新しいバージョンに更新します"を選択すると さらに新しい数値バージョンが作成されます。この新しく作成された数値バージョンがソースアイテムの数値バージョンと紐づくようになります。実際下図では数値バージョン3のアイテムが作成されます。結果的に 2つの数値バージョンを作成することになります。

今回は ロックを取得せず(ソースタイムの数値バージョンと関連しない 新しい数値バージョンを作成せず)にソースアイテムの数値バージョンを作成するカスタムプログラムを実装してみます。

検証環境は次の通りです

  • Sitecore CMS 7.1 Update1

Visual Studio を起動して次のようなプログラムを作成します。Sitecore Rocks をVisual Studio にインストールしている場合は コンテンツエディター警告(名前が違うかもしれません) のパイプラインのテンプレートからファイルを作成することもできます。下記サンプルソースでは コンテンツエディターで表示しているアイテムがクローンアイテムでかつ数値バージョン追加の通知があり、かつ表示してるアイテムのロックを取得できる状態の場合にソースアイテムの数値バージョンの更新に紐づく数値バージョンを新しく作成するか、無視するかのコンテンツエディター警告を表示するようにしています。

using Sitecore;
using Sitecore.Data.Clones;
using Sitecore.Data.Items;
using Sitecore.Globalization;
using Sitecore.Pipelines.GetContentEditorWarnings;
using System.Linq;

namespace v72u1.Web.Fx.Pipelines
{

    public class AcceptWithoutCheckout
    {
        public void Process([NotNull] GetContentEditorWarningsArgs args)
        {
            Item item = args.Item;

            if (item.IsClone && item.State.GetWorkflow() != null)
            {
                System.Collections.Generic.List<Notification> list = new System.Collections.Generic.List<Notification>(item.Database.NotificationProvider.GetNotifications(item));

                var versionAdded = list.OfType<VersionAddedNotification>().Where(x => x.GetType().FullName == typeof(VersionAddedNotification).FullName).ToList();
                if (versionAdded.Count > 0)
                {
                    var notification = versionAdded[0];

                    if (CanCheckoutAndAccept(item))
                    {
                        var warning = args.Add();

                        warning.Title = "Source Item version is created!!";
                        warning.Text = "Click option if you want to update or reject new version without checking out item.";
                        warning.AddOption(Translate.Text("Update to new version."), "notification:accept(notification=" + notification.ID + ")");
                        warning.AddOption(Translate.Text("Do not update to the new version."), "notification:reject(notification=" + notification.ID + ")");
                    }
                }

            }
        }

        protected virtual bool CanCheckoutAndAccept(Item item)
        {
            if (item == null) return false;

            if (Context.IsAdministrator) return false;

            if (item.Access.CanWrite() && item.Access.CanWriteLanguage() && !item.Locking.IsLocked())
            {
                return true;
            }
            return false;
        }

    }
}

作成した コンテンツエディター警告のパイプラインプロセッサをWeb.configにマージするように AcceptWithoutCheckout.config を App_Config/Include フォルダ配下に作成して例えば次のようなパッチを設定します。

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore>
    <pipelines>
      <getContentEditorWarnings>
        <processor type="v72u1.Web.Fx.Pipelines.AcceptWithoutCheckout,v72u1.Web" patch:before="processor[@type='Sitecore.Pipelines.GetContentEditorWarnings.RunRules, Sitecore.Kernel']" />
      </getContentEditorWarnings>
    </pipelines>
  </sitecore>
</configuration>

プロジェクトをビルドして配置してください。

カスタムのパイプラインプロセッサーを適用すると、ソースアイテムに新しい数値バージョンが作成された段階で、最終状態になっているクローンアイテムを表示すると下図のようなコンテンツエディターの警告メッセージが表示されるようになります。ここで ロックを取得せずに "新しいバージョンに更新します" か "新バージョンに更新しない" が選択できるようになっています。

新しいバージョンに更新しますを選択すると下図のようにロックを取得せずにソースアイテムの数値バージョンと紐づく新しい数値バージョンを作成することができます。

簡単ですが説明は以上になります。しっかりテストしていないのであらゆるケースに対応できている保証はありませんが、コンテンツエディター警告のサンプルとして作成してみました。