2017-10-06 52 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)