Drupal のコアには、優れた Contact モジュールがあります。Contact モジュールは Webform モジュールにほぼ匹敵します。それでは、サイト用のフィードバックフォームを作る方法を見ていきましょう。
Contact が有効になっていない場合は、有効にします。
Contact にはすでにフィードバックフォームがあります。次の場所にあります:
/contact

このフォームを、もっとフィードバックフォームらしく変更しましょう。そのために、contact フォームを設定するページ Structure -> Contact forms に移動します。
/admin/structure/contact
ユーザーは Drupal の主要機能の 1 つで、ユーザーを作成・削除できます。サイト上のユーザーはコメント、レビュー、素材を残します。Drupal にはユーザーモデレーションシステムがあります。そしてこれは Drupal の機能の一部にすぎないので、これらすべてを管理するために Drupal の管理パネルを理解する必要があります。
Account settings に移動しましょう:

リレーションシップは Drupal の非常に重要な部分です。これによって、タクソノミー用語とコンテンツ、ユーザーとコンテンツ、商品と commerce での商品の表示が結び付けられます。おかげで、素材のフィールドを表示する際にユーザーフィールドを表示したり、商品を表示する際にその価格や品番を表示したりできます。
おかげで、素材のフィールドを表示する際にユーザーフィールドを表示したり、商品を表示する際にその価格や品番を表示したりできます。

ブロック内で、私たちがいるページの素材を作成したユーザーに関する情報を表示するビューを作成しましょう。前のレッスンの 1 つで、コンテキストフィルターを使い、私たちがいるページに関する情報を表示する方法をすでに理解しました:
すでに Form API、Fields API を理解し、Drupal のデータがどのようにデータベースに入るかも分かっています。次に、すべての Drupal サイトの基盤、すなわち Entity API を見ていきましょう。
おそらく、フィールドはそれ自体で存在するのではなく、エンティティ――ノード、ブロック、タクソノミー用語、ビューなど――に「付加」されていることにお気づきでしょう。バンドルエンティティ、例えば素材タイプ、ブロックタイプ、タクソノミー辞書を作成できます。しかし、独自のバンドルを持つ新しいエンティティを作成する必要がある場合はどうでしょうか?その場合、新しいエンティティを作成するために Entity API が必要になります。
すべてのコードを github の drupalbook_product モジュールに追加しました。モジュールをダウンロードして、私のウェブサイトに追加できます:
エンティティのフィールド値を取得するのはかなり簡単ですが、これを行う方法はいくつかあります。カスタムコードでフィールド値を扱う最善の方法を見ていきましょう。フィールドの扱いに関する最新情報は、いつでも公式ウェブサイトで確認できます:
https://www.drupal.org/docs/8/api/entity-api/working-with-the-entity-api
この記事では、値を扱う例を見ていきます。
特定のフィールドがどう動作するかを覚える必要はありません。いつでもこのページに戻って思い出せます。時間が経つにつれ、ますますドキュメントを参照するようになり、Drupal でフィールドを扱うのがいかに簡単かに気づくでしょう。それまでは、このページをブックマークして、いつでもチートシートを手元に置けます。
ノードの操作
nid でノードを読み込む:
Drupal でのエンティティの操作は統一されており、すべての CRUD 操作もすべてのエンティティで同じです。この記事では、カスタムコードでエンティティを扱う方法を理解します。
まず簡単な例を見てみましょう。
プログラムでノードを作成する
use \Drupal\node\Entity\Node;
$node = Node::create([
'type' => 'article',
'title' => 'Druplicon test',
]);
$node->save();
ノードを作成するには、必須のすべてのフィールドを追加する必要があります。デフォルトでは Title フィールドだけです。作成後にノードオブジェクトにアクセスすることもできます:
過去の記事で、すでにフックに触れました。この記事では、エンティティを扱うのに役立つフックをより詳しく見ていきます。
フックとは何か、なぜ必要なのかは、この記事で全般的に読むことができます:
http://drupalbook.org/drupal/92-what-hook-drupal-8
エンティティに関連する特定のイベント――追加、削除、更新――で発火する独自のカスタムコードを追加するためにフックを使います。
すべての Drupal フックはこのページで見られます:
https://api.drupal.org/api/drupal/core!core.api.php/group/hooks/8.2.x
そのうち、コンテンツを扱うカスタムモジュールで最もよく見られる一部だけを扱います。
イベントシステムを使うと、特定のイベントに対してカスタムコードで機能を変更できる、より複雑なシステムを構築できます。Drupal 7 の多くのフックがイベントに置き換えられました。これにより、Drupal の多くの部分と追加の contrib モジュールの動作を統一できました。イベントシステム自体は Symfony から来ており、次の部分で構成されています:
Event Subscribers - 特定のイベントへの「サブスクライバー」は、特定のイベントで発火する関数やメソッドです。コードでは、次のクラスを実装するクラスです:
\Symfony\Component\EventDispatcher\EventSubscriberInterface
Event Registry - Event Subscribers の発火の順序に従って収集・ソートします。サブスクライバーのレジストリは、イベント名とイベントの優先度(順序)のキーと値の配列として Event Dispatcher オブジェクトに保存されます。イベントがサービスとして登録されると、そのイベントはグローバルに利用可能なディスパッチャーとして登録されます。
この記事では、フィールドの表示を編集してページに表示できる Field Formatters を検討します。
過去の記事で、Link フィールドタイプを作成しました。この記事では、これらのフィールドがページにどう表示されるか、そしてどのクラスがそれを担当するかを見ていきます。Drupal を通じて追加する各フィールドは、ページに表示でき、Manage display ページでその設定を編集できます。

Format 列で、フィールドの表示方法を選べます。この列は Field Formatter クラスによって形成されます。ページへのリンクを表示する Link モジュールのクラスを見てみましょう:
Drupal モジュールの開発で実行するのはよくあるケースです。可能な場合は entityQuery を使うべきですが、より高度なデータを取得するために SQL クエリを使う必要があることもあります。
Drupal で select、insert、update、delete の MySQL クエリを実行する方法のチートシートをいつでも手元に置けるように、このページをブックマークに追加できます。
Select
単一の値を取得する:
$query = \Drupal::database()->select('node_field_data', 'n');
$query->addField('n', 'nid');
$query->condition('n.title', 'About Us');
$query->range(0, 1);
$nid = $query->execute()->fetchField();
エントリーを配列で取得する: