フィールドウィジェットが要素を形成しないのはなぜですか?


11

多くの場合、フォーム要素はフィールドウィジェットから分離していますが、非常によく似た機能を実装しています。

この質問のように、それらの機能が2つのAPI間を行き来することもあります。有効なフィールドウィジェットフォームを単独で表示することは可能ですか?

フィールドができウィジェットように私には論理的と思われることがあること、フォーム要素フィールドAPIは約来たときに、フォームのAPIがすでに適所にいた、特に以来、いくつかの基本的なストレージに直接マッピングするために起こります。

なぜこれが当てはまらないのかと思います。

編集: 以下のkiamlalunoで指摘されているように、公式ドキュメントによると、ウィジェットフォームAPI要素です。つまり、質問を少し編集する必要があります。

Coreタグ付けウィジェットをフォーム要素として使用したかったので、これについて不思議に思いました。しかし、私の知る限りでは、簡単な方法はありません。ウィジェットが要素であると主張するドキュメントにもかかわらず、それは必ずしも本当であるようには見えません。

ウィジェットが次のように宣言されている場合

function hook_widget_info() {
  return array('my_widget' => array(
    'base element' => 'some_form_element_machine_name',
  ))
}

その場合、要素の定義はウィジェットから分離されるため、両方の方法で使用できますが、現在はそうではありません。

編集2: 機能リクエストがオープンしました


Drupal 8では、ウィジェットがクラスで実装されるようになりました。基本ウィジェットは基本的に、ウィジェットクラスの派生元のクラスです。
kiamlaluno

同様の質問は、「なぜタクシーは車ではないのですか?」または「なぜ道路はアスファルトの断片ではないのですか?」または「なぜ本は小説ではないのですか?」。本は小説になることもありますが、同じ小説がデジタルストレージに存在することもあります。あるいは、他の小説と一緒に、より大きな本に住むこともできます。本には、たとえ1つの小説が含まれていても、その内容に依存しないいくつかの物理的特性があります。
donquixote 2016年

回答:


11

フィールドウィジェットがフォーム要素である可能性があることは、私にとって当然のようです。

ウィジェットはフォーム要素です。フォーム要素にはない追加機能を備えているだけです。フィールドウィジェットAPIに関するドキュメントでは、次の単語を使用してウィジェットについて説明しています。

ウィジェットは、追加の処理機能を持つフォームAPI要素です。ウィジェットフックは、通常、field_attach_form()使用してフィールドフォーム構造を作成するときに、フィールドアタッチAPIによって呼び出されます。

すべてのウィジェットは少なくとも1つのフォーム要素を使用して実装されますが、ウィジェットを実装するモジュールは、フォーム要素から必要とされないいくつかのフックを実装する必要があります。

最初のものは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。代わりに、抽象クラスであるから定義されています。
現在、ウィジェットはクラスで実装されているため、基本ウィジェットは基本的にウィジェットクラスの派生元の基本クラスです。ウィジェットの基本ウィジェットを定義するためのプロパティは必要ありません。


非常に興味深い、私はこれを知りませんでした。+1。しかしながら、あなたが私をより混乱させたので、私は私の質問を更新しました;)
Letharion '17

機能リクエストを開きました。:)
Letharion、2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.