Create an item in Tridion 2011 using Core Service

前端 未结 1 1886
无人共我
无人共我 2020-12-19 09:10

In Tridion 2011 I want to use the Core Service equivalent of UpdateXml to create new Tridion objects in a generic way. I intend to create new Components, Pages and later on

相关标签:
1条回答
  • 2020-12-19 09:41

    I have slightly adjusted your code and now it's working:

        private string CreateNewItemCopy(string title, RepositoryLocalObjectData source, string filename)
        {
            string newItemUri = "";
            try
            {
                ItemType tridionItemType = GetTridionItemType(source);
                string orgItemUri = source.LocationInfo.OrganizationalItem.IdRef;
    
                if (tridionItemType == ItemType.Component)
                {
                    ComponentData sourceComp = source as ComponentData;
                    ComponentData newComponent = client.GetDefaultData(tridionItemType, orgItemUri) as ComponentData;
                    newComponent.Title = title;
                    newComponent.Metadata = source.Metadata;
    
                    // ** Only Component has .Content and SchemaRef
                    newComponent.Content = sourceComp.Content;
                    newComponent.Schema.IdRef = sourceComp.Schema.IdRef;
                    newItemUri = client.Create(newComponent, new ReadOptions()).Id;
                }
                else if (tridionItemType == ItemType.Page)
                {
                    PageData sourcePage = source as PageData;
                    PageData newPage = client.GetDefaultData(tridionItemType, orgItemUri) as PageData;
                    newPage.Title = title;
                    newPage.Metadata = source.Metadata;
    
                    // ** Only Page has .Filename
                    newPage.FileName = filename;
                    newItemUri = client.Create(newPage, new ReadOptions()).Id;
                }
                else //I would really like to handle all things here - but have problems with item-specific mandatory properties, such as Schema, Filename, and Dir
                {
                    var newGenericTridionItem = client.GetDefaultData(tridionItemType, orgItemUri) as RepositoryLocalObjectData;
                    newGenericTridionItem.Title = title;
                    newGenericTridionItem.Metadata = source.Metadata;
                    //if(GetTridionItemType(newGenericTridionItem.Id) == ItemType.Page)
                    //    newGenericTridionItem.filename;
                    newItemUri = client.Create(newGenericTridionItem, new ReadOptions()).Id;
                }
            }
            catch (Exception ex)
            {
                throw;
            }
    
            return newItemUri;
        }
    
        private ItemType GetTridionItemType(RepositoryLocalObjectData source)
        {
            string itemType = source.GetType().Name;
            switch (itemType)
            {
                case "ComponentData":
                    return ItemType.Component;
                case "PageData":
                    return ItemType.Page;
            }
            return ItemType.UnknownByClient;
        }
    

    But I still don't understand why do you want to do it this way and not use simple Copy method?

    0 讨论(0)
提交回复
热议问题