5

考虑到我有一个香草 ZopeSkel plone3_portlet formlib 生成的包,我需要进行哪些修改?IE:

  • 我应该从哪些类继承?
  • 我必须提供哪些挂钩?

我可以一直使用它,包括 Five.grok 和 plone.directives.form 吗?

4

7 回答 7

7

是的,您可以这样做,您需要的是添加/编辑表单...这是我为 Jarn 项目所做的,您可以使用 AddForm 和 EditForm 的方式与使用它们的 formlib 等效项相同:

from Acquisition import aq_parent, aq_inner
from plone.app.portlets import PloneMessageFactory as _
from plone.app.portlets.browser.interfaces import IPortletAddForm
from plone.app.portlets.browser.interfaces import IPortletEditForm
from plone.app.portlets.interfaces import IPortletPermissionChecker
from z3c.form import button
from z3c.form import form
from zope.component import getMultiAdapter
from zope.interface import implements


class AddForm(form.AddForm):
    implements(IPortletAddForm)

    label = _(u"Configure portlet")

    def add(self, object):
        ob = self.context.add(object)
        self._finishedAdd = True
        return ob

    def __call__(self):
        IPortletPermissionChecker(aq_parent(aq_inner(self.context)))()
        return super(AddForm, self).__call__()

    def nextURL(self):
        addview = aq_parent(aq_inner(self.context))
        context = aq_parent(aq_inner(addview))
        url = str(getMultiAdapter((context, self.request),
                                  name=u"absolute_url"))
        return url + '/@@manage-portlets'

    @button.buttonAndHandler(_(u"label_save", default=u"Save"), name='add')
    def handleAdd(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return
        obj = self.createAndAdd(data)
        if obj is not None:
            # mark only as finished if we get the new object
            self._finishedAdd = True

    @button.buttonAndHandler(_(u"label_cancel", default=u"Cancel"),
                             name='cancel_add')
    def handleCancel(self, action):
        nextURL = self.nextURL()
        if nextURL:
            self.request.response.redirect(nextURL)
        return ''


class EditForm(form.EditForm):
    """An edit form for portlets.
    """

    implements(IPortletEditForm)

    label = _(u"Modify portlet")

    def __call__(self):
        IPortletPermissionChecker(aq_parent(aq_inner(self.context)))()
        return super(EditForm, self).__call__()

    def nextURL(self):
        editview = aq_parent(aq_inner(self.context))
        context = aq_parent(aq_inner(editview))
        url = str(getMultiAdapter((context, self.request),
                                  name=u"absolute_url"))
        return url + '/@@manage-portlets'

    @button.buttonAndHandler(_(u"label_save", default=u"Save"), name='apply')
    def handleSave(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return
        changes = self.applyChanges(data)
        if changes:
            self.status = "Changes saved"
        else:
            self.status = "No changes"

        nextURL = self.nextURL()
        if nextURL:
            self.request.response.redirect(self.nextURL())
        return ''

    @button.buttonAndHandler(_(u"label_cancel", default=u"Cancel"),
                             name='cancel_add')
    def handleCancel(self, action):
        nextURL = self.nextURL()
        if nextURL:
            self.request.response.redirect(nextURL)
        return ''
于 2011-03-04T09:19:08.220 回答
3

开源的collective.dancing.browser.portlets.channelsubscribe 模块具有用z3c.form 编写的portlet 实现。

这是一个巨大的混乱。我建议不要用 Plone portlet 做任何花哨的事情,因为它的复杂性会在你的脸上炸毁。

请参阅http://dev.plone.org/collective/browser/collective.dancing/trunk/collective/dancing/browser/portlets/channelsubscribe.pyhttp://pypi.python.org/pypi/collective.dancing

于 2011-03-03T22:12:20.733 回答
2

这当然可以做到。我们已经在 4.0 Plone 项目中使用了它,其中一位同事分别使用和基类创建了一个基类IPortletAddForm和实现。IPortletEditFormz3c.form.form.AddFormz3c.form.form.EditForm

请注意,这是 Plone 4.0,而不是 3.x,因此您的里程可能会有所不同。

该实现是对 zope.formlib 原件的基本重新实现,使用简单的 buttonAndHandler 处理程序来处理 Add(添加表单)、Save(编辑表单)和 Cancel(两者)按钮。

我相信我们有计划将基本表单实现贡献回 plone.app.portlets,我会问他的。

于 2011-03-03T18:18:21.453 回答
2

如果您像我一样在 2 年后发现了这个问题,那么知道这一点可能会很方便:

  1. ggozad 的解决方案已集成到 plone.app.portlets

  2. 您仍然需要在他的解决方案之上编写 portlet(我发现很难解决)

  3. 我在这里整理了我的工作代码的变体

  4. 除非您使用的是 Plone 5,否则您需要保持 plone.app.portlets < 3.0

非常感谢这个包的作者(请注意,这是在 ggozad 的解决方案被集成到 plone.app.portlets 之前编写的)

于 2014-10-10T10:47:19.070 回答
1

我认为这在理论上是可能的,是的,但我不确定是否有人尝试过。这可能是我们需要在 Plone 中做的事情,所以如果你设法让它工作,那就太好了。

我将首先查看现有的 portlet 表单基类做了什么,并尝试在 z3c.form 中模拟它。我也可能暂时不使用 plone.directives.form 和 plone.autoform,因为这可能会让您一开始就感到困惑。最好稍后添加。

我怀疑,主要的事情是为新表单注册一个新的默认模板,然后根据 plone.app.portlets 的基本表单为实际的“添加”和“编辑”操作添加一些钩子。

于 2011-03-02T23:42:37.050 回答
1

我相信 David Glick 已经通过Carousel实现了这一点。他的文档指出了一个对我有用的已知良好的集合

于 2011-03-03T01:48:10.043 回答
1

我知道这是一个不完整的答案,但我相信它会为您指明正确的方向。plonezohointegration 产品将z3cforms用于其 portlet,您可以查看它是如何做到的。

plone 社区开发者文档中有关于如何完成的文档

于 2011-03-03T02:49:09.500 回答