默认的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 + "%");
}
}
如何用自己覆盖(仅)处理程序?我更喜欢只注册一些适配器,但如果注册一个子类自定义表单是唯一的选择,那么这也是可以接受的。
答案 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)
处理程序没有全局注册(并且表单本地注册只是按钮特定的),因此您不能仅覆盖处理程序。从技术上讲,你可以(至少对于编辑表单)覆盖默认的按钮动作处理程序,它对所有处理程序进行查找,但最干净的解决方案只是子类化并覆盖表单。