2012-02-18 6 views
6

एक ऐसे घटक को प्रकाशित करना जिसमें एकाधिक गतिशील टेम्पलेट्स आमतौर पर ब्रोकर को प्रकाशित होने वाले सभी संभावित गतिशील घटक प्रस्तुतिकरणों का परिणाम बनेंगे।जब ट्रिडियन में किसी पृष्ठ पर डीसीपी लगाए जाते हैं, तो आप कैसे सुनिश्चित कर सकते हैं कि घटक के सभी गतिशील प्रस्तुतिकरण पृष्ठ के साथ प्रकाशित किए गए हैं?

जब आप किसी पृष्ठ पर आइटम को रखने के विकल्प के साथ एक डीसीटी बनाते हैं, तो सामग्री संपादक सीधे घटक को प्रकाशित नहीं करना चाहता, बस सही चीज़ करने के लिए पृष्ठ प्रकाशित पर निर्भर करता है। हम तीन संभावित वांछित प्रकाशन परिदृश्यों पर विचार कर सकता है:

  1. कि पृष्ठ प्रकाशित केवल स्थिर घटक प्रस्तुतियों का कारण चाहिए, प्रदान करने की (प्लस जो कुछ सीडी कोड गतिशील लोगों को प्रदर्शित करने के लिए आवश्यक है)
  2. के अलावा
  3. कि स्थिर सीपी, किसी भी गतिशील सीपी प्रकाशित किया जाना चाहिए। एक ही घटक के अन्य संभावित गतिशील प्रस्तुतिकरण प्रकाशित नहीं हैं।
  4. यदि कोई गतिशील सीपी प्रकाशित होता है, तो सामान्य घटक प्रकाशन अर्थशास्त्र का पालन किया जाता है, और सभी गतिशील प्रस्तुतिकरण ब्रोकर पर जाएंगे।

Tridion का डिफ़ॉल्ट व्यवहार, परिदृश्य 2) प्रतीत होता है जबकि मेरे अनुभव), कि अक्सर आप क्या चाहते हैं परिदृश्य 3 है आप एक पूर्ण और सीडी पक्ष पर किसी भी घटक के लगातार देख सकें।

परिदृश्य 3 को लागू करने का सबसे अच्छा तरीका क्या है (सही ढंग से काम करने के लिए अप्रकाशित होने सहित)?

उत्तर

8

मेरी राय में, आपके प्रश्न का सबसे अच्छा जवाब एक कस्टम रिजॉल्वर को लागू करना है जिसमें आवश्यक गतिशील घटक प्रस्तुतियां शामिल होंगी। अप्रकाशित होने पर मैं कुछ भी करने से सावधान रहूंगा, कभी-कभी आप किसी दिए गए पृष्ठ को अप्रकाशित करने के बाद डीसीपी को रखना चाहते हैं ("नवीनतम समाचार" कार्यक्षमता या किसी अन्य प्रकार की गतिशील क्वेरी के लिए), लेकिन नीचे दिए गए कोड नमूने से यह होगा यदि आपको सभी डीसीपी को अप्रकाशित करने की आवश्यकता है तो अनुकूलित करने के लिए आपके लिए आसान है।

चेतावनी: नीचे कोड उत्पादन-परीक्षण नहीं है।

using Tridion.ContentManager; 
using Tridion.ContentManager.CommunicationManagement; 
using Tridion.ContentManager.ContentManagement; 
using Tridion.ContentManager.Publishing; 
using Tridion.ContentManager.Publishing.Resolving; 

public class IncludeDynamicComponentPresentations : IResolver 
{ 
    public void Resolve(
      IdentifiableObject item, 
      ResolveInstruction instruction, 
      PublishContext context, 
      Tridion.Collections.ISet<ResolvedItem> resolvedItems) 
    { 

     if (!(instruction.Purpose == ResolvePurpose.Publish || 
      instruction.Purpose == ResolvePurpose.RePublish)) 
     { 
      // Do nothing more when unpublishing 
      return; 
     } 

     Session session = item.Session; 
     foreach (ResolvedItem resolvedItem in resolvedItems) 
     { 
      // Only do something if we're dealing with a page 
      if (!(resolvedItem.Item is Page)) continue; 
      Page page = (Page)resolvedItem.Item; 
      if (page.ComponentPresentations.Count > 0) 
      { 
       UsingItemsFilter filter = new UsingItemsFilter(session); 
       filter.InRepository = page.ContextRepository; 
       filter.ItemTypes = new[] { ItemType.ComponentTemplate }; 

       foreach (ComponentPresentation cp in page.ComponentPresentations) 
       { 
        // Find all component templates linked to this component's schema 
        Schema schema = cp.Component.Schema; 
        foreach (ComponentTemplate ct in schema.GetUsingItems(filter)) 
        { 
         if (!ct.Id.Equals(cp.ComponentTemplate.Id)) 
         { 
          if (ct.IsRepositoryPublishable) 
          { 
           resolvedItems.Add(new ResolvedItem(cp.Component, ct)); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

अब आप GAC को यह जोड़ सकते हैं और संशोधित करें (को हल करने के लिए हर आइटम प्रकार के लिए/मैपिंग के तहत) [Tridion] \ Config \ Tridion.ContentManager.Config तो यह रिज़ॉल्वर हर संकल्प कार्रवाई के बाद कहा जाता है की आवश्यकता होगी।

3

शायद एक कस्टम रिजॉल्वर इस स्थिति में मदद करेगा? यह आपको एक प्रकाशित कार्रवाई से परिणाम की सभी वस्तुओं तक पहुंच प्रदान करेगा, जिससे आप डिफ़ॉल्ट व्यवहार को बदल सकते हैं।

एसडीएल ट्रिडियन प्रलेखन पोर्टल में इसका एक अच्छा उदाहरण है, लेकिन यह मूल रूप से आपको .NET में एक कस्टम रिज़ॉल्वर क्लास बनाने की अनुमति देता है, जहां आप अपना कस्टम तर्क लागू कर सकते हैं।