2017-10-06 153 views
1

我有一個自定義行爲靈巧內容類型的自定義編輯表單:Plone的:對保存

  • 的架構(接口)
  • 其默認的編輯形式

我定義了一個靈巧的內容類型試圖自定義編輯表格:

  • 保持當前字段和驗證,因爲它們是
  • 添加新字段

問題:

  • 我對新的領域我想不被保存在我的內容類型的值,但在其他地方。

那麼,如何在靈活內容類型的編輯形式中添加新字段而不更改其架構並保存自定義行爲?

簡單的例子:有一個內容類型汽車的字段名稱和年份...我想編輯不僅要編輯名稱和年份,而且還要編輯其製造商的電話號碼(要保存爲值保存生產者內容類型)。

我WIP(解決覆蓋編輯的形式,但不知道如何繼續):

<browser:page 
    for=".IMyContentType" 
    name="edit" 
    class=".views.EditForm" 
    permission="cmf.ModifyPortalContent" 
    /> 

from plone.dexterity.browser import edit 

class EditForm(edit.DefaultEditForm): 
    pass 

回答

1

在這裏你可以找到基本DefaultEditForm代碼:

https://github.com/plone/plone.dexterity/blob/master/plone/dexterity/browser/edit.py#L20

加做您需要重寫handleApply方法的操作(如果要將字段值保存爲實際內容類型,則保留默認操作),並提供附加代碼。

如果要添加其他字段,可以覆蓋提供這些附加字段的fields屬性,或使用updateWidgets和updateFields方法添加這些字段。這裏有一些文檔:

https://docs.plone.org/external/plone.app.dexterity/docs/advanced/custom-add-and-edit-forms.html#edit-forms

+1

如果你有一個代碼示例,那將是巨大的在這裏補充(或在文檔中),歡呼聲。 –

0

更好地利用handleApply,但這是工作,太:

<browser:page 
    for="my.package.IMyContentType" 
    name="edit" 
    class=".EditForm" 
    permission="zope2.View" 
    /> 

    <adapter 
    provides="plone.z3cform.fieldsets.interfaces.IFormExtender" 
    for="my.package.IMyContentType 
    zope.publisher.interfaces.browser.IDefaultBrowserLayer 
    .EditForm" 
    factory=".EditFormExtender" 
    /> 

from my.package.config import MessageFactory as _ 
from plone.dexterity.browser import edit 
from plone.dexterity.interfaces import IDexterityEditForm 
from plone.z3cform import layout 
from zope.interface import classImplements 
from plone.z3cform.fieldsets.extensible import FormExtender 
from z3c.form.field import Fields 
from z3c.form import util 
from zope import schema 


class EditFormExtender(FormExtender): 
    def update(self): 
     if self.request.REQUEST_METHOD == 'GET': 
      # add fields 
      new_field1 = schema.TextLine(
       __name__="New field 1", 
       title=_(u'label_new_field1', default=u'New field 1'), 
       description=_(u'help_new_field1', 
           default=u'Enter new field 1 value.'), 
       required=False, 
      ) 

      new_field2 = schema.TextLine(
       __name__="New field 2", 
       title=_(u'label_new_field2', default=u'New field 2'), 
       description=_(u'help_new_field2', 
           default=u'Enter new field 2 value.'), 
       required=False, 
      ) 

      self.form.fields += Fields(new_field1, new_field2) 

     if self.request.REQUEST_METHOD == 'POST': 
      # save values 
      if 'form.buttons.save' in self.request.form: 
       # do your custom save here 

       prefix = 'form.widgets.' 
       field_names = ['new_field1', 'new_field2'] 
       print "UPDATED:" 
       for field_name in field_names: 
        print self.request.form.get(prefix + field_name) 


class EditForm(edit.DefaultEditForm): 
    """ Override MyContentType edit form 
    """ 


EditView = layout.wrap_form(EditForm) 
classImplements(EditView, IDexterityEditForm)