2012-12-14 9 views
6

Tworząc BrowserView w Plone, wiem, że mogę ewentualnie skonfigurować szablon z ZCML tak:Jaka jest różnica między szablonem w ZCML i ViewPageTemplateFile

<configure 

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

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

</configure> 

Lub alternatywnie w kodzie:

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

Czy jest jakaś różnica między tymi dwoma podejściami? Obaj wydają się dawać taki sam wynik.

Sub-pytanie: Wiem, że to klasa BrowserView można importować, ale zwyczajowo każdy używa BrowserPage. Co się stanie, jeśli między dwiema klasami wystąpią jakieś istotne różnice?

Odpowiedz

7

Uwaga: Aby w pełni odpowiadać ZCML, należy ustawić zmienną index, aby określić, którego szablonu używasz. W ten sposób zadziała również dostosowanie TTW.

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

Jeden inny wzór, którego można użyć z widokiem przeglądarki, dodaje metodę aktualizacji.

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

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

Ale to nie jest pytanie.


Jaka jest różnica? Nie ma różnicy. Widok przeglądarki musi być możliwy do wywołania. Dyrektywa ZCML buduje tę możliwość wywołania w taki sposób, że obiekt ma indeks, który musi zwrócić zrenderowaną stronę.

Ale tworzenie szablonu dla każdego połączenia (przykład) jest jedna różnica: tworzysz nowe wystąpienie szablonu przy każdym wywołaniu widoku przeglądarki. Nie dotyczy to zmiennej klasy.

ostatnia opcja: Nie trzeba argumentu klasy w dyrektywie

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

Aby uzyskać więcej informacji, należy zapoznać the code of the directive, która wykorzystuje SimpleViewClass where src is the template name.

+0

Proszę nie używać skrótów URL w postach tutaj, nie ma absolutnie żadnej potrzeby i ukrywa, z czym łączysz. –

+0

Witaj, ale adresy URL svn.zope.org nie są rozpoznawane jako adresy URL, ponieważ są w nim *. Dzięki za zmianę – toutpt

+0

Prawo, gdy jest używane jako zwykły URL (nie jako link), sparowane asterixy są interpretowane jako przecena dla "kursywy". –

1

AFAIK, tam jest bez różnicy. Dyrektywa ZCML generuje ViewClass z ViewPageTemplateFile i renderuje szablon na __call__. Zobacz zope.browserpage.metaconfigure.page linie 132, 151.

To jest dokładnie to samo, co w przykładzie: jawnie utworzyć instancję szablonu w metodzie __call__.

Co do pytania: Z mojego rozumienia, znaczące różnice nie są widoczne w kontekście Zope2/Plone. Na podstawie interfejsu (zope.publisher.interfaces.browser.IBrowserPage) klasa BrowserPage jest klasą podstawową, z której chcesz dziedziczyć, ponieważ implementuje ona __call__ i browserDefault. Jednak nie ma to znaczenia, jeśli użyjesz BrowserPage lub BrowserView z Plone.

7

W Plone można dostosować szablon TTW (przez portal_view_customizations) tylko wtedy, gdy szablon jest wyraźnie zarejestrowany (np. Przy użyciu ZCML lub dyrektyw Grok).

Jeśli zdefiniujesz szablon tylko w swoim __call__, nie zobaczysz go w portal_view_customizations.

Sądzę też, że szablon ładowania w ramach metody przeładowałby go z dysku dla każdej instancji widoku (każde żądanie).

+0

Och, po prostu przejdź do odpowiedzi @ toutpt. Nie wiedziałem, że wymaganą magią do dostosowywania TTW było po prostu umieszczenie szablonu definiującego jako zmiennej klasy "index". –

Powiązane problemy