Zusätzliche Navigation

  • Hallo zusammen,

    also mit ein wenig Gedult und Einarbeit ist es schon möglich, mit Plone einigermaßen klar zu kommen :) Jetzt stehe ich aber wieder vor einem kleinen Plone-Template Problem ... vielleicht ist es aber auch nur eine Kleinigkeit :)

    Ich habe mir mittels zopeskel ein neues grundlayout template erstellt (plone 3), mit eigenen viewletmanagern, weil ich ein bisschen was umstellen musste... klappt auch alles prima. mein css ist auch sauber, alles ist schön. nur möchte ich gerne im footer eine zuätzliche navigation anbringen und stehe etwas auf dem schlauch.

    ich hab mir mal dieses tutorial angeguckt, aber ich fürchte, dass das bei mir nicht funktionieren wird, weil ich die nav in einem viewlet und nicht einem portlet nutzen möchte. (link zu tutorial: http://plone.org/documentation/…ivation-portlet) nun... wie kann ich das angehen?

    ich hab meine footer.pt und auch in der viewlets.py spreche ich das template an:

    Code
    class FooterViewlet(ViewletBase):
        render = ViewPageTemplateFile('templates/footer.pt')

    zugegeben, ist etwas schlank :)

    wie kann ich nun vorgehen?

    viele grüße und schon mal danke,
    der flo.

  • Hallo,

    Dein Usecase ist relative einfach zu lösen, Da jedes Viewlet einen eigenen PortletManager besitzen kann einfach dem Viewlet einen PortletManager zuweisen und diesem ein Navigationsportlet.

    Diese Doku (http://plone.org/documentation/…anual-all-pages) sollte dir dabei helfen.

    Aber dein schlanker Code ist übringens immer noch viel zu viel, bzw. unnötig, da du die Klasse ja in einer zcml registrieren musst und nur ein render hast ist das eigentlich zuviel Code, einfacher in der zcml:

    Code
    <browser:viewlet
            name=""
            manager="plone.app.layout.viewlets.interfaces.IPortalFooter"
            template="templates/footer.pt"
            layer=".interfaces.IThemeSpecific"
            permission="zope2.View"
        />

    Gruss Pumukel

    Die beste Informationsquelle sind Leute, die versprochen haben, nichts weiterzuerzählen.

    Marcel Mart
    frz. Schriftsteller

  • Hallo Pumuckel,

    danke für Deine Antwort... jetzt muss ich aber direkt mal nachfragen. Ich hänge das Portlet an das Viewlet, oder an den ViewletManager? *kopfkratz*

    dh. ich muss so vorgehen?

    1. ViewletManager anlegen
    2. Viewlet für den Footer definieren
    3. in der viewlets.xml den Manager + das Viewlet eintragen
    4. in der configure.zcml den Viewlet-Manager und das Viewlet registrieren
    5. Neuen PortletManager anlegen
    6. die portlets.xml anlegen mit einem Verweis auf den PortletManager?

    Zu dem "schlanken Code". Ich hab die Sachen erstmal in der viewlets.py abgelegt, weil ich noch nicht weiß, ob da noch mehr quellcode hinsoll. und der breadcrumb beispielsweise hat dort nicht nur den "render"-Befehl. :)

    Da fällt mir direkt die nächste Frage ein, wie kann ich dem Plone bzw. dem Template denn sagen, dass er meine main_template.pt bei dem Theme benutzen soll? Ich hab nämlich erstmal eine Kopie der Plone main_template.pt in den skins/custom_templates/ Ordner gelegt. Da geht doch sicherlich auch richtiger, oder? ;)

    Einmal editiert, zuletzt von broikmann (24. Februar 2010 um 15:42)

  • Hallo,

    Also ein Viewlet hängt man einen Viewletmanager
    ein Portlet in einen Portletmanager.

    Einen Viewletmanager und Portletmanager muss man im Template entsprechend eintragen.

    Code
    <tal:portletmanager tal:content="structure provider:[portlet manager name]" />


    Praktisch also für dich Viewletmanager -> Viewlet -> Portletmanager -> Portlet

    in der portlets.xml kannst du standard Portletzuordnungen zu Portletmanagern eintragen, also wäre das der sauberste Weg.

    Das mit dem "schlanken Code" war bloss ein netter Hinweis das es auch noch schlanker geht.

    Gruss Pumukel

    Die beste Informationsquelle sind Leute, die versprochen haben, nichts weiterzuerzählen.

    Marcel Mart
    frz. Schriftsteller

  • hm... also folgendes hab ich bisher gemacht, aber kriege immer den gleich fehler. ist denk ich aber nur ne kleine logische sache:

    browser/configure.zcml

    Code
    <browser:page
     for="plone.portlets.interfaces.ILocalPortletAssignable"
     class="plone.app.portlets.browser.manage.ManageContextualPortlets"
     name="meintheme.portlet_footer"
     template="templates/portlet_footer.pt"
     permission="plone.app.portlets.ManagePortlets"
    />

    browser/interfaces.py

    Code
    class MeinThemePortletFooter(IPortletManager):
        """
            Hier steht die Beschreibung des Portletmanagers
        """

    skins/custom_templates/main_template.pt

    Code
    <metal:portlets>
            <tal:block replace="structure provider:meintheme.portlet_footer" />
        </metal:portlets>

    und letztendlich noch in
    profiles/default/portlets.xml

    XML
    <?xml version="1.0"?>
    <portlets>
     <portletmanager
        name="portlet_footer"
        type="Products.MeinTheme.browser.interfaces.MeinThemePortletFooter"
     />
    </portlets>

    wenn ich nun aber die instanz neu starte und auf die seite gehe, krieg ich immer den folgenden :
    ContentProviderLookupError: portlet_footer

    Was hab ich falsch gemacht?!

  • Hallo,

    drei Fehler sehe ich:

    1. Portlet ist in der configure.zcml registriert der Portletmanager nicht. Das Portlet aber unter dem Namen den du für den Manager vorgesehen hast.

    2. in der Portlets.xml hast du einen nicht registrieren Portletmanager versucht, zu referenzieren.

    3. in der Portlets.xml fehlt das assignment statement für das Portlet zum Manager.

    Gruss Pumukel

    Die beste Informationsquelle sind Leute, die versprochen haben, nichts weiterzuerzählen.

    Marcel Mart
    frz. Schriftsteller

  • zu 1: also muss ich in der configure.zcml den portletmanager registrieren & nicht das portlet? oder beides?

    zu 2: klar, weil ja der manager nicht registriert ist, richtig?

    zu 3: das was fehlt?


    aber vom prinzip her spreche ich im template den PortletManager an.
    Der Manager weißt dann, welche Portlets er hat oder man kann ihm welche über die seite zuordnen, richtig?

    vgf.

  • Hallo,

    also, in der configure.zcml müssen alle viewlets, viewletmanager, portlets und portletmanagers registriert sein.

    assign:

    Code
    <assignment
        manager="plone.portletmanager"
        category="context"
        key="/"
        type="portlets.name"
        name="name"
        />

    Gruss Pumukel

    Die beste Informationsquelle sind Leute, die versprochen haben, nichts weiterzuerzählen.

    Marcel Mart
    frz. Schriftsteller

  • ich zweifel grade echt an mir. könntest du mir einen gefallen tun und mir kurz exemplarisch mal den code niederschreiben? *duck* Das Beispiel auf plone.org klappt ja auch nicht bei mir :(

    ich habe ein viewlet "my.abovecontentviewlet" das ist mit meinem ViewletManager "FooterColumViewletManager" verknüpft.

    In diesem Viewlet möchte ich nun einen zusätzlichen PortletManager unterbringen, weil dort ein Navigationsportlet angezeigt werden soll.

    was kommt in die configure.zcml
    -> verweis auf PortletManager. Wie?

    was muss jetzt in die interfaces.py
    wie muss die portlets.xml aussehen?

    in main_template.pt verweise ich bereits auf das viewlet. erfolgreich sogar :)

    hab ich noch etwas vergessen?

    Ich brauche exemplarisch mal den Code, an dem ich mich dann durchhangeln kann und das Ganze durchblicke.

  • also auch nach stundenlangem googlen, plone-doku und plone-forum(maillists) lesen bin ich nicht weitergekommen, ausser das mehrere leute das gleiche problem hatten. die lösung wurde jedoch nie geschrieben :(