Frage zu BrowserViews in Plone 3

6 messages Options
Embed this post
Permalink
Nico Grubert-2

Frage zu BrowserViews in Plone 3

Reply Threaded More More options
Print post
Permalink
Hallo Liste,

ich habe ein Plone 3 basiertes Produkt entwickelt, das folgende
Verzeichnisstruktur hat:

\meinprodukt
   \browser
     \kontextnavigation_view.py
     \kontextnavigation_view.pt
     \kontextnavigation_view_single.pt
   \content
     \kontextnavigation_view.py
   \profiles
     \default
       \factorytool.xml
       \types.xml
       \types
         \kontextnavigation.xml


In  meinprodukt\content\kontextnavigation_view.py habe ich einen
ATCTContent basierten Content-Typen definiert.
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.
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.

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.

Wie löse ich das mit BrowserViews? Habe ich etwas vergessen oder ist der
Ansatz falsch?

Bin für jeden Tip dankbar.

Viele Grüsse
Nico


_______________________________________________
zope mailing list
[hidden email]
https://mail.dzug.org/mailman/listinfo/zope
Carsten Senger-3

Re: Frage zu BrowserViews in Plone 3

Reply Threaded More More options
Print post
Permalink
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
robert rottermann

Re: Frage zu BrowserViews in Plone 3

Reply Threaded More More options
Print post
Permalink
In reply to this post by Nico Grubert-2
du kannst z.b die verschiedenen views als macros definieren.
das geht so:
im configure.zcml definierst du den macro:
    <browser:page
        for="*"
        name="query_macros"
        template="templates/query_macros.pt"
        permission="zope.Public"
    />
dann kannst du den macro wie folgt brauchen:
<div metal:use-macro="view/context/query_macros/macros/result-body" />

gruss
robert

Nico Grubert schrieb:

> Hallo Liste,
>
> ich habe ein Plone 3 basiertes Produkt entwickelt, das folgende
> Verzeichnisstruktur hat:
>
> \meinprodukt
>   \browser
>     \kontextnavigation_view.py
>     \kontextnavigation_view.pt
>     \kontextnavigation_view_single.pt
>   \content
>     \kontextnavigation_view.py
>   \profiles
>     \default
>       \factorytool.xml
>       \types.xml
>       \types
>         \kontextnavigation.xml
>
>
> In  meinprodukt\content\kontextnavigation_view.py habe ich einen
> ATCTContent basierten Content-Typen definiert.
> 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.
> 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.
>
> 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.
>
> Wie löse ich das mit BrowserViews? Habe ich etwas vergessen oder ist der
> Ansatz falsch?
>
> Bin für jeden Tip dankbar.
>
> Viele Grüsse
> Nico
>
>
> _______________________________________________
> zope mailing list
> [hidden email]
> https://mail.dzug.org/mailman/listinfo/zope
>
>



_______________________________________________
zope mailing list
[hidden email]
https://mail.dzug.org/mailman/listinfo/zope
robert rottermann

Re: Frage zu BrowserViews in Plone 3

Reply Threaded More More options
Print post
Permalink
robert rottermann schrieb:

> dann kannst du den macro wie folgt brauchen:
> <div metal:use-macro="view/context/query_macros/macros/result-body" />

wobei result-body natürlich der eigentliche makro ist (wie bis anhin gehabt)
robert


_______________________________________________
zope mailing list
[hidden email]
https://mail.dzug.org/mailman/listinfo/zope
Nico Grubert-2

Re: Frage zu BrowserViews in Plone 3

Reply Threaded More More options
Print post
Permalink
In reply to this post by Carsten Senger-3
Hallo Carsten

vielen Dank für dein ausführliches und sehr erleuchtendes Feedback!
Jetzt ist mir vieles *viel* klarer. :-)

> 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.

> Schreibe eine zweite Viewklasse
>
> class SimpleView(kontextnavigationView):
>    """ Simple view of a kontextnavigation
>    """
>
>    __call__ = ViewPageTemplateFile('simplenavigation_view.pt')
> Registriere SimpleView dann in browser/configure.zcml unter einem
> bestimmten Namen.

Das finde ich allerdings im Vergleich zu den alten Plone2 Archetypes
basierten Contenttypen, wo man einfach der Klasse ein neues Attribut
(PageTemplate) unterschieben konnte, ganz schön viel Overhead.
Worin liegt denn der Vorteil dieser Methode?
Ich habe generell manchmal den Eindruck, dass durch die Zope 3
Technologie in Plone 3 mehr Code und mehr Overhead entsteht. Aber
vielleicht habe ich die Vorteile einfach noch nicht erkannt. ;-)

 > (Im Gegensatz zu den Templates in /skins,
 > bei denen man jedes Template überall aufrufen konnte.)

Das fand ich früher auch immer unschön.


Nochmals vielen herzlichen Dank, Carsten.

Grüsse
Nico
Nochmals vielen herzlichen Dank, Carsten.

Grüsse
Nico


_______________________________________________
zope mailing list
[hidden email]
https://mail.dzug.org/mailman/listinfo/zope
Carsten Senger-3

Re: Frage zu BrowserViews in Plone 3

Reply Threaded More More options
Print post
Permalink
Hallo Nico,

--On Dienstag, Juni 02, 2009 13:09:40 +0200 Nico Grubert
<[hidden email]> wrote:

> vielen Dank für dein ausführliches und sehr erleuchtendes Feedback!
> Jetzt ist mir vieles *viel* klarer. :-)
>
>> 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.
>
>> Schreibe eine zweite Viewklasse
>>
>> class SimpleView(kontextnavigationView):
>>    """ Simple view of a kontextnavigation
>>    """
>>
>>    __call__ = ViewPageTemplateFile('simplenavigation_view.pt')
>> Registriere SimpleView dann in browser/configure.zcml unter einem
>> bestimmten Namen.
>
> Das finde ich allerdings im Vergleich zu den alten Plone2 Archetypes
> basierten Contenttypen, wo man einfach der Klasse ein neues Attribut
> (PageTemplate) unterschieben konnte, ganz schön viel Overhead.
> Worin liegt denn der Vorteil dieser Methode?
Das sind jetzt 2 verschiedene Änderungen. Ob Du weiterhin in Deiner
archetypesbasierten Klasse ein Attribut für die späteren Einträge in
portal_types verwenden kannst weiß ich nicht. Grundsätzlich wurden sehr
viele "Konfigurationen" auf GenericSetup umgestellt (types (incl. der dazu
gehörenden viewnamen), workflows, Katalog indizes, Allgemeine Plone
Konfigurationen etc.). Deshalb sind einige Sachen aus der Archetypes Klasse
herausgewandert. Ob Du ein Template in /skins verwendest oder einen
BrowserView hat damit nichts zu tun.

Der oben beschriebene Teil befasst sich nur damit, wie Du den BrowerView
schreibst.

Es gibt übrigens auch eine Möglichkeit, das bei einem BrowserView das
Template mittels 'template="atemplate.pt"' in der zcml-Direktive anzugeben.
Wahrscheinlich reichte es dazu, die definition von __call__ aus der Klasse
heraus zu nehmen. Dann brauchst Du nur eine Klasse, die Du zweimal mit
unterschiedlichen Templates registrierst.

> Ich habe generell manchmal den Eindruck, dass durch die Zope 3
> Technologie in Plone 3 mehr Code und mehr Overhead entsteht. Aber
> vielleicht habe ich die Vorteile einfach noch nicht erkannt. ;-)

Der größte Vorteil ist, dass Du die Logik Deines Views aus dem Template
in eine Pythonklasse verlagerst, während Du sie vorher in mehrere skripte
oder Hilfsmethoden irgendwo in anderem Pythoncode ausgelagert hast, und der
View wirklich nur für die Interfaces gefunden wird, für den Du ihn
registriert hast. Mit Interfaces und Adaptern lassen sich noch viele andere
Sachen machen, aber es ist viel komplexer als vorher und hat mehr overhead.

Ein Teil des Overheads wird in Plone 4 oder 5 wegfallen. Aus einfachen
zcml-Einträgen werden
wahrscheinlich decorators wie bei grok. Aber irgendwo musst Du ja angeben,
für welches Interface Dein View verwendet werden soll und ob bestimmte
Rechte benötigt werden.

>  > (Im Gegensatz zu den Templates in /skins,
>  > bei denen man jedes Template überall aufrufen konnte.)
>
> Das fand ich früher auch immer unschön.
>
>
> Nochmals vielen herzlichen Dank, Carsten.
>

..Carsten



_______________________________________________
zope mailing list
[hidden email]
https://mail.dzug.org/mailman/listinfo/zope