首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在Plone portlet上使用z3c.form而不是zope.formlib吗?

我可以在Plone portlet上使用z3c.form而不是zope.formlib吗?
EN

Stack Overflow用户
提问于 2011-03-02 23:39:28
回答 7查看 1.3K关注 0票数 5

考虑到我有一个普通的ZopeSkel plone3_portlet formlib生成包,我需要做哪些修改?Ie:

  • 我应该从哪个类继承?
  • 我必须提供哪一个钩子?

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-03-04 09:19:08

是的,你可以这样做,你需要的是添加/编辑表单.下面是我为一个Jarn项目所做的工作,您可以使用AddForm和EditForm,就像使用它们的formlib等价物一样:

代码语言:javascript
复制
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 ''
票数 7
EN

Stack Overflow用户

发布于 2011-03-03 22:12:20

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

不过,这是个大烂摊子。我建议不要对portlets做任何花哨的事情,因为它的复杂性会在你面前大爆炸。

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

票数 3
EN

Stack Overflow用户

发布于 2011-03-03 18:18:21

这当然是可以做到的。我们已经在一个4.0plone项目中使用了这一点,其中一位同事分别使用IPortletAddFormz3c.form.form.EditForm基类创建了一个基本的z3c.form.form.AddFormz3c.form.form.EditForm实现。

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

该实现是它们的zope.formlib原始文件的基本重新实现,有简单的buttonAndHandler处理程序来处理Add (add )、Save (编辑表单)和Cancel (两者都)按钮。

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

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

https://stackoverflow.com/questions/5174905

复制
相关文章

相似问题

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