9.10.1. Drupal Fields API。Field Widget:データ入力フィールド、フィールド用のフォーム。
このチュートリアルでは、Link モジュールの Field Widget がどう動作するかを見ていきます。これは概説記事なので、独自の Field Widget を書き始めたい場合は、続く記事に進んでください。
前のレッスンでは、ノードとブロックに Link フィールドを追加しました。次に、Link フィールドのフォームが何によって形成されるかを見てみましょう。
Drupal での PHP クラスのオートロードにはすでに触れました。また、フィールド用の WidgetBase フィールドウィジェットクラスもあります:
core/lib/Drupal/Core/Field/WidgetBase.php
モジュールで新しい子クラスを作成し、それを src/Plugin/Field/FieldWidget に置くと、クラスが自動的に接続され、フィールドに使えます。Link フィールドのウィジェットクラスを見てみましょう:
core/modules/link/src/Plugin/Field/FieldWidget/LinkWidget.php
クラスのアノテーションには、このウィジェットが使えるフィールドタイプが含まれています:
/**
* Plugin implementation of the 'link' widget.
*
* @FieldWidget(
* id = "link_default",
* label = @Translation("Link"),
* field_types = {
* "link"
* }
* )
*/
このようにして、既存のフィールド用にカスタムモジュールに新しいフィールドウィジェットを追加できます。
それでは、formElement() メソッドに移りましょう。これはおそらく主要なウィジェットメソッドの 1 つで、Form API を通じてフォーム要素が追加されます。Link ウィジェットには 3 つの要素があります:
$element['title']
$element['uri']
$element['attributes']
これらのフィールドは、ノードやブロックのフォームでデータを入力するために使われます。フィールドには検証も追加されます。というのも、例えば URI フィールドは正しい URL またはローカルサイトのアドレスを含まなければならないからです。
また、重要なメソッドの 1 つが settingsForm() です。これは、Manage form ページで見られるカスタマイズフォームを担当します:

Field Widget の他のすべてのメソッドは任意です。各メソッドについて詳しくは触れません。カスタムモジュールを書くのに必ずしも使われるわけではないからです。contrib モジュールを書く場合、親クラスのメソッドの説明を読むのは難しくないと思います:
core/lib/Drupal/Core/Field/WidgetBase.php
フィールド用のすべての Field Widget は、各バンドルエンティティごとに Manage form display タブで個別に構成されます:
