2012-03-07 7 views
6

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

mensaje

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; 
    } 
} 

Respuesta

6

me han ajustado ligeramente su código y ahora se está trabajando:

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; 
    } 

Pero sigo sin entender por qué quiere hacerlo de esta manera y no utilizar el método de copia simple?

+0

Intenté eso originalmente, pero no entendí cómo pasar de la cadena .Name a una propiedad Tridion ItemType. – robrtc

+0

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

+0

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

Cuestiones relacionadas