2012-03-07 17 views
6

Trong Tridion 2011 Tôi muốn sử dụng Dịch vụ cốt lõi tương đương UpdateXml để tạo các đối tượng Tridion mới theo cách tổng quát. Tôi dự định tạo các thành phần mới, Pages và sau đó trên các thư mục và các nhóm cấu trúc. Nó hoạt động khá tốt bằng cách sử dụng UpdateXml nhưng tôi đang gặp vấn đề với việc đúc RepositoryLocalObject (hoặc một đối tượng kiểu chung khác) cho một đối tượng ComponentData với Dịch vụ cốt lõi. Mã dịch vụ cốt lõi của tôi dài hơn nhiều (và tăng lên lần thứ hai).Tạo một mục trong Tridion 2011 bằng Dịch vụ cốt lõi

nhắn

báo lỗi khi tôi thử truy cập vào đối tượng loại tài sản cụ thể:

Lỗi 9 'Tridion.ContentManager.CoreService.Client.RepositoryLocalObjectData' không chứa một định nghĩa cho 'nội dung' và không có phương pháp khuyến nông 'Nội dung' chấp nhận đối số đầu tiên của loại 'Tridion.ContentManager.CoreService.Client.RepositoryLocalObjectData'

Một giải pháp có thể là tạo phương pháp mở rộng?

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 Dịch vụ cốt lõi

* Mã Cập nhật Dựa trên xuất sắc trả lời Dưới

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

* gốc Mã

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

Trả lời

6

Tôi đã hơi điều chỉnh mã của bạn và bây giờ nó làm việc:

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

Nhưng tôi vẫn không hiểu tại sao bạn muốn làm điều đó theo cách này và không sử dụng phương pháp sao chép đơn giản?

+0

Tôi đã thử rằng ban đầu, nhưng không hiểu làm thế nào để đi từ chuỗi .Name đến một tài sản Tridion ItemType. – robrtc

+0

Đề xuất tuyệt vời để sử dụng sao chép và cảm ơn phương pháp GetTridionItemType được viết lại. Một vấn đề cuối cùng - làm cách nào để đặt thuộc tính tên tệp cho bản sao của trang? Tôi không muốn để nó được đặt thành 'Copy_of_pagename'. – robrtc

+0

Mã được cập nhật ở trên với điều kiện để xử lý tên tệp trang. Nhưng, có cách nào tốt hơn không? – robrtc

Các vấn đề liên quan