2012-03-07 13 views
6

W Tridion 2011 chcę używać Core Service odpowiednik UpdateXml do tworzenia nowych obiektów Tridion w ogólny sposób. Zamierzam utworzyć nowe komponenty, strony, a później foldery i grupy struktur. Działa całkiem dobrze przy użyciu UpdateXml, ale mam problem z rzutowaniem obiektu RepositoryLocalObject (lub innego obiektu typu standardowego) na obiekt ComponentData za pomocą usługi podstawowej. Mój kod podstawowej usługi jest znacznie dłuższy (i rośnie o sekundę).Utwórz element w Tridion 2011 za pomocą usługi Core Service

wiadomość

Błąd przy próbie dostępu do obiektu na własność konkretnego typu:

Error 9 „Tridion.ContentManager.CoreService.Client.RepositoryLocalObjectData” nie zawiera definicji „Treść” i żadna metoda wydłużania „Content” przyjęcie pierwszego argumentu typu „Tridion.ContentManager.CoreService.Client.RepositoryLocalObjectData”

Czy możliwym rozwiązaniem jest stworzenie metodę rozszerzenia?

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 Rdzeń usługi

* Aktualizacja Code podstawie Doskonała odpowiedz na poniższe

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 Kodeksu

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

Odpowiedz

6

Mam nieznacznie skorygowane kod i teraz to działa:

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

Ale ja nadal nie rozumiem, dlaczego chcesz to zrobić w ten sposób, a nie stosować prostą metodę kopiowania?

+0

Próbowałem, że pierwotnie, ale nie rozumiem, jak przejść od napisu .Nazwa do właściwości Tridion ItemType. – robrtc

+0

Doskonała sugestia użycia kopii i podziękowań za przepisaną metodę GetTridionItemType. Ostatni problem - jak ustawić właściwość pliku dla kopii strony? Nie chcę pozostawić tego ustawienia "Copy_of_pagename". – robrtc

+0

Kod zaktualizowany powyżej, jeśli warunek obsługi pliku strony. Ale czy istnieje lepszy sposób? – robrtc

Powiązane problemy