En Tridion 2011 quiero usar el servicio central equivalente de UpdateXml para crear nuevos objetos Tridion de forma genérica. Tengo la intención de crear nuevos Componentes, Páginas y más tarde en Carpetas y Grupos de Estructura. Funciona bastante bien con UpdateXml, pero tengo un problema al convertir el RepositoryLocalObject
(u otro objeto de tipo genérico) a un objeto ComponentData
con el servicio principal. Mi código de Core Service es mucho más largo (y crece por segundo).Crear un elemento en Tridion 2011 utilizando Core Service
error cuando intento acceder on-tipo de objeto propiedad específica:
Error 9 'Tridion.ContentManager.CoreService.Client.RepositoryLocalObjectData' no contiene una definición de 'contenido' y ningún método de extensión 'contenido' aceptar un primer argumento de tipo 'Tridion.ContentManager.CoreService.Client.RepositoryLocalObjectData'
¿una posible solución es crear un método de extensión?
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
* código actualizado gracias al excelente respuesta continuación
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;
}
* Código Original
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;
}
}
Intenté eso originalmente, pero no entendí cómo pasar de la cadena .Name a una propiedad Tridion ItemType. – robrtc
Excelente sugerencia para usar copiar y gracias por el método reescrito GetTridionItemType. Un último problema: ¿cómo establecemos la propiedad del nombre de archivo para una copia de una página? No quiero dejarlo configurado como 'Copy_of_pagename'. – robrtc
Código actualizado anteriormente con la condición if para manejar el nombre de archivo de la página. ¿Pero hay una manera mejor? – robrtc