簡體   English   中英

如何覆蓋z3c.form按鈕動作處理程序?

[英]How to override a z3c.form button action handler?

默認的Dexterity添加表單注冊了保存按鈕和處理程序:

@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"
        )

我怎樣才能用我自己覆蓋(只)處理程序? 我寧願只注冊一些適配器,但如果注冊子類自定義表單是唯一的選擇,那么這也是可以接受的。

根據你的需要,覆蓋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按鈕時,您必須覆蓋所有按鈕。

另一個提示是,為了自定義你的++ add ++ 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

處理程序沒有全局注冊(表單本地注冊只是按鈕特定),因此您不能只覆蓋處理程序。 從技術上講,你可以(至少對於編輯形式)覆蓋默認的按鈕動作處理程序,它對所有處理程序進行查找,但最干凈的解決方案只是子類化並覆蓋表單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM