Вы можете сделать это элегантно с помощью интерфейса маркера и archetypes.schemaextender . Предполагая, что ваша домашняя страница настроена как главная страница на новом сайте Plone - документ сделал вид сайта Plone по умолчанию - добавьте в свой пользовательский продукт interfaces.py
:
class IHomepage(Interface):
"""Marker interface flagging a document as the homepage.
"""
А до configure.zcml
:
<class class="Products.ATContentTypes.interfaces.document.IATDocument">
<allow interface=".interfaces.IHomepage" />
</class>
В ZMI на вкладке Интерфейсы для главной страницы установите IHomepage
в качестве предоставленного интерфейса.
Теперь вы можете зарегистрировать schemaextender, который применяется только к вашему объекту первой страницы.
Создать новый файл schemaextender.py
.
from zope.component import adapts
from zope.interface import implements
from Products.Archetypes import atapi
from archetypes.schemaextender.field import ExtensionField
from archetypes.schemaextender.interfaces import ISchemaExtender
from interfaces import IHomepage
class HomepageBlurbTextField(ExtensionField, atapi.TextField):
"""Extra text for the homepage.
"""
class HomepageExtender(object):
adapts(IHomepage)
implements(ISchemaExtender)
fields = [
HomepageBlurbTextField('blurb',
required=True,
searchable=True,
storage=atapi.AnnotationStorage(),
validators=('isTidyHtmlWithCleanup',),
default_output_type='text/x-html-safe',
widget=atapi.RichWidget(
label=u"Blurb",
description=u"Make the site sound cool.",
rows=25,
allow_file_upload=False),
),
]
def __init__(self, context):
self.context = context
def getFields(self):
return self.fields
Добавить к configure.zcml
:
<adapter factory=".schemaextender.HomepageExtender" />
(Это простой пример; см. Документацию к archetypes.schemaextender, чтобы узнать о более продвинутых функциях, таких как переупорядочение полей, регистрация только для определенного слоя браузера и т.
Перезапустите сайт, отредактируйте первую полосу и - эй presto - новое поле для вашей рекламы.
Теперь все, что вам нужно сделать, это отобразить его. Вы можете делать то, что вам нравится здесь, просто не забудьте зарегистрироваться для вашего IHomepage
интерфейса. Допустим, вы хотели, чтобы объявление появилось в заголовке страницы:
In browser/viewlets.py
:
from Acquisition import aq_inner
from plone.app.layout.viewlets import common
class HomepageHeaderViewlet(common.ViewletBase):
@property
def blurb(self):
context = aq_inner(self.context)
return context.getField('blurb').get(context)
В browser/homepageheader.pt
:
<div id="homepage-blurb" tal:content="structure view/blurb|nothing" />
В browser/configure.zcml
:
<browser:viewlet
name="example.homepageheader"
for="..interfaces.IHomepage"
manager="plone.app.layout.viewlets.interfaces.IPortalTop"
class=".viewlets.HomepageHeaderViewlet"
template="homepageheader.pt"
permission="zope.Public"
/>