इवेंट सिस्टम हैंडलर कोड:ट्रिडियन 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();
}
}
}
}
कुछ आपत्तियों (या बल्कि अनुवर्ती प्रश्न) अब तक:
- वहाँ उपलब्ध कराने के लिए कोई समझदार तरीका है जब आइटम को बाहर रखा जाता है तो उपयोगकर्ता को स्पष्ट प्रतिक्रिया ("प्रकाशित करने के लिए आइटम दिखाएं" विकल्प को जांचने के लिए सलाह देने के अलावा), क्या वहां है?
- कस्टम रिज़ॉल्वर को सभी वस्तुओं के प्रकारों के लिए स्पष्ट रूप से खाता होना चाहिए, जो कि: न केवल 'पृष्ठ' बल्कि 'संरचना समूह' और 'प्रकाशन' के लिए भी होना चाहिए, है ना?
- यह देखते हुए कि मूल्यांकन कोड महंगा हो सकता है (वेब सेवा कॉल), कम से कम "प्रकाशित करने के लिए आइटम दिखाएं" सूची तैयार करने और वास्तविक प्रकाशन करने के बीच इसका परिणाम कैश करने का कोई तरीका है? (ऐसे मामले में मूल्यांकन कम से कम दो बार होता है)।
संपादित 2
मानक रिसोल्वर 'कार्यान्वयन में देखने के बाद:
- /अधिमानतः IBulkResolver लागू करने के लिए यह आवश्यक है के रूप में अच्छी तरह से?