2011-03-02 68 views

回答

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 '' 
+0

更多信息,请访问: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

+0

marcosfromero指出的信息是关于做不同的事情,即在一个viewlet中嵌入一个表单。 – ggozad 2011-03-11 12:26:39

+0

不仅是viewlet,还有portlet,因为它的内容如下: >下面是如何将基于z3c.form的表单放入portlet的示例。 – marcosfromero 2011-03-11 14:19:26

1

我认为这在理论上是可行的,是的,但我不确定是否有人试过。这可能是我们在Plone中需要做的一件事情,所以如果你设法让它工作,它会很棒。

我会先看看现有的portlet表单基类做什么,然后尝试在z3c.form中模拟它。我现在也可能会先不用plone.directives.form和plone.autoform,因为这可能会让你感到困惑。最好稍后添加。

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

1

我相信大卫格利克已经完成了Carousel。他的文档指向一个known-good set,这对我很有用。

+0

我认为你一定是错了;传送带不提供任何Portlet。 – 2011-03-03 13:33:24

+0

确实!我在脑海中混淆了它,因为我正在使用一个Portlet中的Carousel。 – SteveM 2011-03-03 15:57:25

2

这肯定可以做到的文档。我们已经在一个4.0 Plone项目中使用了它,其中一个同事分别使用z3c.form.form.AddFormz3c.form.form.EditForm基类创建了基地IPortletAddFormIPortletEditForm实现。

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

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

我相信我们有计划向plone.app.portlets贡献基础形式的实现,我会问他。

+0

说同事现在已经发布了代码本身。 :-) – 2011-03-04 09:20:56

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.pyhttp://pypi.python.org/pypi/collective.dancing

+1

刚刚看到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

+0

更新以上链接 http://docs.plone.org/develop/plone/forms/z3c.form.html#id68 – Dek4nice 2015-05-19 13:00:54

1

如果你像我一样已经两年后发现了这个问题,那么它可能是方便的知道:

  1. ggozad的解决方案已经融入plone.app.portlets

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

  3. 我已经把我的工作代码 here

  4. 的变化,除非你正在使用的Plone 5,你将需要保持 plone.app.portlets < 3.0

一很多信贷的作者this package(注意,这是写在之前ggozad的解决方案已集成到plone.app.portlets)

相关问题