2

私は Plone 4.3 を使用しており、form.SchemaForm plone.directives には、IEventBasic からの開始フィールドとバリデーターを持つインターフェースがあります。

from datetime import timedelta
from plone.directives import form
from plone.app.contenttypes.interfaces import IEvent
from z3c.form import validator
from zope.component import provideAdapter
from zope.interface import Invalid

class IMyObject(form.SchemaForm)
    my_field_a = schema.TextLine(title='a_field')
    ...

class MyObject(Item):
    implements(IMyObject, IEvent)

class EndMyObjectValidator(validator.SimpleFieldValidator):
    def validate(self,value):
        #code for checking if end field is within a certain range from start field
        if self.end > self.start + timedelta(days=6):
            raise Invalid('The end date is not within range of the start date's week')

validator.WidgetValueDiscriminators(EndMyObjectValidator, field=IEventBasic['end'])
provideAdapter(EndMyObjectValidator)

タイプ ファイル (profiles/default/types の下の my.object.myobject.xml) では、ビヘイビアー セクションにビヘイビアーを配置します。

<behaviors>
    <element value="plone.app.event.dx.behaviors.IEventBasic"/>
</behaviors>

問題は、Event オブジェクトまたは IEventBasic インターフェイス/スキーマを実装するオブジェクトの end フィールドを検証することです。

Plone のドキュメントには、WidgetValueDiscriminators のパラメーター 'view' と 'context' がインターフェイスを受け入れると書かれているので、次のいずれかを行うことができるのではないかと考えました。

validator.WidgetValidatorDiscriminators(EndMyObjectValidator, view=IMyObject, field=IEventBasic['end'])

また

validator.WidgetValidatorDiscriminators(EndMyObjectValidator, context=IMyObject,field=IEventBasic['end']

残念ながら、それらのどれもまったくトリガーしません。コンテキストとビューのパラメーターが実際に何をするかを誤解していると思います。バリデーターが特に MyObject を処理するようにするにはどうすればよいですか?

ソース: http://docs.plone.org/develop/addons/schema-driven-forms/customising-form-b​​ehaviour /validation.html

今のところ私はやっています:

...
from gpcl.container.my_container import MyContainer

...

class EndMyObjectValidator(validator.SimpleFieldValidator):

    def validate(self,value):
        if self.widgets.form.portal_type <> 'my.object.myobject':
            return

        ...

validator.WidgetValueDiscriminators(EndMyObjectValidator, field=IEventBasic['end'])
provideAdapter(EndMyObjectValidator)

更新 2: 無関係な問題のためだったので、以前にコメントを削除しました。タイプの確認方法を変更しました。

4

1 に答える 1