質問: フィールドウィジェットが要素を形成しないのはなぜですか? 多くの場合、フォーム要素はフィールドウィジェットから分離していますが、非常によく似た機能を実装しています。この質問のように、それらの機能が2つのapi間を行き来することもあります。 動作しているフィールドウィジェットフォームを単独で表示していますか? フィールドウィジェットがフォーム要素をできるまた、基になるストレージに直接マッピングされることは、私には論理的に思えます、特に、フォームapiはフィールドapiが登場した時点ですでに存在していたためです。なぜこれが当てはまらないのかと思います。編集:以下のkiamlalunoによって指摘されているように、公式ドキュメントによると、ウィジェットはフォームapi要素です、つまり、質問を少し編集する必要があります。coreタグ付けウィジェットをフォーム要素として使用したかったので、これについて不思議に思いました。しかし、私の知る限りでは、簡単な方法はありません。ドキュメントclaimingウィジェットは要素ですが、必ずしもそうであるとは限りません。ウィジェットが次のように宣言されている場合function hook_widget_info() { return array('my_widget' => array( 'base element' => 'some_form_element_machine_name', )) } その場合、要素の定義はウィジェットから分離されるため、両方の方法で使用できますが、現在はそうではありません。編集2:機能のリクエスト opened 。
回答: フィールドウィジェットがフォーム要素である可能性があることは、私にとって当然のことのようです。 ウィジェットはフォーム要素です。フォーム要素にはない追加機能を備えているだけです。 フィールドウィジェットapiに関するドキュメント 次の単語を使用してウィジェットを説明します。 ウィジェットは フォームapi 要素であり、追加の処理機能があります。ウィジェットフックは通常、フィールドアタッチapiによって、フィールドフォーム構造の作成中に field_attach_form() で呼び出されます。 すべてのウィジェットは少なくとも1つのフォーム要素を使用して実装されますが、ウィジェットを実装するモジュールは、フォーム要素から必要とされないいくつかのフックを実装する必要があります。 hook_field_widget_info() hook_field_widget_form() hook_field_widget_error() 最初のものは hook_element_info() と同等と考えることができますが、他の2つはウィジェットが機能するために必要な追加のフックです。ウィジェットがレンダリングされるのは、hook_field_widget_form()に渡された情報のおかげです。drupalはhook_element_info()から返されたプロパティを拡張するウィジェットを実装できたかもしれませんが、実際のところ、ウィジェットとフォーム要素は異なるケースで使用される2つの異なるものです。ウィジェットをより特殊なタイプのフォーム要素と見なします。 ウィジェットに関する情報を返すためにhook_element_info()も使用された場合、ウィジェットを検索するコードは、ウィジェット情報を保持するためにフォーム要素をフィルタリングする必要があります。逆の場合も、フォーム要素を探すコードは、ウィジェット情報を除外する必要があります。その情報がどれほど必要かを考えると、2つの異なるフックが必要なのはそのためです。drupalはhook_field_widget_info()から返された「基本要素」プロパティを使用できた可能性があります。そのようなプロパティが実装されていない場合、それは誰も提案していないか、提案されていることを意味しますが、限られたケースでのみ有用であると考えられていました。drupal 8の場合とは少し異なり、フォーム要素は formelementinterface を実装するクラスのオブジェクトですが、フィールドウィジェットは実装するクラスのオブジェクトです- widgetinterface 。これらのインターフェース間で共通のインターフェースは plugininspectioninterface であり、フォーム要素をレンダリングするためのメソッドを定義していません。代わりに、抽象クラスである renderelement から定義されます。 ウィジェットはクラスで実装されているため、基本ウィジェットは基本的にウィジェットクラスの派生元の基本クラスです。ウィジェットの基本ウィジェットを定義するためのプロパティは必要ありません。