4

私は器用さのあるPloneを使用しており、不変デコレータを使用して2つの関連フィールドを検証しています。すべてが機能しますが...一般的なエラーメッセージを1つの特定のフィールドに移動したいと思います。

これどうやってするの?マーティン・アスペリによる3年前の提案を見つけました。それを行うのがいかにクールかについて、次のように述べています。

http://plone.293351.n2.nabble.com/plone-app-form-does-not-display-invariant-errors-td348710.html

しかし、彼らは解決策を思いつきませんでした。

私もそれを行う方法を見つけましたが、それは醜いです:このコードのフォームの更新メソッドに配置します:

for widget in widgets:
    name = widget.context.getName()
    if errors:
        for error in errors:
            if isinstance(error, Invalid) and name in error.args[1:]:
                if widget._error is None:
                    widget._error = error

フィールドの名前を発生したInvalidに渡すことができ、すべてのフィールドと各フィールドのすべてのエラーをループする必要がない、より低いレベルの実装はありませんか?!?

4

1 に答える 1

2

これを行うには、フォームのアクションハンドラーで追加の検証を行い、エラーを表示するウィジェットを指定してWidgetActionExecutionErrorを発生させます。

これは次のようになります(http://plone.org/products/dexterity/documentation/manual/schema-driven-forms/customising-form-b​​ehaviour /validationから取得):

from five import grok
from plone.directives import form

from zope.interface import invariant, Invalid
from zope import schema

from z3c.form import button
from z3c.form.interfaces import ActionExecutionError, WidgetActionExecutionError

from Products.CMFCore.interfaces import ISiteRoot
from Products.statusmessages.interfaces import IStatusMessage

from example.dexterityforms.interfaces import MessageFactory as _


...


class OrderForm(form.SchemaForm):

    ...

    @button.buttonAndHandler(_(u'Order'))
    def handleApply(self, action):
        data, errors = self.extractData()

        # Some additional validation
        if 'address1' in data and 'address2' in data:

            if len(data['address1']) < 2 and len(data['address2']) < 2:
                raise ActionExecutionError(Invalid(_(u"Please provide a valid address")))
            elif len(data['address1']) < 2 and len(data['address2']) > 10:
                raise WidgetActionExecutionError('address2', Invalid(u"Please put the main part of the address in the first field"))

        if errors:
            self.status = self.formErrorsMessage
            return

不変条件からWidgetActionExecutionErrorを発生させることも可能だと思いますが、z3c.formフォームの処理中以外のときに不変条件がチェックされている場合は、希望どおりに動作しない可能性があります。

于 2012-09-27T19:51:13.603 に答える