2012-10-30 28 views
5

Tôi đang cố gắng lấy danh sách các mục cha mà RepositoryLocalObject (ví dụ: Component) được kế thừa từ đó. Vì vậy, nếu tôi có một pub ID 1 với thành phần tcm: 1-80 và một pub pub ID 2, thì thành phần này được chia sẻ trong pub con như tcm: 2-80. Vì vậy, tôi muốn có được cha mẹ của tcm: 2-80, hoặc bất cứ thứ gì trong cây di chuyển lên.Tridion RepositoryLocalObject.GetBluePrintChú pháp phương pháp (BluePrintChainFilter) đưa ra ngoại lệ cho các mục được chia sẻ

Tôi đã thử phương thức GetBluePrintChain() trên bản sao cục bộ của thành phần mà nó hoạt động tốt. Tuy nhiên, trên thành phần được chia sẻ, nó trả về một InvalidActionException: "Mục này được chia sẻ". Tài liệu đề cập rằng ngoại lệ này được ném vào các mục được chia sẻ. Nhưng điều này có ý nghĩa gì? Rõ ràng nếu bất kỳ mục nào có một chuỗi kế hoạch chi tiết ngoài chính nó sẽ được chia sẻ (hoặc là một bản sao cục bộ). Vì vậy, với tôi nó không có ý nghĩa để có phương pháp này ném một ngoại lệ về một cái gì đó mà có một chuỗi kế hoạch chi tiết. Có vẻ như mâu thuẫn.

Câu hỏi của tôi có phần liên quan đến Getting root publication of component, nhưng khác biệt. Tôi cần phải hiểu tại sao ngoại lệ này được ném vào các mục được chia sẻ. Ai đó có thể vui lòng giải thích và có lẽ chia sẻ một trường hợp sử dụng để hỗ trợ nó?

Trả lời

4

Theo như tôi biết, phương pháp GetBluePrintChain có nghĩa là xem xét một BluePrint khi bạn đang đứng ở đầu nó. Vì vậy, trong trường hợp của bạn, bạn sẽ nhận được các mục trong bối cảnh xuất bản của riêng mình và sau đó gọi GetBluePrintChain.

Item item = package.GetByName("Component"); 
Component component = new Component(item.GetAsXmlDocument().DocumentElement, 
            engine.GetSession()); 
TcmUri id = TemplateUtilities.CreateTcmUriForPublication(
     component.OwningRepository.Id.ItemId, component.Id); 

var blueprintchain = ((Component)engine.GetObject(id)).GetBluePrintChain(); 

package.PushItem(package.CreateStringItem(ContentType.Text, 
              blueprintchain.ToString())); 
package.PushItem(package.CreateStringItem(ContentType.Text, 
          ""+System.Linq.Enumerable.Count(blueprintchain))); 
foreach (var item in blueprintchain) 
{ 
    package.PushItem(package.CreateTridionItem(ContentType.Component, item)); 
} 

Tôi chỉ cần chạy C# fragment trên như một TBB trong hai kịch bản:

  1. trong một ấn phẩm trẻ em trên một phần chia sẻ
  2. trong một ấn phẩm trẻ em trên một phần cục bộ

Trong trường hợp 1, blueprintchain sẽ chứa một mục duy nhất: Thành phần được chia sẻ. Trong trường hợp 2, blueprintchain sẽ chứa hai mục: Thành phần được chia sẻ và Thành phần được bản địa hóa.

+1

ah, nhưng nếu bạn chỉ định bộ lọc, bạn có thể đặt hướng lên hoặc xuống. Vì vậy, tôi sẽ mong đợi để có thể lấy một mục chia sẻ và nhận được chuỗi lên cây: BluePrintChainFilter bpfilter = new BluePrintChainFilter (BluePrintChainDirection.Up, engine.GetSession()); –

+1

Mục có thể được bản địa hóa trong kho lưu trữ ngữ cảnh hiện tại, trong trường hợp này bạn có thể nhìn lên hoặc xuống - và bạn chỉ định hướng trong bộ lọc. Dù bằng cách nào, có vẻ như bạn chỉ có thể truy cập BluePrintChain trên một mục trong ngữ cảnh OwningRepository của nó. –

3

Để tóm tắt câu trả lời ở trên, đây là một công việc xung quanh thực tế cho vấn đề "Item được chia sẻ":

Calling GetBluePrintChain() cho một mục tùy ý điều đó xảy ra là chia sẻ sẽ thất bại:

return 
    item.GetBluePrintChain(
    new BluePrintChainFilter(
     BluePrintChainDirection.Up, 
     engine.GetSession() 
    ) 
).LastOrDefault(); 

giải pháp là để tìm cha mẹ một mục trên hầu hết các địa phương hóa đầu tiên theo công thức của Frank:

return 
    ((RepositoryLocalObject)engine 
    .GetObject(
     TemplateUtilities.CreateTcmUriForPublication(
     item.OwningRepository.Id.ItemId, 
     item.Id 
    ) 
    ) 
).GetBluePrintChain(
    new BluePrintChainFilter(
     BluePrintChainDirection.Up, 
     engine.GetSession() 
    ) 
).LastOrDefault(); 
Các vấn đề liên quan