Create an item in Tridion 2011 using Core Service
tridion
Solution
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?
Problem
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 Folders and Structure Groups. It works quite well using UpdateXml but I am having a problem with casting the `RepositoryLocalObject` (or another generic-type object) to a `ComponentData` object with the Core Service. My Core Service code is much longer (and growing by the second). Error message when I try to access on object-type specific property: Error 9 'Tridion.ContentManager.CoreService.Client.RepositoryLocalObjectData' does not contain a definition for 'Content' and no extension method 'Content' accepting a first argument of type 'Tridion.ContentManager.CoreService.Client.RepositoryLocalObjectData' Would a possible solution be to 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; } } ```