2015-09-03 4 views
3

La valeur par défaut Dextérité ajouter sous forme enregistre le bouton Enregistrer et gestionnaire ainsi:Comment remplacer un gestionnaire d'action de bouton z3c.form?

@button.buttonAndHandler(_('Save'), name='save') 
def handleAdd(self, action): 
    data, errors = self.extractData() 
    if errors: 
     self.status = self.formErrorsMessage 
     return 
    obj = self.createAndAdd(data) 
    if obj is not None: 
     # mark only as finished if we get the new object 
     self._finishedAdd = True 
     IStatusMessage(self.request).addStatusMessage(
      self.success_message, "info" 
     ) 

Comment puis-je remplacer (juste) le gestionnaire avec mon propre? Je préférerais juste enregistrer un adaptateur, mais si l'enregistrement d'un formulaire personnalisé sous-classé est la seule option, alors c'est également acceptable.

Répondre

4

D'après ce que vous avez besoin, il pourrait être suffisant pour juste passer outre createAndAdd, mais vous en général pouvait faire quelque chose de similaire:

En particulier, vous pouvez jouer avec le gestionnaire de la classe d'origine faisant quelque chose de similaire (ligne 50):

@button.buttonAndHandler(_(u'I am sure, delete now'), name='Delete') 
def handle_delete(self, action): 
    base_handler = super(PIDeleteConfirmationForm, self).handle_delete 
    return base_handler(self, action) 

Bien sûr, vous pouvez ajouter votre code personnalisé avant et après l'appel de base_handler.

De plus, vous pouvez également jouer avec la méthode updateActions (voir ligne 28). Rappelez-vous que lorsque vous voulez surclasser des boutons, vous devez les ignorer tous.

Une autre astuce est que, afin de personnaliser votre ++ ajouter ++ your.portal.type transbordeur vous devez vous enregistrer un adaptateur nommé du même nom:

<adapter 
    for="Products.CMFCore.interfaces.IFolderish 
     Products.CMFDefault.interfaces.ICMFDefaultSkin 
     plone.dexterity.interfaces.IDexterityFTI" 
    provides="zope.publisher.interfaces.browser.IBrowserPage" 
    factory=".mytype.AddView" 
    name="your.portal.type" 
/> 

Voir http://docs.plone.org/develop/plone/content/dexterity.html#custom-add-form-view

1

Handlers don » t avoir un enregistrement global (et l'enregistrement local du formulaire est uniquement spécifique au bouton), vous ne pouvez donc pas remplacer uniquement les gestionnaires. Techniquement vous pourriez (au moins pour le formulaire d'édition) remplacer le gestionnaire d'action de bouton par défaut, qui effectue la recherche pour tous les gestionnaires, mais la solution la plus propre est juste de sous-classer et de surcharger le formulaire.