2017-10-06 5 views
1

保存上のカスタム動作と器用コンテンツタイプのカスタム編集フォーム:スキーマで定義されたのPlone:私が持っている

  • 器用のコンテンツタイプ(インターフェース)
  • デフォルトの編集フォーム

I

    現在のフィールドと有効性をそのまま維持します の
  • 追加する新しいフィールド

問題:

  • 私の私は私のコンテンツタイプに保存されていないする新しいフィールドの値が、他の場所インチ

したがって、スキンを変更せずに、保存時にカスタム動作で新しいフィールドを巧妙なコンテンツタイプの編集フォームに追加するにはどうすればよいですか?

簡単な例:フィールド名と年を含むコンテンツタイプの車を持っています...名前と年だけでなく、そのプロデューサの電話番号も編集するように編集したいと思います。プロデューサのコンテンツタイプ)。

マイ(編集フォームを上書きするために解決しますが、どのように続けるには考え)WIP:追加を行うには

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

:あなたは基本DefaultEditFormコードを見つけることができます。ここ

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

from plone.dexterity.browser import edit 

class EditForm(edit.DefaultEditForm): 
    pass 

答えて

1

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)