Добавление видов в фиксированные, определенные места в менеджере видов - PullRequest
1 голос
/ 01 февраля 2012

ПРИМЕЧАНИЕ

В связи с успешным завершением этой темы документация по предоставленной ссылке была обновлена.Он больше не содержит неполную информацию, как описано.

У меня проблема с просмотром окон, которые появляются в viewletManager plone.portalheader, и добавлением их в определенные места (без использования линейной конкатенации).Моя цель - сделать HTML-код идентичным моему HTML-шаблону макета.Я не хочу и не требую, чтобы вьюлеты меняли позиции, и я хотел бы, чтобы пара этих элементов оказалась в одной и той же всеобъемлющей разметке.

Я читал следующую документацию, но, похоже,конфликт с моими настройками (это Plone 4.1):

http://collective -docs.readthedocs.org / en / latest / views / viewlets.html # render-viewlets-with-precision-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"
    />

theme / browser / templates / 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.

Исходя из того, что я понимаю в статье, он хочет переопределить и заменить plone.portalheader в portal_header.pt на theme.header, используя класс, предоставленный вheader.py.Тем не менее, я не изменяю viewlets.xml, где, как мне кажется, проблема кроется.Или это может быть связано с тем, что я заменяю plone.portalheader на theme.header, и я не меняю имя представления в файле configure.zcml с plone.header на theme.header.

IЯ пробовал целую кучу перестановок на том, что я считаю решением, и я ничего не могу заставить работать, даже пытаясь изменить viewlets.xml.

Когда я следую примеру, я получаю сообщение об ошибкечто говорит:

ContentProviderLookupError(u'theme.header',)

1 Ответ

2 голосов
/ 02 февраля 2012

Поставщик TAL: выражение будет отображать только менеджеры портлетов или менеджеры представлений.Это не работает с просмотрами.Вот почему в примере есть ярлык render_viewlet(factory, context, request).

Вам нужно

  • создать виджет, который содержит весь ваш макет (готово, HeaderViewlet)

  • поместите этот видовой просмотр в хорошо известный менеджер представления (используйте, чтобы узнать, какой из них / @@ manage-viewlet) - это не сделано

  • затем в этом новом представлении визуализируйте вложенные элементы так, как вы это делаете

Если вам нужно создать новый менеджер представления (тьфу, боль в заднице и дерьмовая работа), вы можете следовать инструкциям здесь:

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

...