2012-10-30 16 views
5

मैं मूल वस्तुओं की एक सूची प्राप्त करने का प्रयास कर रहा हूं जो एक रिपोजिटरी लोकल ऑब्जेक्ट (उदा। घटक) से विरासत में मिला है। तो अगर मेरे पास घटक टीसीएम: 1-80 और एक बाल पब आईडी 2 के साथ एक पब आईडी 1 है, तो यह घटक बच्चे पब में टीसीएम: 2-80 के रूप में साझा किया जाता है। तो मैं टीसीएम प्राप्त करना चाहता हूं: 2-80 के माता-पिता, या पेड़ में जो भी हो रहा है।Tridion RepositoryLocalObject.GetBluePrintChain विधि (BluePrintChainFilter) साझा वस्तुओं पर अपवाद फेंकता है

मैंने GetBluePrintChain() विधि को एक घटक की स्थानीय प्रतिलिपि पर आजमाया है जहां यह ठीक काम करता है। हालांकि, साझा घटक पर यह एक अवैध क्रिया अपवाद देता है: "यह आइटम साझा किया गया है"। दस्तावेज का उल्लेख है कि साझा अपवादों पर यह अपवाद फेंक दिया गया है। लेकिन यह कैसे समझ में आता है? जाहिर है अगर किसी भी आइटम में ब्लूप्रिंट श्रृंखला स्वयं से परे साझा की जाएगी (या स्थानीय प्रतिलिपि हो)। तो मेरे लिए यह समझ में नहीं आता है कि यह विधि ब्लूप्रिंट श्रृंखला वाली किसी चीज़ पर अपवाद फेंक दे। यह विरोधाभासी लगता है।

मेरा प्रश्न कुछ हद तक Getting root publication of component से संबंधित है, लेकिन यह अलग है। मुझे समझने की जरूरत है कि साझा वस्तुओं पर यह अपवाद क्यों फेंक दिया गया है। क्या कोई इसे समझा सकता है और शायद इसका समर्थन करने के लिए उपयोग केस साझा कर सकता है?

उत्तर

4

जहां तक ​​मुझे पता है कि GetBluePrintChain विधियां ब्लूप्रिंट को देखने के लिए हैं, जब आप इसके शीर्ष पर खड़े हैं। तो आपके मामले में, आपको आइटम को अपने स्वयं के प्रकाशन संदर्भ में प्राप्त करना चाहिए और फिर 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)); 
} 

मैं सिर्फ एक TBB के रूप में ऊपर सी # टुकड़ा दो स्थितियों में भाग गया:

  1. एक बच्चे प्रकाशन में एक साझा घटक
  2. पर एक बच्चे को प्रकाशन में एक स्थानीय घटक पर

यदि blueprintchain में एक आइटम होगा: साझा घटक। यदिमें दो आइटम होंगे: साझा घटक और स्थानीय घटक।

एक मनमाना आइटम कि साझा असफल हो जायेगी होने के लिए GetBluePrintChain() कॉलिंग:

+1

आह, लेकिन यदि आप एक फ़िल्टर निर्दिष्ट करते हैं तो आप दिशा को ऊपर या नीचे सेट कर सकते हैं। इसलिए मैं एक साझा आइटम लेने और पेड़ को चेन प्राप्त करने में सक्षम होने की उम्मीद करता हूं: ब्लूप्रिंटChainFilter bpfilter = नया ब्लूप्रिंटChainFilter (BluePrintChainDirection.Up, engine.GetSession()); –

+1

आइटम को वर्तमान संदर्भ भंडार में स्थानीयकृत किया जा सकता है, इस मामले में आप या तो ऊपर या नीचे देख सकते हैं - और आप फ़िल्टर में दिशा निर्दिष्ट करते हैं। किसी भी तरह से ऐसा लगता है कि आप केवल अपने स्वामित्व के संदर्भ में किसी आइटम पर BluePrintChain तक पहुंच सकते हैं। –

3

जवाब ऊपर संक्षेप में, यहाँ एक व्यावहारिक काम के आसपास "आइटम साझा किया जाता है" जारी करने के लिए है

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

समाधान फ्रैंक नुस्खा के अनुसार पहले एक सर्वोच्च स्थानीय आइटम के माता-पिता को मिल रहा है:

return 
    ((RepositoryLocalObject)engine 
    .GetObject(
     TemplateUtilities.CreateTcmUriForPublication(
     item.OwningRepository.Id.ItemId, 
     item.Id 
    ) 
    ) 
).GetBluePrintChain(
    new BluePrintChainFilter(
     BluePrintChainDirection.Up, 
     engine.GetSession() 
    ) 
).LastOrDefault();