我需要做什麼修改考慮我有一個香草ZopeSkel plone3_portlet formlib生成的包?即:我可以在Plone portlet上使用z3c.form而不是zope.formlib嗎?
- 我應該繼承哪些類?
- 我必須提供哪些掛鉤?
我可以一直使用它,包括five.grok和plone.directives.form?
我需要做什麼修改考慮我有一個香草ZopeSkel plone3_portlet formlib生成的包?即:我可以在Plone portlet上使用z3c.form而不是zope.formlib嗎?
我可以一直使用它,包括five.grok和plone.directives.form?
是的,你可以做到這一點,你需要的是添加/編輯形式...這是我做的一個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 ''
我認爲這在理論上是可行的,是的,但我不確定是否有人試過。這可能是我們在Plone中需要做的一件事情,所以如果你設法讓它工作,它會很棒。
我會先看看現有的portlet表單基類做什麼,然後嘗試在z3c.form中模擬它。我現在也可能會先不用plone.directives.form和plone.autoform,因爲這可能會讓你感到困惑。最好稍後添加。
我懷疑主要的是爲新窗體註冊一個新的默認模板,然後爲每個plone.app.portlets的基本窗體添加一些實際的「添加」和「編輯」操作鉤子。
我相信大衛格利克已經完成了Carousel。他的文檔指向一個known-good set,這對我很有用。
我認爲你一定是錯了;傳送帶不提供任何Portlet。 – 2011-03-03 13:33:24
確實!我在腦海中混淆了它,因爲我正在使用一個Portlet中的Carousel。 – SteveM 2011-03-03 15:57:25
我知道這是一個不完整的答案,但我相信它會指向你正確的方向。 plonezohointegration產品使用z3cforms作爲它的portlet,你可以看看它是如何做到的。
這肯定可以做到的文檔。我們已經在一個4.0 Plone項目中使用了它,其中一個同事分別使用z3c.form.form.AddForm
和z3c.form.form.EditForm
基類創建了基地IPortletAddForm
和IPortletEditForm
實現。
請注意,這是Plone 4.0,而不是3.x,因此您的里程可能會有所不同。
該實現是其zope.formlib原件的基本重新實現,使用簡單的buttonAndHandler處理程序來處理Add(添加表單),Save(編輯表單)和Cancel(兩個)按鈕。
我相信我們有計劃向plone.app.portlets貢獻基礎形式的實現,我會問他。
說同事現在已經發布了代碼本身。 :-) – 2011-03-04 09:20:56
開源的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
剛剛看到user642276的答案指向說明它是如何工作的文檔,http://plone.org/documentation/manual/plone-community-developer-documentation/forms/z3c.form#embedding-z3c-form- form-in-portlets-viewlets-and-views – 2011-03-03 22:15:05
更新以上鍊接 http://docs.plone.org/develop/plone/forms/z3c.form.html#id68 – Dek4nice 2015-05-19 13:00:54
如果你像我一樣已經兩年後發現了這個問題,那麼它可能是方便的知道:
ggozad的解決方案已經融入plone.app.portlets
您仍然需要編寫的portlet他的解決方案之上(這是我 發現很難摸出)
我已經把我的工作代碼 here
的變化,除非你正在使用的Plone 5,你將需要保持 plone.app.portlets < 3.0
一很多信貸的作者this package(注意,這是寫在之前ggozad的解決方案已集成到plone.app.portlets)
更多信息,請訪問:http:// plone .org/documentation/manual/plone-community-developer-documentation/forms/z3c.form#embedding-z3c-form-forms-in-portlets-viewlets-and-views – marcosfromero 2011-03-11 12:12:17
marcosfromero指出的信息是關於做不同的事情,即在一個viewlet中嵌入一個表單。 – ggozad 2011-03-11 12:26:39
不僅是viewlet,還有portlet,因爲它的內容如下: >下面是如何將基於z3c.form的表單放入portlet的示例。 – marcosfromero 2011-03-11 14:19:26