Retrieve child items
When working with hierarchical content types, you will need to get child content items for a specific parent. The following procedure describes how to achieve this using the dynamic module manager.
For more information about the sample code snippets used in the article, see Example: Retrieve and create child items.
Check whether an item has children
Before getting children of an item, we recommend to check if the item has any children. You do this in the following way:
using System;
using Telerik.Sitefinity.DynamicModules;
using Telerik.Sitefinity.DynamicModules.Model;
namespace SitefinityWebApp
{
public class DynamicModules_CheckIfItemHasChildren
{
public bool CheckIfItemHasChildren(Guid itemId, Type itemType)
{
DynamicModuleManager dynamicModuleManager = DynamicModuleManager.GetManager();
DynamicContent item = dynamicModuleManager.GetDataItem(itemType, itemId);
bool hasChildren = dynamicModuleManager.HasChildItems(item);
return hasChildren;
}
}
}
Retrieve child items
To retrieve the child items of a parent item, you must get a collection of all child items that are one level under a parent, in the following way:
using System;
using Telerik.Sitefinity.DynamicModules;
using Telerik.Sitefinity.DynamicModules.Model;
using Telerik.Sitefinity.Model;
namespace SitefinityWebApp
{
public class DynamicModules_RetrieveChildItems
{
public void RetrieveChildItems(DynamicContent item, Type childItemType)
{
DynamicModuleManager dynamicModuleManager = DynamicModuleManager.GetManager();
var childItems = dynamicModuleManager.GetChildItems(item, childItemType);
foreach (var childItem in childItems)
{
// Some custom logic goes here.
var title = childItem.GetValue<string>("Title");
}
}
}
}
Hierarchical content types are working with a Sitefinity CMS workflow. If you have not defined any workflow, Sitefinity CMS uses the default one. The items are represented in two versions – Masterand Live. When you create a new content item, Sitefinity CMS first creates the master version. After you publish the item, Sitefinity CMS creates the live version, which is a copy of the master one. Only the live versions of items are visible on the frontend. When you want to modify an item, you change the master version. When you publish the changes, a new live version is created and displayed on the frontend.
Because of this the hierarchy is persisted only by the master items. When you perform operations such as getting all of the children of an item or setting a parent, you use the master versions. Use the following examples to work with different versions of content items:
- To retrieve an item’s live version by having its child master version, use the following code:
C#
using System; using System.Linq; using Telerik.Sitefinity.DynamicModules; using Telerik.Sitefinity.DynamicModules.Model; namespace SitefinityWebApp.Samples { public class DynamicModules_GetParentLiveVersion { public DynamicContent GetLiveVersion(DynamicContent childMasterVersion, Type parentItemType) { // Retrieving the parent DynamicContent item using the child item. DynamicModuleManager dynamicModuleManager = DynamicModuleManager.GetManager(); DynamicContent parentMasterVersion = childMasterVersion.SystemParentItem; DynamicContent parentLiveVersion = dynamicModuleManager.GetDataItems(parentItemType) .Where(i => i.OriginalContentId == parentMasterVersion.Id && i.Visible == true).SingleOrDefault(); return parentLiveVersion; } } } - To retrieve child item’s live versions by having their parent, use the following code:
C#
using System; using System.Linq; using Telerik.Sitefinity.DynamicModules; using Telerik.Sitefinity.DynamicModules.Model; using Telerik.Sitefinity.GenericContent.Model; namespace SitefinityWebApp.Samples { public class DynamicModules_GetChildLiveVersion { public IQueryable<DynamicContent> GetLiveVersion(DynamicContent masterParentItem, Type childItemType) { DynamicModuleManager dynamicModuleManager = DynamicModuleManager.GetManager(); // Gets a collection with all of the master child items. var masterChildItems = dynamicModuleManager.GetChildItems(masterParentItem, childItemType); // Filters through all of the items to get the live ones that are representation of the master items. // The Visible property is used to filter only the items that are visible in the frontend because some might be live versions but unpublished in the backend var liveChildItems = masterChildItems.Where(i => i.Status == ContentLifecycleStatus.Live && i.Visible); return liveChildItems; } } }