2

z3c.form https://github.com/collective/Products.UserAndGroupSelectionWidget/blob/z3cform-widget/src/Products/UserAndGroupSelectionWidget/z3cform/widget.pyに基づく次のウィジェットを指定

一部のブラウザビューで、その設定と対応するフィールドにアクセスしたいと思います。ウィジェットは事前にスキーマとフィールドを認識していないため、ウィジェットとフィールドを取得するために必要な情報に興味があります。現在、私はフィールド名とコンテキストを利用できます。これは、アーチタイプに十分であるように思われました

編集:質問を簡単にするために、 z3c フォームとそのウィジェットで定義されているフィールドにアクセスしたいと思います。リクエストとコンテキストをフォームinitに渡してからフィールドにアクセスする以外に、他の方法を見つけることができませんでした。マルチアダプターはありますか?

アイデアは、人々が ajax 呼び出しを行う任意のフィールドにフックする z3c.form ウィジェットを用意することです。その ajax リクエストはパラメーターを渡す必要があり、応答はウィジェットが使用された場所と設定を検索します。問題は、z3c.form フィールドを検索する方法と、そのために必要な情報はどれかということです。

4

1 に答える 1

5

フィールドの取得

スキーマを取得できれば、フィールドを取得できます。

器用さコンテンツ タイプの場合、フィールド名とタイプの portal_type がわかっている場合は、タイプのファクトリ タイプ情報( FTI ) からスキーマを取得できます。

したがって、 portal_typefield_nameがわかっている場合:

from zope.component import getUtility
from plone.dexterity.interfaces import IDexterityFTI
fti = getUtility(IDexterityFTI, name=portal_type)
schema = fti.lookupSchema()
field = schema.get(field_name)

ウィジェットを取得する

z3c.form ドキュメントから: http://packages.python.org/z3c.form/widget.html

ウィジェットはマルチアダプターなので、フィールドがある場合は次のように取得できます。

ageWidget = zope.component.getMultiAdapter((field, request),
    interfaces.IFieldWidget)

重要: plone.autoformでウィジェットを指定した場合、そのウィジェットは取得されません。plone.autoformは手動でz3c.form.field.FieldオブジェクトにwidgetFactoryを設定します (これはzope.schemaフィールドと同じではありません!)。その場合、ウィジェットを取得する最良の方法は、FieldWidgetの開始を手動で呼び出すことによって、既に行ったことです。

たとえば、UserAndGroupSelectionWidgetが必要な場合:

widget = FieldWidget(field, UserAndGroupSelectionWidget(field, request))

PS 私もコレクティブに参加しており、ピッカー ウィジェットを使用しているため、コードを更新しました;)

于 2011-12-14T15:00:42.427 に答える