Hallo Nico,
--On Dienstag, Juni 02, 2009 11:38:28 +0200 Nico Grubert
<
[hidden email]> 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
[hidden email]
https://mail.dzug.org/mailman/listinfo/zope