Re: Frage zu BrowserViews in Plone 3
Carsten Senger <[email protected]>
| Newsgroups | gmane.comp.web.zope.german |
|---|---|
| Message-ID | <12D75E8E8DA2F140241A7488@dell> |
Hallo Nico, --On Dienstag, Juni 02, 2009 11:38:28 +0200 Nico Grubert <[email protected]> wrote: [...] > Ich rufe einen Content-Typen dieser Instanz über die URL > http://localhost:8080/plone/kontextnav01 auf. > Das klappt alles. Die default view ist 'kontextnavigation_view.pt' aus > dem \meinprodukt\browser Verzeichnis. Der "default view" ist bei browserviews nicht das template, dessen name auch nicht wichtig ist. Der View ist Deine von BrowserView abgeleitete Klasse, die unter einem bestimmten Namen registriert ist. > Dies ist in \meinprodukt\browser\kontextnavigation_view.py wie folgt > definiert: > ------------------------------------------------------------------------- > ------ > from Products.Five.browser import BrowserView > from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile > > class kontextnavigationView(BrowserView): > """ Default view of a kontextnavigation > """ > > __call__ = ViewPageTemplateFile('kontextnavigation_view.pt') > ------------------------------------------------------------------------- > > > Soweit so gut. > Nun möchte ich aber gern > http://localhost:8080/plone/kontextnav01/single_view aufrufen, um eine > andere Inhaltsansicht des Content-Typs zu sehen. > Dazu habe ich im Code oben einfach folgende Zeile eingetragen: > > view_single = ViewPageTemplateFile('kontextnavigation_view_single.pt') > > Leider erhalte ich beim Aufruf einen 'NotFound' Fehler, da 'view_single' > nicht gefunden wird. Damit fügst Du der Pythonklasse nur ein Attribut hinzu. Schreibe eine zweite Viewklasse class SimpleView(kontextnavigationView): """ Simple view of a kontextnavigation """ __call__ = ViewPageTemplateFile('simplenavigation_view.pt') Du kannst auch wieder von BrowserView ableiten, wenn Du keine Methoden vererben willst. Registriere SimpleView dann in browser/configure.zcml unter einem bestimmten Namen. Du findest dort bereits einen Eintrag für den kontextnavigationView. Lange Namen wie kontextnavigation_view sind meist nicht mehr nötig, da Du einen View nur für ein bestimmtes Interface (und damit einen bestimmten Contenttype) registrierst. Damit wird Dein View für andere Objekte nicht gefunden. (Im Gegensatz zu den Templates in /skins, bei denen man jedes Template überall aufrufen konnte.) Außerdem definierst Du in portal_types am besten einen alias, der dann Deinen Views benutzt, z.B. "view" = @@default, "simple" = @@simple. @@ zeigt an, dass default bzw. simple browser views sind. > > Ich erinnere ich mich, dass ich früher in Plone 2, als noch nicht mit > BrowserViews gearbeitet wurde, die Verweise auf Page Templates immer > direkt in der eigentlichen Content-Klasse gemacht wurden. > In meinem Fall wäre dies in > \meinprodukt\content\kontextnavigation_view.py. Du solltest die Module und Klassen, die Contenttypes enthalten, nicht *_view nennen, da es sich bei Content nicht um einen "View" handelt. Ein View ist nur dazu da, Content darzustellen. Dass die Namen der Templates früher in der Archetypes Contentklasse definiert wurden lag an Archetypes. Beim registrieren wurden die Werte aus der Klasse gelesen und in portal_types geschrieben. In Plone 3 sollte diese Definition aber in einer XML-Datei in profiles/defaults/types gemacht werden (GenericSetup). Am besten in Martins Buch schauen. Auf Plone gibt es diverse Dokumentation zu BrowserViews, z.B. <http://plone.org/documentation/tutorial/customization-for-developers/zope-3-browser-views> ..Carsten _______________________________________________ zope mailing list [email protected] https://mail.dzug.org/mailman/listinfo/zope