如何覆盖z3c.form按钮动作处理程序?

时间:2015-09-03 12:54:18

标签: python plone zope dexterity z3c.form

默认的Dexterity添加表单注册了保存按钮和处理程序:

public class EscapedRestrictions {
    public static Criterion ilike(String propertyName, String value) {
        return new EscapedILikeExpression(propertyName, value);
    }

    public static Criterion ilike(String propertyName, String value, MatchMode matchMode) {
        return new EscapedILikeExpression(propertyName, value, matchMode);
    }
}

class EscapedILikeExpression extends IlikeExpression {
    private static final String HIBERNATE_ESCAPE_CHAR = "\\";

    public EscapedILikeExpression(String propertyName, Object value) {
        super(propertyName, value);
    }

    public EscapedILikeExpression(String propertyName, String value, MatchMode matchMode) {
        super(propertyName, replaceAll(value), matchMode);
    }

    private static String replaceAll(String value) {
        return value
                .replace("\\",  HIBERNATE_ESCAPE_CHAR + "\\")
                .replace("_",   HIBERNATE_ESCAPE_CHAR + "_")
                .replace("%",   HIBERNATE_ESCAPE_CHAR + "%");

    }
}

如何用自己覆盖(仅)处理程序?我更喜欢只注册一些适配器,但如果注册一个子类自定义表单是唯一的选择,那么这也是可以接受的。

2 个答案:

答案 0 :(得分: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按钮时,你必须覆盖所有按钮。

另一个提示是,为了自定义你的++ 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

答案 1 :(得分:1)

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