[Drupal]カスタムフィールドフォーマッターの作り方


フィールドフォーマッターとは

こちらをご参照ください

今回作りたいフォーマッター

  • フィールド値に関係なく「Hello World!」と表示する
  • ノードのすべてのプレーンテキストフィールドに適用できる

作り方と使い方

ファイルを作成

  • カスタムモジュールにsrc/Plugin/Field/FieldFormatterというディレクトリを作成
  • 上記のディレクトリ下に下記の内容でHelloWorldFormatter.phpを作成
  • drush cr
<?php

namespace Drupal\my_module\Plugin\Field\FieldFormatter;

use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;

/**
 * 常にHello Worldと表示するフォーマッター.
 *
 * @FieldFormatter(
 *   id = "hello_world",
 *   label = "Hello World",
 *   field_types = {
 *     "string"
 *   }
 * )
 */
class HelloWorldFormatter extends FormatterBase {

  /**
   * {@inheritdoc}
   */
  public function viewElements(FieldItemListInterface $items, $langcode) {
    return ['#plain_text' => 'Hello World!'];
  }

  /**
   * {@inheritdoc}
   */
  public static function isApplicable(FieldDefinitionInterface $field_definition) {
    if ($field_definition->getTargetEntityTypeId() !== 'node') {
      return FALSE;
    }

    return TRUE;
  }

}

コンテンツタイプの表示設定で選択

今回はノードのプレーンテキストフィールドでのみHello Worldフォーマッターが選択可になります。

ノードを表示

フォーマッターによってフォーマットされた内容が表示されます。

解説

以下、コードの内容を解説していきます。

アノテーションでメタ情報を定義

まず、Drupalの他のプラグインと同様に、アノテーションでこのプラグインのメタ情報を定義します。

/**
 * 常にHello Worldと表示するフォーマッター.
 *
 * @FieldFormatter(
 *   id = "hello_world", // フォーマッターのID
 *   label = "Hello World", // フォーマッターのラベル
 *   field_types = {
 *     "string" // フォーマッターを適用するフィールドタイプのID
 *   }
 * )
 */

今回はプレーンテキストにのみフォーマッターを適用したいので、対象となるフィールドタイプのIDにはプレーンテキストのstringを記入しています。

plain_textじゃないんかいと思ったそこのあなた

フィールドタイプのIDはこちらでチェック
FieldTypes, FieldWidgets and FieldFormatters

どのように表示するかを定義

viewElements()でレンダリング配列を返すことでどのような内容をレンダリングするかを決めます。

  /**
   * {@inheritdoc}
   */
  public function viewElements(FieldItemListInterface $items, $langcode) {
    return ['#plain_text' => 'Hello World!'];
  }

今回は単純にHello World!と表示するだけですが、引数のitemsを利用すれば様々な値を取り出すことができます。

    $items[0]->getEntity()); // ノードを取得
    $items[0]->getFieldDefinition()); // フィールド定義を取得
    $items[0]->getValue()['value']); // フィールド値を取得

フォーマッターを適用する条件を定義

isApplicable()ではフィールドタイプ以外の適用条件を定義しています。今回はノードにしか適用できないようにしています。

  /**
   * {@inheritdoc}
   */
  public static function isApplicable(FieldDefinitionInterface $field_definition) {
    if ($field_definition->getTargetEntityTypeId() !== 'node') {
      return FALSE;
    }

    return TRUE;
  }

これにより他のエンティティタイプでプレーンテキストのフォーマッターの設定を開いてもHello Worldフォーマッターは表示されなくなります。