Plone,从表单创建一个viewlet

时间:2011-06-11 20:50:43

标签: plone

我有一段HTML内容,我不断在主页上更新。理想情况下,我想转到页面,填写表单,并将表单数据填充到HTML片段(viewlet?)

对任何建议持开放态度。 (创建自定义内容类型,使用mysql db填充它。任何东西!)

2 个答案:

答案 0 :(得分:2)

您可以使用标记界面和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界面。假设您希望blurb出现在页面的标题中:

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"
    />

答案 1 :(得分:0)

这取决于你的用例,但通常你可以使用带有几个静态文本portlet的collective.portletpage之类的代码来创建你想要的页面。使用plone.app.theming,您可以根据需要重新设置html。

例如我们的新主页http://www.pretaweb.com是使用plone.app.theming,collective.portletpage和Products.ContentWellPortlets完成的。

Products.Collage是我们也使用过的portletpage的另一种替代方法。