Search code examples
c#asp.netsitecoresitecore7

Set a field in all the children of an item


I have an Item in sitecore lets say "AddressItem" that has some children. I want to edit a Field "IsMain" in all the child items.

I am using Foreach loop. Is there some better way to achieve this.

foreach (Sitecore.Data.Items.Item child in AddressItem.Children)
{
    using (new SecurityDisabler())
    {
        child.Editing.BeginEdit();
        child.Fields["IsMain"].Value = "0";
        child.Editing.EndEdit();
    }
}

Solution

  • Its probably faster to set the IsMain fields standard value to 0 then reset all items to that standard value. There is no function for that out of the box but the below code will do it.

    This function is a little more robust then your requirement but its the code I have as is.

    First you need a user with the correct permissions to replace: ElevatedUserAccount

    Next get the list of items you would like to reset the values for then create a list of fields you wish to reset. In your case AddressItem.Children and IsMain.

    Finally pass them into the below methods.

    public void ResetFields(List<Item> items, List<string> fields)
    {
        if (items.Any() && fields.Any())
        {
            foreach (Item item in items)
            {
               ResetFieldsOnItem(item, fields);
            }
        }
    }
    
    public void ResetFieldsOnItem(Item item, List<string> fields)
    {
        if (item != null && fields.Any())
        {
            using (new Sitecore.Security.Accounts.UserSwitcher(ElevatedUserAccount, true))
            {
                item.Editing.BeginEdit();
    
                foreach (string field in fields)
                {
                    item.Fields[field].Reset();
                }
    
                item.Editing.EndEdit();
            }
        }
    }