2012-12-14 24 views
6

जब प्लोन में एक BrowserView बनाने में टेम्पलेट के बीच अंतर है, मुझे पता है कि मैं वैकल्पिक रूप से तो जैसे के साथ एक टेम्पलेट कॉन्फ़िगर कर सकते हैं ZCML:क्या ZCML और ViewPageTemplateFile

<configure 

    xmlns:browser="http://namespaces.zope.org/browser" 
    > 

    <browser:page 
     … 
     class=".foo.FooView" 
     template="foo.pt" 
     … 
     /> 

</configure> 

या वैकल्पिक रूप से कोड में:

# foo.py 
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile 
from zope.publisher.browser import BrowserPage 


class FooView(BrowserPage): 
    """ 
    My View 
    """ 

    def __call__(self): 
     return ViewPageTemplateFile('foo.pt')(self) 

क्या दो दृष्टिकोणों के बीच कोई अंतर है? वे दोनों एक ही परिणाम उत्पन्न करने लगते हैं।

उप-प्रश्न: मुझे पता है कि वहाँ एक BrowserView वर्ग एक आयात कर सकते हैं, लेकिन पारंपरिक हर किसी BrowserPage उपयोग करता है। क्या होगा यदि दो वर्गों के बीच कोई महत्वपूर्ण मतभेद मौजूद है?

उत्तर

7

नोट: जेडसीएमएल के समतुल्य होने के लिए आपको index चर सेट करना चाहिए ताकि आप यह निर्दिष्ट कर सकें कि आप किस टेम्पलेट का उपयोग कर रहे हैं। इस तरह टीटीडब्ल्यू अनुकूलन भी काम करेगा।

# foo.py 
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile 
from zope.publisher.browser import BrowserPage 
class FooView(BrowserPage): 
    index = ViewPageTemplateFile('foo.pt') 

ब्राउज़र दृश्य के साथ आप एक अन्य पैटर्न का उपयोग कर सकते हैं एक अद्यतन विधि जोड़ रहा है।

class FooView(BrowserPage): 
    index = ViewPageTemplateFile('foo.pt') 
    def __call__(self): 
     self.update() 
     return self.index() 

    def update(self): 
     self.portal_catalog = ... # initialize code 

लेकिन यह सवाल नहीं है।


तो क्या अंतर है? कोई फर्क नहीं पड़ता। एक ब्राउज़र दृश्य एक कॉल करने योग्य होना चाहिए। जेडसीएमएल निर्देश इस कॉलबल को इस तरह से बनाता है जिस तरह ऑब्जेक्ट में एक इंडेक्स है जो प्रस्तुत पृष्ठ को वापस करना होगा।

लेकिन प्रत्येक कॉल (आपका उदाहरण) पर टेम्पलेट बनाना एक अंतर है: आप ब्राउज़र दृश्य के प्रत्येक कॉल पर टेम्पलेट का एक नया उदाहरण बना रहे हैं। कक्षा चर के साथ यह मामला नहीं है।

एक आखिरी विकल्प: आप, निर्देश

<configure xmlns:browser="http://namespaces.zope.org/browser"> 
    <browser:page 
    … 
    template="foo.pt" 
    … 
    /> 
</configure> 

अधिक जानकारी के लिए में एक वर्ग तर्क की जरूरत नहीं है तुम the code of the directive, जो SimpleViewClass where src is the template name का उपयोग करता है पढ़ना चाहिए।

+0

कृपया यहां पोस्ट में यूआरएल शॉर्टनर्स का उपयोग न करें, आप जो भी लिंक कर रहे हैं उसे पूरी तरह से आवश्यकता नहीं है और अस्पष्ट नहीं है। –

+0

हाय चाहते हैं लेकिन svn.zope.org urls जहां * में इसके कारण यूआरएल के रूप में पहचाना नहीं गया है। – toutpt

+0

संपादित करने के लिए धन्यवाद, जब एक सादे यूआरएल (लिंक के रूप में नहीं) के रूप में उपयोग किया जाता है तो जोड़ा गया '*' क्षुद्रग्रह 'इटालिक्स' के लिए मार्कडाउन के रूप में व्याख्या किया जाता है। –

1

AFAIK, कोई अंतर है। जेडसीएमएल निर्देश ViewPageTemplateFile के साथ व्यू क्लास उत्पन्न करता है और __call__ पर टेम्पलेट प्रस्तुत करता है। zope.browserpage.metaconfigure.page लाइनें 132, 151 देखें।

यह वही है जो आप अपने उदाहरण में करते हैं: आप स्पष्ट रूप से अपने __call__ विधि में टेम्पलेट को तुरंत चालू करते हैं।

उपधारा के रूप में: मेरी समझ से, ज़ोप 2/प्लोन के संदर्भ में महत्वपूर्ण मतभेद स्पष्ट नहीं हैं। इंटरफ़ेस (zope.publisher.interfaces.browser.IBrowserPage) के आधार पर, ब्राउज़रपेज वह मूल श्रेणी है जिसे आप प्राप्त करना चाहते हैं, क्योंकि यह __call__ और browserDefault लागू करता है। फिर भी, यदि आप प्लोन के साथ BrowserPage या BrowserView का उपयोग करते हैं तो यह कोई फर्क नहीं पड़ता।

7

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

यदि आप केवल अपने __call__ में टेम्पलेट को परिभाषित करते हैं, तो आप इसे portal_view_customizations में नहीं देख पाएंगे।

इसके अलावा, मुझे लगता है कि एक विधि के भीतर टेम्पलेट लोड करना प्रत्येक दृश्य उदाहरण (प्रत्येक अनुरोध) के लिए डिस्क से इसे पुनः लोड करेगा।

+0

ओह, बस @ toutpt के उत्तर पर जाएं। मुझे पता नहीं था कि टीटीडब्लू कस्टमाइज़ेशन के लिए आवश्यक जादू सिर्फ टेम्पलेट को "इंडेक्स" क्लास वैरिएबल के रूप में रख रहा था। –

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

  • कोई संबंधित समस्या नहीं^_^