2012-09-28 10 views
7

इवेंट सिस्टम हैंडलर कोड:ट्रिडियन 2011 इवेंट सिस्टम कैसे एक पृष्ठ को प्रकाशन से रोक सकता है?

[TcmExtension("My Handler")] 
public sealed class EventSystem : TcmExtension 
{ 
    public EventSystem() 
    { 
     EventSystem.Subscribe<Page, PublishEventArgs>((page, e, phases) => { 
      if (shouldTerminatePublishing(page)) 
      { 
       throw new Exception(ex, page); 
      } 
     }, EventPhases.Initiated, EventSubscriptionOrder.Normal); 
    } 
} 
जब एकाधिक पृष्ठों प्रकाशित किए जा रहे और घटना सिस्टम ही के बारे में (एक अपवाद फेंक कर) उनमें से एक ब्लॉक करने के लिए है ऊपर कोड के साथ

, तो सभी पृष्ठों को प्रभावी ढंग से किया जा रहा से रोका जाता है भी प्रकाशित "प्रकाशन योग्य सामग्री उत्पन्न करते समय असफलताओं को अनदेखा करें" चेक बॉक्स इस व्यवहार को प्रभावित नहीं करता है।

किसी दिए गए पृष्ठ को प्रकाशन से कैसे रोकें लेकिन बाकी सभी को प्रकाशित होने की अनुमति दें?

संपादित

रूप

अपडेट किया गया कोड Quirijn के सुझाव के अनुसार:

public class MyResolver: IResolver 
{ 
    public void Resolve(
     IdentifiableObject item, 
     ResolveInstruction instruction, 
     PublishContext context, 
     ISet<ResolvedItem> resolvedItems) 
    { 
     var page = item as Page; 

     if (null != page && instruction.Purpose == ResolvePurpose.Publish) 
     { 
      try 
      { 
       // Evaluate whether publishing is allowed 
      } 
      catch (Exception ex) 
      { 
       resolvedItems.Clear(); 
      } 
     } 
    } 
} 

कुछ आपत्तियों (या बल्कि अनुवर्ती प्रश्न) अब तक:

  1. वहाँ उपलब्ध कराने के लिए कोई समझदार तरीका है जब आइटम को बाहर रखा जाता है तो उपयोगकर्ता को स्पष्ट प्रतिक्रिया ("प्रकाशित करने के लिए आइटम दिखाएं" विकल्प को जांचने के लिए सलाह देने के अलावा), क्या वहां है?
  2. कस्टम रिज़ॉल्वर को सभी वस्तुओं के प्रकारों के लिए स्पष्ट रूप से खाता होना चाहिए, जो कि: न केवल 'पृष्ठ' बल्कि 'संरचना समूह' और 'प्रकाशन' के लिए भी होना चाहिए, है ना?
  3. यह देखते हुए कि मूल्यांकन कोड महंगा हो सकता है (वेब ​​सेवा कॉल), कम से कम "प्रकाशित करने के लिए आइटम दिखाएं" सूची तैयार करने और वास्तविक प्रकाशन करने के बीच इसका परिणाम कैश करने का कोई तरीका है? (ऐसे मामले में मूल्यांकन कम से कम दो बार होता है)।

संपादित 2

मानक रिसोल्वर 'कार्यान्वयन में देखने के बाद:

  1. /अधिमानतः IBulkResolver लागू करने के लिए यह आवश्यक है के रूप में अच्छी तरह से?

उत्तर

7

आपको घटना प्रणाली में नहीं बल्कि कस्टम रिज़ॉल्वर में ऐसा नहीं करना चाहिए। यह कोड का एक टुकड़ा है जिसे यह निर्धारित करने के लिए निष्पादित किया जाता है कि प्रकाशित कतार में कोई आइटम कब रखा जाता है, कौन से पृष्ठ/घटक प्रभावी रूप से प्रकाशित किए जाने चाहिए। यहां आप किसी भी पेज या घटक को फ़िल्टर कर सकते हैं जिसे आप प्रकाशित नहीं करना चाहते हैं।

How to remove items from publishing using a Tridion Resolver? देखें।

संबंधित मुद्दे