如何在sitecore中创建具有不同模板的项集

时间:2014-01-09 10:28:54

标签: sitecore

我在clarisonic目录下有一组项目。我想在另一个地方创建相同的项目集。例如。我想在亚马逊下使用不同的模板创建相同的项目集。

首先,我在clarisonic目录下获取所有子项目并获取这些项目的名称。我正在亚马逊下创建新项目,其中包含我之前使用不同模板获得的名称。enter image description here

我想在亚马逊下创建相同的项目[clarisonic目录下的所有项目]。

public void EntryPath(Item item)
        {
            List<string> ObjSiteNames = getMultiListValues(item, "Select Site");
            GetChildrenSelectedItem(item, ObjSiteNames);
            RecursiveItemCreation(item);
        }


        public List<string> getMultiListValues(Sitecore.Data.Items.Item item, string FieldID)
        {

            Sitecore.Data.Fields.MultilistField multiselect = item.Fields[FieldID];
            return multiselect.GetItems().Select(a => a.Name).ToList();
        }

        public void GetChildrenSelectedItem(Item getChildredItem, List<string> sitesnmaes)
        {
            string defaultSitePath = "/sitecore/content/Administration/Sites";

             masterDb = Sitecore.Configuration.Factory.GetDatabase("master");
            templateItem = masterDb.GetItem("/sitecore/templates/User Defined/SC-DW Data/Generic/Widgets/NavigationItem");
            foreach (string str in sitesnmaes)
            {
                StringBuilder strBuilder = new StringBuilder();
                strBuilder.Append(defaultSitePath).Append("/").Append(str);
                itemDesPath = masterDb.GetItem(strBuilder.ToString());
            }
        }

        public void RecursiveItemCreation(Item Getchilds)
        {
            foreach (Item i in Getchilds.GetChildren())
            {
                i.Template = masterDb.GetItem("/sitecore/templates/User Defined/SC-DW Data/Generic/Widgets/NavigationItem").
                if ((i.HasChildren))
                {

                }
                else
                {
                    itemDesPath.Add(i.Name, templateItem);
                    foreach (Item ItemDes in itemDesPath.Axes.GetDescendants())
                    {
                        if (ItemDes.Name == i.Name)
                        {
                            ItemDes.Editing.BeginEdit();
                            ItemDes.Fields["Datasource"].Value = i.Paths.Path;
                            ItemDes.Editing.EndEdit();
                        }
                    }
                }
            }

1 个答案:

答案 0 :(得分:1)

根据我的理解,您希望将Clarisonic Catalog项下面的整个树复制到Amazon节点。唯一的区别是创建的项目应使用不同的模板(/sitecore/templates/User Defined/SC-DW Data/Generic/Widgets/NavigationItem)。

下面的代码应该完成这项工作。我还没有对它进行过测试,但我确信你可以解决你遇到的所有问题。

public void CopyTreeStructure(Item source, Item target)
{
    // find the new template you want to use
    TemplateItem newTemplate = new TemplateItem(source.Database.GetItem("/sitecore/templates/User Defined/SC-DW Data/Generic/Widgets/NavigationItem"));

    foreach (Item child in source.Children)
    {
        // create the copy of original item using new template
        Item copiedItem = CreateItemUsingNewTemplate(child, target, newTemplate);
        // repeat for all descendants recursively
        CopyTreeStructure(child, copiedItem);
    }
}

private Item CreateItemUsingNewTemplate(Item source, Item targetParent, TemplateItem templateToUse)
{
    // create item
    Item copiedItem = targetParent.Add(source.Name, templateToUse);

    // pre-read all fields
    source.Fields.ReadAll();

    using (new EditContext(copiedItem))
    {
        // update all the fields of new item
        foreach (Field field in source.Fields)
        {
            copiedItem[field.Name] = source[field.Value];
        }
    }

    // return copied item so we can copy it's descendants
    return copiedItem;
}