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)