首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在viewlet管理器中将视图添加到固定的特定位置。

在viewlet管理器中将视图添加到固定的特定位置。
EN

Stack Overflow用户
提问于 2012-01-31 20:53:51
回答 1查看 1.1K关注 0票数 1

注记

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

我在获取出现在plone.portalheader viewletManager中的视图并将它们添加到特定位置时遇到了问题(没有使用线性级联)。我的目标是使html代码看起来与我的html模板模型相同。我不想也不需要视图来改变位置,我希望看到其中的几个元素在相同的总体标记中结束。

我一直在阅读以下文档,但它似乎与我的设置(即Plone 4.1)相冲突:

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

我不确定那个特定的页面是过时的还是不正确的(看起来大多数对"tab“的引用都被空格所取代了。<table>现在是< le>),或者如果我做错了什么事情(我不会忘记它)。

看起来,当我想调用从示例中创建的新头时,引用something.header在我的portal_header.pt文件中失败。如果有人能看到这个例子,并让我知道是否有任何重要的部分缺失,这将是一个巨大的帮助我。

包括我的代码:

主题/browser/figurre.zcml(部分):

代码语言:javascript
运行
复制
<!-- 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"
    />

主题/浏览器/模板/门户_Header.pt:

代码语言:javascript
运行
复制
<header>
    <div class="container_12">
        <div tal:replace="structure provider:theme.header" />
    </div>
</header>

主题/浏览器/header.py.:

代码语言:javascript
运行
复制
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()

主题/browser/header_items.pt:

代码语言:javascript
运行
复制
<header>
    <div class="container_12">
<div tal:replace="structure view/subviewlets/logo" />

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

这就是我根据上面列出的文章所做的全部修改。我不确定是否应该修改viewlets.xml。

根据我对本文的理解,它希望通过使用plone.portalheader中提供的类来覆盖portal_header.pt中的theme.header并将其替换为theme.header。然而,我并不是在修改viewlets.xml,因为我认为问题就在这里。或者,我要用theme.header代替theme.header,并且不会将configure.zcml中的视图名称从plone.header更改为theme.header

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

当我遵循这个例子时,我会收到一条错误消息,上面写着:

代码语言:javascript
运行
复制
ContentProviderLookupError(u'theme.header',)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-01 21:13:13

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

你想要的是

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

  • place此视图在众所周知的视图管理器中)(使用/@@

  • - viewlet确定哪个)--这不是

  • ,然后在这个新的视图中呈现子视图,就像使用

一样。

如果您需要创建一个新的视图管理器(嗯,屁股上的痛苦和糟糕的工作),您可以按照这里的说明:

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9086777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档