1

笔记

由于此线程的成功结果,提供的链接中的文档已更新。它不再包含所描述的不完整信息。

我在获取出现在 plone.portalheader viewletManager 中的 viewlet 并将它们添加到特定位置(不使用线性连接)时遇到问题。我的目标是使 html 代码看起来与我的 html 模板模型相同。我不希望也不要求 viewlet 改变位置,我希望看到其中的几个元素最终出现在同一个总体标记中。

我一直在阅读以下文档,但它似乎与我的设置(即 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 文件中引用失败。如果有人可以观察这个例子并让我知道是否缺少任何重要部分,那对我来说将是一个巨大的帮助。

包括我的代码:

主题/浏览器/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>

主题/浏览器/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()

主题/浏览器/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.portalheaderportal_header.pt中的内容。theme.header但是,我没有修改 viewlets.xml,这是我认为问题所在。或者它可能喜欢我正在替换的事实,plone.portalheader并且theme.header我没有将 configure.zcml 中的 viewlet 的名称从plone.headerto更改为theme.header

我已经尝试了一大堆我认为是解决方案的排列,但我无法得到任何工作,甚至尝试修改 viewlets.xml。

当我按照示例进行操作时,我收到一条错误消息,内容为:

ContentProviderLookupError(u'theme.header',)
4

1 回答 1

2

TAL 提供者:表达式只会呈现 portlet 管理器或 viewlet 管理器。它不适用于视图。这就是示例中有render_viewlet(factory, context, request)快捷方式的原因。

你想要的是

  • 创建一个包含所有布局的视图(完成,HeaderViewlet)

  • 将此 viewlet 放在众所周知的 viewlet 管理器中(使用 /@@manage-viewlet 找出哪个) - 这还没有完成

  • 然后像你一样在这个新的视图中渲染子视图

如果您需要创建一个新的 viewlet 管理器(呃,屁股和糟糕的工作很痛苦),您可以按照此处的说明进行操作:

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

于 2012-02-01T21:13:13.780 回答