ホームページ > バックエンド開発 > PHPチュートリアル > Drupal 8でカスタムフィールドフォーマッタを作成します

Drupal 8でカスタムフィールドフォーマッタを作成します

Jennifer Aniston
リリース: 2025-02-18 08:42:11
オリジナル
760 人が閲覧しました

Drupal 8でカスタムフィールドフォーマッタを作成します

キーテイクアウト

  • Drupal 8でカスタムフィールドフォーマッタを作成するには、デフォルトのImageFormatterプラグインから拡張されたカスタムモジュールのSRC/プラグイン/フィールド/フィールドフォーマッタディレクトリで新しいフォーマッタクラスを定義することが含まれます。
  • 新しいFormatterクラスは、ViewElements()メソッドをオーバーライドして、フィールドデータのレンダリング配列を返す必要があります。
  • 新しいテーマ、image_title_caption_formatterは、モジュールの.moduleファイルで作成され、デフォルトのimage_formatterテーマと同じ変数が渡されます。 カスタムフィールドフォーマッタは、コンテンツタイプの「ディスプレイの管理」タブを介してDrupal 8のフィールドに適用でき、「フォーマット」ドロップダウンからカスタムフォーマッタを選択できます。
  • 開発プロセスのために、Drupal 8が執筆時点で受けているため、コードの一部が時代遅れになっている可能性があることに注意してください。このリポジトリをご覧ください。このリポジトリでは、サンプルコードを更新し、最新のDrupal 8リリースで動作させようとしています。
  • 注釈付きプラグインの導入により、Drupal 8では多くの変化があります。コアを拡張する機能性を説明および発見するためのより合理化されたアプローチがあります。他の多くのコンポーネントに加えて、以前のフィールドAPI(大規模および統合されたエンティティAPIの一部)は、プラグインに基づいています。
このチュートリアルでは、既存のフィールド(画像)のカスタムフィールドフォーマッタを定義することを行います。私たちが達成したいのは、その下に小さなキャプションが付いた画像を表示できるようにすることです。このキャプションは、存在する場合、画像に割り当てられたタイトル値になります。 ここに書くコードは、このリポジトリにImage_title_captionモジュールとして見つけることができます。しかし、その最終結果にどのように到達できるか見てみましょう。

Drupalモジュール

Drupal 8でカスタムフィールドフォーマッタを作成します 1つのファイルのみで新しいカスタムモジュール(image_title_caption)を作成することから始めましょう。

image_title_caption.info.yml:

ここでは普通のことは何もありません。必要に応じて、すでにモジュールを有効にすることもできます。

プラグイン

Drupal 8では、フィールドフォーマッタ(フィールドタイプやウィジェット自体など)がプラグインです。コアのものは、コアモジュールによって定義されているか、DrupalCoreFieldPluginFieldFieldFiledFormation Namespace内に見つけることができます。また、カスタムブロックを調べた以前の記事で見たように、プラグインはモジュールのSRC/プラグイン/フォルダー内に入ります。フィールドフォーマッタの場合、これはSRC/Plugin/Field/FieldFormatterディレクトリになります。

以下では、私たち自身のフォーマッタクラス:

を見ることができます

src/plugin/field/fieldformatter/imagetitlecaption.php:
name: Image title caption
type: module
description: Uses the image title field as a caption
core: 8.x
dependencies:
  - image
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
name: Image title caption
type: module
description: Uses the image title field as a caption
core: 8.x
dependencies:
  - image
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これは私たちのプラグインです。それには何もありません。クラス宣言の上に、プラグインが発見される@FieldFormatterアノテーションがあります。プラグインID(image_title_caption)、ラベル、およびこのフォーマッタを使用できるフィールドタイプの配列を指定します。私たちの場合、後者にはデフォルトの画像フィールドタイプのみが含まれていますが、カスタムフィールドタイプでさえも望むなら、より多くをサポートできます。その配列に入る値はプラグインIDであるため、画像フィールドタイププラグインを見ると、IDが画像であることがわかります。 コア画像モジュールによって定義されたデフォルトのImageFormatterプラグインから拡張されているため、クラスはシンプルに見えます。私たちの目的のために、私たちがオーバーライドする必要があるのは、フィールドデータのレンダリング配列を返すことを担当するViewElements()メソッドだけです。後者は$アイテムリスト内にあり、レンダリングに使用して準備できます。

