In Tridion 2011, I want to use the equivalent of Core Service UpdateXml to create new Tridion objects in a general way. I intend to create new Components, Pages, and then Folders and Structural Groups. It works quite well with UpdateXml, but I had a problem with the fact that RepositoryLocalObject
(or another object of type of a general type) was bound to the ComponentData
object using Core Service. My main service code is much longer (and growing on the second).
Error message when trying to access a specific property of an object type:
Error 9 'Tridion.ContentManager.CoreService.Client.RepositoryLocalObjectData' does not contain a definition for 'Content' and there is no extension method 'Content' that takes the first argument of the type 'Tridion.ContentManager.CoreService.Client.RepositoryLocalObjectData'
Could a possible solution create an extension method?
Tridion TOM API:
Function CreateNewItemCopy(organizationalItemUri, itemType, title, xml, directory, filename) Dim newItem : set newItem = tdse.GetNewObject(itemType, organizationalItemUri) newItem.UpdateXml(xml) newItem.Title = title if(itemType = 64) then ' page newItem.FileName = filename elseif(itemType = 4) then ' sg newItem.Directory = directory end if newItem.save(true) CreateNewItemCopy = newItem.id set newItem = nothing End Function
Tridion 2011 Core Service
* Updated code based on excellent answer below
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; } private string CreateNewItemCopy(string title, RepositoryLocalObjectData source, string filename) { ItemType tridionItemType = GetTridionItemType(source); string orgItemUri = source.LocationInfo.OrganizationalItem.IdRef; var newItem = client.Copy(source.Id, orgItemUri, true, new ReadOptions()); newItem.Title = title; if (tridionItemType == ItemType.Page) { PageData pageData = newItem as PageData; pageData.FileName = filename; client.Update(pageData, new ReadOptions()); } else { client.Update(newItem, new ReadOptions()); } return newItem.Id; }
* Original code
private string CreateNewItemCopy(string title, RepositoryLocalObjectData source, string filename) { string newItemUri = ""; try { ItemType tridionItemType = GetTridionItemType(source.Id); 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; client.Create(newComponent, null); newItemUri = newComponent.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; client.Create(newPage, null); newItemUri = newPage.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; client.Create(newGenericTridionItem, null); newItemUri = newGenericTridionItem.Id; } } catch (Exception ex) { throw; } return newItemUri; } private ItemType GetTridionItemType(string uri) { const int itemTypeComp = 16; const int itemTypePage = 64; const int itemTypeSG = 4; const int itemTypeFolder = 2; int itemTypeInt = GetTridionItemTypeId(uri); switch (itemTypeInt) { case itemTypeComp: return ItemType.Component; break; case itemTypePage: return ItemType.Page; break; case itemTypeSG: return ItemType.StructureGroup; break; case itemTypeFolder: return ItemType.Folder; break; } return ItemType.UnknownByClient; } private int GetTridionItemTypeId(string uri) { const int itemTypeComp = 16; string[] uriParts = uri.Split('-'); if (uriParts.Length == 2) // comp, tcm:9-1234 { return itemTypeComp; } else // other, tcm:9-456-64 for a page... { int itemTypeId = Int32.Parse(uriParts[2]); return itemTypeId; } }