As you might know you can use Item Buckets in Sitecore 7 to execute operations on multiple items at the same time. Those operations are called Search Operations and Sitecore 7 ships with default ones like moving, copying and deleting items.

As a developer you can fairly easy create your own search operations. There are three things you need to do to create your own:

  1. Create a Sitecore items that represents the operation
  2. Configure a command to link the operation to the code
  3. Write the class which defines the logic

Let say we want to create a operation which protects multiple items to prevent editing their content.

We go to the Content Editor and navigate to the “/sitecore/system/Settings/Buckets/Settings/Search Operations” item. Underneath you will find four categories in which you can create the item. For this purpose we will create a item underneath “Information Architecture”.

Notice the value in the “Type” field. This is a command that needs to be mapped with the class and assembly that contains the logic. The mapping is handled by configuration files within the App_Config\Include folder. Create a new config file that contains the following xml

<configuration xmlns:patch=””>
<command name=”bucket:protectitems” type=”Sitecore.Buckets.Search.SearchOperations.ProtectCommand, Website”/>

As you can see we still need to create a class which contains the logic.

using Sitecore.Buckets.Util;
using Sitecore.ContentSearch;
using Sitecore.ContentSearch.SearchTypes;
using Sitecore.ContentSearch.Utilities;
using Sitecore.Data.Items;
using Sitecore.Diagnostics;
using Sitecore.Globalization;
using Sitecore.Shell.Applications.Dialogs.ProgressBoxes;
using Sitecore.Shell.Framework.Commands;
using Sitecore.Web.UI.Sheer;
using System.Collections.Generic;

namespace Sitecore.Buckets.Search.SearchOperations
public class ProtectCommand : Command
public override void Execute(CommandContext context)
string[] strings = context.Parameters.GetValues(“url”);
if (strings != null)
List list = UIFilterHelpers.ExtractSearchQuery(strings[0].Replace(“\””, string.Empty));
string jobName = Translate.Text(“Applying Protection”);
string title = Translate.Text(“Protecting All Items”);
string icon = “~/icon/Applications/32×32/document_lock.png”;
if (context.Items.Length > 0)
var parameters = new object[] {context.Items[0], list};
ProgressBox.Execute(jobName, title, icon, StartProcess, parameters);
SheerResponse.Alert(Translate.Text(“Finished Protecting all items”), new string[0]);

private void StartProcess(params object[] parameters)
var indexableItem = (Item) parameters[0];
SitecoreIndexableItem indexable = indexableItem;
if (indexable == null)
Log.Error(“Protect Items – Unable to cast current item – ” + parameters[0].GetType().FullName, this);
var searchStringModel = (List) parameters[1];
foreach (SearchStringModel model in searchStringModel)
if (model.Operation == null)
model.Operation = “should”;
using (IProviderSearchContext context = ContentSearchManager.GetIndex(indexable) .CreateSearchContext())
foreach (SitecoreUISearchResultItem resultItem in LinqHelper.CreateQuery(context, searchStringModel, indexable))
Item item = resultItem.GetItem();
if ((item != null) &amp;amp;&amp;amp; item.Security.CanDelete(Context.User))
item.Appearance.ReadOnly = !item.Appearance.ReadOnly;

Compile the code and go to your search window. After running a search you can go and click the Protect Items operation.

After clicking a dialog will appear that shows the progress:


Senior Technical Evangelist with the Technical Marketing team at Sitecore. Working closely with product development and product management to help customers, partners and the developers unlock the full potential of Sitecore.

Write A Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.