この方法で最初に行うことは、アイテムの親クラスメソッドを呼び出し、それを変数に保存することです。それは、まるで通常のようにレンダリングされる画像をすでに準備します。

デフォルトでは、ImageFormatterプラグイン(親)は、レンダリング配列内のImage_Formatterテーマを使用して、画像フィールド値を出力します。ここで私たちがしていることは、各アイテムについて、このテーマを独自のImage_title_caption_formatterに置き換えることです。次に、親がそうであるように要素(レンダリング配列)を返します。

Drupal 8でこれに気付くでしょう。そして、あなたが私に尋ねると、それは魔法のフックや機能が何をするかを理解するよりもはるかに優れています。

テーマ

上記で指定したimage_title_caption_formatterテーマはこれまでのところ想像上であるため、作成する必要があります。モジュールのモジュールファイルの内部では、hook_themeを実装する必要があります:

image_title_caption.module:

これは、Drupal 7に非常に似ているため、おなじみに見えるはずです。このテーマに渡す変数に注意してください。デフォルトのImage_Formatterテーマをオーバーライドすることを目的としているため、同じ変数もここに渡される必要があります。さらに、Image_Formatterテーマはプレアセスされているため、テーマにもプリプロセッサを作成する必要があります。

このプリプロセッサでは、2つのアクションを実行します
<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file
</span></span></span><span><span> * Contains \Drupal\image_title_caption\Plugin\Field\FieldFormatter\ImageTitleCaption.
</span></span><span><span> */
</span></span><span>
</span><span><span>namespace Drupal<span>\image_title_caption\Plugin\Field\FieldFormatter</span>;
</span></span><span>
</span><span><span>use Drupal<span>\Core\Field\FieldItemListInterface</span>;
</span></span><span><span>use Drupal<span>\image\Plugin\Field\FieldFormatter\ImageFormatter</span>;
</span></span><span>
</span><span><span>/**
</span></span><span><span> * Plugin implementation of the 'image_title_caption' formatter.
</span></span><span><span> *
</span></span><span><span> * @FieldFormatter(
</span></span><span><span> *   id = "image_title_caption",
</span></span><span><span> *   label = @Translation("Image with caption from title"),
</span></span><span><span> *   field_types = <span>{
</span></span></span><span><span> *     "image"
</span></span><span><span> *   <span>}
</span></span></span><span><span> * )
</span></span><span><span> */
</span></span><span><span>class ImageTitleCaption extends ImageFormatter {
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function viewElements(FieldItemListInterface $items) {
</span></span><span>    <span>$elements = <span>parent::</span>viewElements($items);
</span></span><span>    <span>foreach ($elements as &$element) {
</span></span><span>      <span>$element['#theme'] = 'image_title_caption_formatter';
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>return $elements;
</span></span><span>  <span>}
</span></span><span>
</span><span><span>}</span></span>
ログイン後にコピー
ログイン後にコピー

テンプレートファイルに渡された変数が、最初にデフォルトのImage_Formatterテーマのプリプロセッサによって前処理されたことを確認します。これは、すべての変数がまったく同じであり、通常のように画像が表示されるようにするためです。

画像タイトルの消毒された値を含むキャプションと呼ばれる新しい変数を作成します。
<span>/**
</span><span> * Implements hook_theme().
</span><span> */
</span><span>function image_title_caption_theme() {
</span>  <span>return array(
</span>    <span>'image_title_caption_formatter' => array(
</span>      <span>'variables' => array('item' => NULL, 'item_attributes' => NULL, 'url' => NULL, 'image_style' => NULL),
</span>    <span>),
</span>  <span>);
</span><span>}</span>
ログイン後にコピー

サニタイションの場合、ヘルパーストリングクラスを静的に使用します。私たちはまだ.moduleファイルの中にあるので、それを挿入できませんが、ファイルの上部で

それを使用する必要があります:
    name: Image title caption
    type: module
    description: Uses the image title field as a caption
    core: 8.x
    dependencies:
      - image
    ログイン後にコピー
    ログイン後にコピー
    ログイン後にコピー

    テンプレート

    最後に、新しいテーマのテンプレートファイルを作成する必要があります。

    Templates/Image-Title-Caption-formatter.html.twig:

    <span><span><?php
    </span></span><span>
    </span><span><span>/**
    </span></span><span><span> * <span>@file
    </span></span></span><span><span> * Contains \Drupal\image_title_caption\Plugin\Field\FieldFormatter\ImageTitleCaption.
    </span></span><span><span> */
    </span></span><span>
    </span><span><span>namespace Drupal<span>\image_title_caption\Plugin\Field\FieldFormatter</span>;
    </span></span><span>
    </span><span><span>use Drupal<span>\Core\Field\FieldItemListInterface</span>;
    </span></span><span><span>use Drupal<span>\image\Plugin\Field\FieldFormatter\ImageFormatter</span>;
    </span></span><span>
    </span><span><span>/**
    </span></span><span><span> * Plugin implementation of the 'image_title_caption' formatter.
    </span></span><span><span> *
    </span></span><span><span> * @FieldFormatter(
    </span></span><span><span> *   id = "image_title_caption",
    </span></span><span><span> *   label = @Translation("Image with caption from title"),
    </span></span><span><span> *   field_types = <span>{
    </span></span></span><span><span> *     "image"
    </span></span><span><span> *   <span>}
    </span></span></span><span><span> * )
    </span></span><span><span> */
    </span></span><span><span>class ImageTitleCaption extends ImageFormatter {
    </span></span><span>
    </span><span>  <span>/**
    </span></span><span><span>   * <span>{@inheritdoc}
    </span></span></span><span><span>   */
    </span></span><span>  <span>public function viewElements(FieldItemListInterface $items) {
    </span></span><span>    <span>$elements = <span>parent::</span>viewElements($items);
    </span></span><span>    <span>foreach ($elements as &$element) {
    </span></span><span>      <span>$element['#theme'] = 'image_title_caption_formatter';
    </span></span><span>    <span>}
    </span></span><span>
    </span><span>    <span>return $elements;
    </span></span><span>  <span>}
    </span></span><span>
    </span><span><span>}</span></span>
    ログイン後にコピー
    ログイン後にコピー
    Drupal 7と同様に、このファイルの名前はテーマ名を反映するため重要です。内容については、下部に印刷されたキャプションを除き、Image_Formatterテーマで使用されているテンプレートとほぼ同じです。

    それは機能しますか?

    コードを作成したので、有効化後にコードを変更した場合、モジュールを有効にし、すべてのキャッシュをクリアする必要があります。テストする時が来ました。

    たとえば、

    admin/struction/types/manage/article/displayの記事コンテンツタイプのフィールド表示設定に移動します。イメージフィールドの場合、フォーマットの見出しの下で、タイトル形式からキャプションで画像を選択できるはずです。フォームを保存して、admin/struction/types/manage/article/fields/node.article.field_imageに移動し、画像フィールドタイトルが有効になっていることを確認してください。

    最後に、記事を編集し、画像をアップロードしてタイトルを指定できます。そのタイトルは引き続き動作しますが、さらに、キャプションとして画像の下に表示されます。もちろん、あなたはまだあなたが望むようにそれをスタイリングすることができます

    結論

    この記事では、Drupal 8でフィールドフォーマッタを作成してデフォルトの動作を拡張することがどれほど簡単かを見てきました。もの。また、ImageFormatterを拡張する必要はありません。例として拡張または使用できる既存のプラグインがたくさんあります。

    さらに、新しいフィールドタイプとウィジェットも簡単に作成できます。同様のプロセスですが、スキーマ情報を考慮し、さまざまな注釈クラスを使用して、さらにコードを作成する必要があります。しかし、ポイントは、あなたがそうすることで非常に柔軟であることです。

    Drupal 8でカスタムフィールドフォーマッタを作成することに関するよくある質問Drupal 8でカスタムフィールドフォーマッタを作成するには、Drupal 8にカスタムフィールドフォーマッタを作成するには、いくつかのステップが含まれます。まず、カスタムモジュールをまだ持っていない場合は、カスタムモジュールを作成する必要があります。次に、カスタムモジュールで、SRC/Plugin/Field/FieldFormatterディレクトリに新しいファイルを作成します。ファイルには、含まれるクラスに従って命名する必要があります。このファイル内では、FormatterBaseクラスを拡張するカスタムフィールドフォーマッタクラスを定義します。フィールド値のレンダリング配列を生成する責任を負うViewElements()を含むいくつかの方法を実装する必要があります。

    Drupal 8の@fieldformatterアノテーションの目的は何ですか?

    ​​

    Drupal 8の@fieldformatterアノテーションは、フィールドフォーマッターを定義するために使用されます。 ID、ラベル、Field_Typesなどのプロパティが含まれます。 IDはフォーマッタの一意の識別子であり、ラベルは人間が読み取り可能な名前であり、Field_TypesはFormatterがサポートするフィールドタイプのマシン名の配列です。 DRUPAL 8のフィールド?

    カスタムフィールドフォーマッタをDrupal 8のフィールドに適用するには、コンテンツタイプの「ディスプレイの管理」タブ、またはその他のエンティティタイプに移動する必要があります分野。リスト内のフィールドを見つけ、「フォーマット」ドロップダウンからカスタムフォーマッタを選択します。次に、[更新]ボタンをクリックして変更を保存します。

    Drupal 8のカスタムフィールドフォーマッタの出力を制御するにはどうすればよいですか? FormatterクラスのViewElements()メソッドによって制御されます。この方法では、フィールド値のレンダリング配列を返す必要があります。 Drupalのテーマシステムを使用して出力をさらにカスタマイズできます。 drupal 8のフィールドタイプ。@fieldformatterクラスの@fieldformatterアノテーションでは、field_typesプロパティでフィールドタイプのマシン名の配列を指定できます。 DRUPAL 8?

    Drupal 8でカスタムフィールドフォーマッタの設定フォームを作成するには、Formatterクラスにsettingsform()およびsettingsSummary()メソッドを実装する必要があります。 settingsform()メソッドは設定のフォーム配列を返す必要があり、settingsSummary()メソッドは設定の概要行の配列を返す必要があります。 8?

    カスタムフィールドフォーマッタを使用してDrupal 8に画像を表示するには、FormatterクラスはFormatterbaseの代わりにImageFormatterBaseクラスを拡張する必要があります。画像フィールド値のレンダリング配列を生成するには、ViewElements()メソッドを実装する必要があります。 、Drupal 8でカスタムフィールドタイプのカスタムフィールドフォーマッタを作成できます。Formationクラスの@FieldFormatterアノテーションでは、field_typesプロパティでカスタムフィールドタイプのマシン名を指定できます。カスタムフィールドフォーマッタを使用して、Drupal 8にリンクを表示できますか?

    ​​

    カスタムフィールドフォーマッタを使用してDrupal 8にリンクを表示できます。リンクフィールド値のレンダリング配列を生成するには、ViewElements()メソッドを実装する必要があります。

    Drupal 8のマルチ値フィールド用のカスタムフィールドフォーマッタを作成するにはどうすればよいですか?

    Drupal 8のマルチ値フィールドのカスタムフィールドフォーマッタを作成するには、Formatterクラスはフォーマッタベースを拡張する必要があります。 viewelements()メソッドをクラスして実装します。この方法では、フィールドに複数の値があることを考慮して、フィールド値のレンダリング配列を返す必要があります。

    以上がDrupal 8でカスタムフィールドフォーマッタを作成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    著者別の最新記事
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート