考虑到我有一个vanilla ZopeSkel plone3_portlet formlib生成包,我需要做些什么修改?即:
我可以一直使用它,包括five.grok和plone.directives.form?
答案 0 :(得分:7)
是的,你可以这样做,你需要的是添加/编辑表单...这是我为Jarn项目所做的,你可以像使用formlib等价的方式一样使用AddForm和EditForm:
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 ''
答案 1 :(得分:3)
开源的collective.dancing.browser.portlets.channelsubscribe moudle实现了用z3c.form编写的portlet。
虽然这是一个巨大的混乱。我建议不要做任何与Plone portlet有关的事情,因为它的复杂性会在你的脸上大放异彩。
请参阅http://dev.plone.org/collective/browser/collective.dancing/trunk/collective/dancing/browser/portlets/channelsubscribe.py或http://pypi.python.org/pypi/collective.dancing
答案 2 :(得分:2)
这当然可以做到。我们已经在4.0 Plone项目中使用它,其中一位同事分别使用IPortletAddForm
和IPortletEditForm
基类创建了基础z3c.form.form.AddForm
和z3c.form.form.EditForm
实现。
请注意,这是Plone 4.0,而不是3.x,因此您的里程可能会有所不同。
该实现是对zope.formlib原始文件的基本重新实现,使用简单的buttonAndHandler处理程序来处理Add(添加表单),Save(编辑表单)和Cancel(两个)按钮。
我相信我们计划将基础表单实现贡献给plone.app.portlets,我会问他。
答案 3 :(得分:1)
我认为这在理论上是可行的,是的,但我不确定是否有人尝试过它。这可能是我们在Plone中需要做的事情,所以如果你设法让它发挥作用就会很棒。
我首先看一下现有的portlet表单基类的作用,然后尝试在z3c.form中模拟它。我现在也可能从没有plone.directives.form和plone.autoform开始,因为这可能会让你有点困惑。最好稍后添加。
我怀疑,主要的是为新表单注册一个新的默认模板,然后根据plone.app.portlets的基本表单为实际的“添加”和“编辑”操作添加一些钩子。 / p>
答案 4 :(得分:1)
我相信David Glick用Carousel完成了这项工作。他的文档指向known-good set,这对我有用。
答案 5 :(得分:1)
我知道这是一个不完整的答案,但我相信它会指出你正确的方向。 plonezohointegration产品使用z3cforms作为其portlet,你可以看看它是如何做到的。
答案 6 :(得分:1)
如果像我一样,你在2年后发现了这个问题,那么知道这一点可能很方便:
ggozad的解决方案已集成到plone.app.portlets
你仍然需要在他的解决方案之上编写portlet(我 发现难以解决)
我已经整理了我的工作代码的变体 here
除非您使用Plone 5,否则您需要保留 plone.app.portlets< 3.0
this package的作者给予了很多赞誉(请注意,这是在ggozad的解决方案被集成到plone.app.portlets之前编写的)