Redaktoři často vytváří nové itemy pomocí duplikace itemy stávající, neboť chtějí zachovat obsah některých polí itemy. Duplikace itemy způsobuje duplikaci všech verzí itemy a to pro všechny jazykové mutace. Jde o vytvoření kopie 1:1. V nejlepší případě redaktoři zpětně promažou u nově vzniklé itemy všechny nepotřebné verze. Toto není moc uživatelsky komfortní řešení.

Z tohoto důvodu jsem vytvořil dva nové příkazy, které provedou duplikaci itemy, ale jen posledních verzí itemy a to buď ve všech jazykových verzích (příkaz „Duplicate All Language Versions“) anebo jen pro jazykovou verzi, ve které se redaktor právě nachází (příkaz „Duplicate Current Language Version“).

Nyní popíši kroky, které je třeba provést.

V databázi „Core“ rozšířit kontextové menu a ribbon o nové dva příkazy:

  1. Spustit „Desktop“ a přepnout se do databáze „Core“ pomocí ikonky v pravém dolním rohu.
  2. Přes „Start“ ikonku spustit „Content Editor“.
  3. Přejít na itemu „/sitecore/content/Applications/Content Editor/Menues/Duplicate“ a zde založit dvě nové itemy ze šablony „/sitecore/templates/System/Menus/Menu item“.
    1. Duplicate All Language Versions – displayName = „Duplicate All Language Versions“, message = „custom:duplicateallversions“
    2. Duplicate Current Language Version – displayName = „Duplicate Current Language Version“, message = „custom:duplicatecurrentversion“
  4. Stejným způsobem založte dvě itemy pro kontextové menu „/sitecore/content/Applications/Content Editor/Context Menues/Default“.

Nyní je třeba vytvořit třídy, které příkazy vykonají.

using System.Collections.Specialized;
using Sitecore;
using Sitecore.Shell.Framework.Commands;
namespace MyNamespace
{
   public class DuplicateItemAllLanguages : Duplicate
   {
      public override void Execute(CommandContext context)
      {
         if (context.Items.Length != 1 || context.Items[0] == null) return;
         var item = context.Items[0];
         var parameters = new NameValueCollection();
         parameters.Add("database", item.Database.Name);
         parameters.Add("id", item.ID.ToString());
         parameters.Add("language", item.Language.ToString());
         parameters.Add("version", item.Version.ToString());
         parameters.Add("latestversiontype", "all");
         Context.ClientPage.Start("uiDuplicateItem", parameters);
      }
   }
}

a druhá třída

using System.Collections.Specialized;
using Sitecore;
using Sitecore.Shell.Framework.Commands;
namespace MyNamespace
{
   public class DuplicateItemCurrentLanguage: Duplicate
   {
      public override void Execute(CommandContext context)
      {
         if (context.Items.Length != 1 || context.Items[0] == null) return;
         var item = context.Items[0];
         var parameters = new NameValueCollection();
         parameters.Add("database", item.Database.Name);
         parameters.Add("id", item.ID.ToString());
         parameters.Add("language", item.Language.ToString());
         parameters.Add("version", item.Version.ToString());
         parameters.Add("latestversiontype", "current");
         Context.ClientPage.Start("uiDuplicateItem", parameters);
      }
   }
}

Přidání nových příkazů do souboru „\Website\App_Config\Commands.config“ do sekce „Commands“:

<commands>
   ...
   <command name="cutsom:duplicateallversions" type="MyNamespace.DuplicateItemAllLanguages, MyAssembly" />
   <command name="custom:duplicatecurrentversion" type="MyNamespace.DuplicateItemCurrentLanguage, MyAssembly" />
</commands>

Nyní je třeba přetížit procesor, který provádí duplikování item. Vytvoříme si tedy novou třídu procesoru, do které zkopírujeme metodu „Execute“ ze třídy „Sitecore.Shell.Framework.Pipelines.DuplicateItem“

namespace MyNamespace
{
   public class UIDuplicateItem
   {
       public void Execute(ClientPipelineArgs args)
      {
         ...
         /* Original: Context.Workflow.DuplicateItem(obj, args.Parameters["name"]); */
         Item ims = Context.Workflow.DuplicateItem(item, args.Parameters["name"]);
         if (args.Parameters["latestversiontype"] != null)
         {
           var latestOnlyInCurrent = args.Parameters["latestversiontype"].Equals("current", StringComparison.InvariantCultureIgnoreCase);
           var versions = ims.Versions.GetVersions(true);
           var currentLanguageName = args.Parameters["language"];
           foreach (var version in versions)
           {
              if (! version.Versions.IsLatestVersion() || (latestOnlyInCurrent && ! version.Language.Name.Equals(currentLanguageName, StringComparison.InvariantCultureIgnoreCase)))
              {
                 version.Versions.RemoveVersion();
              }
           }
        }
      }
   }
}

Procesor zaregistrujeme v souboru „Web.config“ v sekci Processors:

      <uiDuplicateItem>
        <processor mode="on" type="Sitecore.Shell.Framework.Pipelines.DuplicateItem,Sitecore.Kernel" method="CheckPermissions" />
        <processor mode="on" type="Sitecore.Shell.Framework.Pipelines.DuplicateItem,Sitecore.Kernel" method="GetName" />
        <!-- <processor mode="on" type="Sitecore.Shell.Framework.Pipelines.DuplicateItem,Sitecore.Kernel" method="Execute" /> -->
        <processor mode="on" type="MyNamespace.DuplicateItem, MyAssembly" method="Execute" />
      </uiDuplicateItem>

Pokud používáme Buckety, pak je třeba metodu „Execute“ zkopírovat z třídy „Sitecore.Buckets.Pipelines.UI.ItemDuplicate“ v knihovně „Sitecore.Buckets.dll“ a vypnout příslušný procesor dodaný konfigurací bucketů.