[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フォーマッターは表示されなくなります。
Author And Source
この問題について([Drupal]カスタムフィールドフォーマッターの作り方), 我々は、より多くの情報をここで見つけました https://qiita.com/863/items/339baa172f69b69da022著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .