2015-09-03 3 views
3

по умолчанию сноровка добавить форму регистрирует кнопку и обработчик, таким образом, сохранить:Как переопределить обработчик действий кнопки 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" 
     ) 

Как я могу переопределить (только) обработчик с моей? Я бы предпочел просто зарегистрировать какой-либо адаптер, но если регистрация пользовательской формы подкласса является единственным вариантом, то это тоже приемлемо.

ответ

4

Согласно тому, что вам нужно, это может быть достаточно просто переопределить createAndAdd, но вообще говоря, вы могли бы сделать что-то подобное:

В частности, вы можете играть с обработчиком первоначальный класс делает что-то подобное (строка 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) 

Конечно, вы можете добавить свой собственный код до и после вызова base_handler.

Кроме того, вы также можете играть с методом updateActions (см. Строку 28).

Помните, что если вы хотите использовать кнопки ovverride, вы должны переопределить их все.

Еще один совет заключается в том, для того, чтобы настроить ваш ++ добавить ++ your.portal.type у вас есть транспортер зарегистрировать одноименный с именем адаптер:

<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" 
/> 

Посмотреть http://docs.plone.org/develop/plone/content/dexterity.html#custom-add-form-view

1

Хендлеров Дона» t имеют глобальную регистрацию (и форма локальной регистрации - только кнопка), поэтому вы не можете переопределять только обработчики. Технически вы можете (по крайней мере, для формы редактирования) переопределить обработчик действия кнопки по умолчанию, который выполняет поиск всех обработчиков, но самое чистое решение - это просто подкласс и переопределение формы.

Смежные вопросы