1

ノート

このスレッドの成功により、提供されたリンクのドキュメントが更新されました。説明されているように、不完全な情報は含まれなくなりました。

plone.portalheader viewletManagerに表示されるビューレットを取得して特定の場所に追加する際に問題が発生します(線形連結を利用していません)。私の目標は、htmlコードを私のhtmlテンプレートモックアップと同じように見せることです。ビューレットの位置を変更する必要はありません。また、これらの要素のいくつかが同じ包括的なマークアップにまとめられることを望んでいます。

私は次のドキュメントを読んでいますが、私の設定(Plone 4.1)と矛盾しているようです:

http://collective-docs.readthedocs.org/en/latest/views/viewlets.html#rendering-viewlets-with-accurate-layout

その特定のページが古くなっているのか間違っているのか(「タブ」へのほとんどの参照がスペースに置き換えられているように見えます。たとえば、<table>現在< le>)、または何か間違ったことをしているのか(過去にはしませんでした)はわかりません。自分)。

例から作成された新しいヘッダーを呼び出したいsomething.header場合、portal_header.ptファイル内で引用が失敗するようです。誰かが例を見て、重要な部分が欠けているかどうか私に知らせてくれるなら、それは私にとって大きな助けになるでしょう。

私のコードを含める:

theme / browser / configure.zcml(部分):

<!-- The portal header -->
<browser:viewlet
    name="plone.header"
    manager="plone.app.layout.viewlets.interfaces.IPortalTop"
    layer=".interfaces.IThemeSpecific"
    class=".header.HeaderViewlet"
    template="templates/portal_header.pt"
    permission="zope2.View"
    />

テーマ/ブラウザ/テンプレート/portal_header.pt:

<header>
    <div class="container_12">
        <div tal:replace="structure provider:theme.header" />
    </div>
</header>

theme / browser / header.py:

from Acquisition import aq_inner
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from plone.app.layout.viewlets import common as base
#import plonetheme.something.browser.viewlets.common as something #left over from original article

def render_viewlet(factory, context, request):
    context = aq_inner(context)
    viewlet = factory(context, request, None, None).__of__(context)
    viewlet.update()
    return viewlet.render()


class HeaderViewlet(base.ViewletBase):
    index = ViewPageTemplateFile('header_items.pt')

    def update(self):
        base.ViewletBase.update(self)
        self.subviewlets = {}

    def renderViewlet(self, viewlet_class):
        return render_viewlet(viewlet_class, self.context, self.request)


    def render(self):
        self.subviewlets["logo"] = self.renderViewlet(base.LogoViewlet)
        self.subviewlets["search"] = self.renderViewlet(base.SearchBoxViewlet)
        return self.index()

theme / browser / header_items.pt:

<header>
    <div class="container_12">
<div tal:replace="structure view/subviewlets/logo" />

<div tal:replace="structure view/subviewlets/search" />
    </div>
</header

上記の記事に従って変更したのはこれだけです。viewlets.xmlを変更する必要があるかどうかわかりません。

この記事について私が理解していることから、header.pyで提供されているクラスを利用してplone.portalheader、portal_header.ptをオーバーライドして置換したいと考えています。theme.headerただし、問題があると思われるviewlets.xmlは変更していません。または、configure.zcmlのビューレットの名前をからに変更せずに置き換えplone.portalheaderているという事実が好きかもしれません。theme.headerplone.headertheme.header

私は解決策であると信じているものについてたくさんの順列を試しましたが、viewlets.xmlを変更しようとしても、何も機能しません。

例に従うと、次のようなエラーメッセージが表示されます。

ContentProviderLookupError(u'theme.header',)
4

1 に答える 1

2

TALプロバイダー:式は、ポートレットマネージャーまたはビューレットマネージャーのみをレンダリングします。ビューレットでは機能しません。そのためrender_viewlet(factory, context, request)、例にはショートカットがあります。

あなたがしたいのは

  • すべてのレイアウトを含むビューレットを作成します(完了、HeaderViewlet)

  • このビューレットをよく知られたビューレットマネージャーに配置します(/ @@ manage-viewletを使用してどちらかを判断します)-これは実行されません

  • 次に、この新しいビューレットで、サブビューレットをレンダリングします。

新しいビューレットマネージャーを作成する必要がある場合(お尻の痛みとくだらない仕事)、ここの指示に従うことができます:

http://opensourcehacker.com/2011/11/29/creating-a-viewlet-manager-in-plone/

于 2012-02-01T21:13:13.780 に答える