def update(self): """ Constructor embedded sub forms """ # Construct few embedded forms self.mobile_form_instance = MobileForm(self.context, self.request) self.publishing_form_instance = PublishingForm(self.context, self.request) # Hide form buttons self.convertToSubForm(self.mobile_form_instance) self.convertToSubForm(self.publishing_form_instance) self.mobile_form_instance.update() self.publishing_form_instance.update() # Override form is present only if the content supports overrideable settings try: self.override_form_instance = getMultiAdapter((self.context, self.request), IOverrideForm) self.override_form_instance.update() self.convertToSubForm(self.override_form_instance) except ComponentLookupError: # This component doesn't support field overrides self.override_form_instance = None z3c.form.form.EditForm.update(self)
class MasterForm(z3c.form.form.EditForm): """ Bring together three different mobile related settings forms. """ name = "mobile-settings" label = _(u"Mobile settings") @button.buttonAndHandler(_('Save'), name='save') def handleSave(self, action): """ Delegate Save button press to individual form handlers. """ # buttonAndHandler decorator has converted the actual button methods to Handler instances # they take arguments (form, action) self.publishing_form_instance.handleApply(self.publishing_form_instance, action) self.mobile_form_instance.handleApply(self.mobile_form_instance, action) if self.override_form_instance is not None: self.override_form_instance.handleApply(self.mobile_form_instance, action) # Make sure no funny redirects happen self.status = self.successMessage def convertToSubForm(self, form_instance): """ Make existing form object behave like subform object. * Do not render <form> frame * Do not render actions @param form_instance: Constructed z3c.form.form.Form object """ # Create mutable copy which you can manipulate form_instance.buttons = copy.deepcopy(form_instance.buttons) # Remove subform action buttons using dictionary style delete for button_id in form_instance.buttons.keys(): del form_instance.buttons[button_id] if HAS_WRAPPER_FORM: # Plone 4 / Plone 3 compatibility zope.interface.alsoProvides(form_instance, IWrappedForm) # Use subform template - this prevents getting embedded <form> # elements inside the master <form> import plone.z3cform from zope.app.pagetemplate import ViewPageTemplateFile as Zope3PageTemplateFile from zope.app.pagetemplate.viewpagetemplatefile import BoundPageTemplate template = Zope3PageTemplateFile('subform.pt', os.path.join(os.path.dirname(plone.z3cform.__file__), "templates")) form_instance.template = BoundPageTemplate(template, form_instance) def update(self): """ Constructor embedded sub forms """ # Construct few embedded forms self.mobile_form_instance = MobileForm(self.context, self.request) self.publishing_form_instance = PublishingForm(self.context, self.request) # Hide form buttons self.convertToSubForm(self.mobile_form_instance) self.convertToSubForm(self.publishing_form_instance) self.mobile_form_instance.update() self.publishing_form_instance.update() # Override form is present only if the content supports overrideable settings try: self.override_form_instance = getMultiAdapter((self.context, self.request), IOverrideForm) self.override_form_instance.update() self.convertToSubForm(self.override_form_instance) except ComponentLookupError: # This component doesn't support field overrides self.override_form_instance = None z3c.form.form.EditForm.update(self)