2012-12-14 14 views
6

Wenn ein BrowserView in Plone zu schaffen, weiß ich, dass ich optional eine Vorlage mit ZCML wie so konfigurieren kann:Was ist der Unterschied zwischen der Schablone in ZCML und ViewPageTemplateFile ist

<configure 

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

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

</configure> 

Oder alternativ in Code:

# 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) 

Gibt es einen Unterschied zwischen den beiden Ansätzen? Beide scheinen das gleiche Ergebnis zu liefern.

Unter Frage: Ich weiß, dass es eine BrowserView Klasse ist ein importieren kann, aber konventionell jeder benutzt BrowserPage. Was ist, wenn signifikante Unterschiede zwischen den beiden Klassen bestehen?

Antwort

7

Hinweis: Um ZCML vollständig entsprechen zu können, sollten Sie die Variable index festlegen, um anzugeben, welche Vorlage Sie verwenden. Auf diese Weise funktioniert die TTW-Anpassung auch.

Ein weiteres Muster, das Sie mit einer Browseransicht verwenden können, ist das Hinzufügen einer Aktualisierungsmethode.

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

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

Aber das ist nicht die Frage.


Was ist der Unterschied? Es gibt keinen Unterschied. Eine Browser-Ansicht muss aufrufbar sein. Die ZCML-Direktive erstellt dieses Callable so, dass das Objekt über einen Index verfügt, der die gerenderte Seite zurückgeben muss.

Beim Erstellen der Vorlage für jeden Aufruf (Ihr Beispiel) gibt es einen Unterschied: Sie erstellen eine neue Instanz der Vorlage bei jedem Aufruf der Browseransicht. Dies ist bei der Klassenvariablen nicht der Fall.

Eine letzte Option: Sie brauchen keine Klasse Argument in der Richtlinie

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

Für weitere Informationen sollten Sie the code of the directive, lesen die SimpleViewClass where src is the template name verwendet.

+0

Bitte verwenden Sie keine URL-Verkleinerer in Posts, da ist es absolut unnötig und verdeckt, worüber Sie verlinken. –

+0

Hi möchte aber svn.zope.org urls wo nicht als url erkannt werden weil der * darin drin ist. Danke für die Bearbeitung – toutpt

+0

Rechts, wenn sie als einfache URL (nicht als Link) verwendet werden, werden die gepaarten * Asterixe als Markdown für Kursivschrift interpretiert. –

1

AFAIK, dort ist kein Unterschied. Die ZCML-Direktive generiert eine ViewClass mit einem ViewPageTemplateFile und rendert die Vorlage auf einem __call__. Siehe zope.browserpage.metaconfigure.page Zeilen 132, 151.

Das ist genau dasselbe, das Sie in Ihrem Beispiel tun: Sie instanziieren die Vorlage explizit in Ihrer __call__-Methode.

Zur Teilfrage: Aus meiner Sicht sind die signifikanten Unterschiede im Zusammenhang mit Zope2/Plone nicht ersichtlich. Basierend auf der Schnittstelle (zope.publisher.interfaces.browser.IBrowserPage) ist die BrowserPage die Basisklasse, von der Sie übernehmen möchten, da sie __call__ und browserDefault implementiert. Es scheint jedoch keine Rolle zu spielen, ob Sie BrowserPage oder BrowserView mit Plone verwenden.

7

In Plone können Sie die Vorlage TTW (über portal_view_customizations) nur anpassen, wenn die Vorlage explizit registriert ist (z. B. mit ZCML oder Grok-Anweisungen).

Wenn Sie die Vorlage nur in Ihrer __call__ definieren, wird sie nicht in portal_view_customizations angezeigt.

Ich würde auch annehmen, dass das Laden von Vorlage innerhalb einer Methode es von der Festplatte für jede View-Instanz (jede Anfrage) neu laden würde.

+0

Oh, gehen Sie einfach zu @ toutpt's Antwort. Mir war nicht bewusst, dass die erforderliche Magie für TTW-Anpassungen nur das Definieren der Vorlage als "Index" -Klassenvariable war. –