首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重写z3c.form按钮操作处理程序?

如何重写z3c.form按钮操作处理程序?
EN

Stack Overflow用户
提问于 2015-09-03 20:54:18
回答 2查看 282关注 0票数 3

默认的Dexterity add表单注册保存按钮和处理程序,如下所示:

代码语言:javascript
复制
@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"
        )

我怎样才能用我自己的来覆盖(仅仅)处理程序呢?我更喜欢注册一些适配器,但是如果注册一个子类的自定义窗体是唯一的选择,那么这也是可以接受的。

EN

回答 2

Stack Overflow用户

发布于 2015-09-04 05:38:19

根据您的需要,只需覆盖createAndAdd就足够了,但一般来说,您也可以执行类似的操作:

特别是,您可以使用原始类的处理程序来执行类似的操作(第50行):

代码语言:javascript
复制
@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行)。

请记住,当你想要覆盖按钮时,你必须覆盖所有的按钮。

另一个技巧是,为了自定义您的++add++your.portal.type遍历程序,您必须注册一个同名的命名适配器:

代码语言:javascript
复制
<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

票数 4
EN

Stack Overflow用户

发布于 2015-09-04 14:35:21

处理程序没有全局注册(并且窗体本地注册只是特定于按钮的),所以您不能只覆盖处理程序。从技术上讲,您可以(至少对于编辑表单)覆盖默认的按钮操作处理程序,该处理程序执行所有处理程序的查找,但最干净的解决方案是子类化并覆盖表单。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32376253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档