Drupalモジュール
1つのファイルのみで新しいカスタムモジュール(image_title_caption)を作成することから始めましょう。
ここでは普通のことは何もありません。必要に応じて、すでにモジュールを有効にすることもできます。
以下では、私たち自身のフォーマッタクラス:
を見ることができます
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を実装する必要があります:
これは、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>
それは機能しますか?
たとえば、
admin/struction/types/manage/article/displayの記事コンテンツタイプのフィールド表示設定に移動します。イメージフィールドの場合、フォーマットの見出しの下で、タイトル形式からキャプションで画像を選択できるはずです。フォームを保存して、admin/struction/types/manage/article/fields/node.article.field_imageに移動し、画像フィールドタイトルが有効になっていることを確認してください。最後に、記事を編集し、画像をアップロードしてタイトルを指定できます。そのタイトルは引き続き動作しますが、さらに、キャプションとして画像の下に表示されます。もちろん、あなたはまだあなたが望むようにそれをスタイリングすることができます
結論
さらに、新しいフィールドタイプとウィジェットも簡単に作成できます。同様のプロセスですが、スキーマ情報を考慮し、さまざまな注釈クラスを使用して、さらにコードを作成する必要があります。しかし、ポイントは、あなたがそうすることで非常に柔軟であることです。
Drupal 8でカスタムフィールドフォーマッタを作成することに関するよくある質問Drupal 8でカスタムフィールドフォーマッタを作成するには、Drupal 8にカスタムフィールドフォーマッタを作成するには、いくつかのステップが含まれます。まず、カスタムモジュールをまだ持っていない場合は、カスタムモジュールを作成する必要があります。次に、カスタムモジュールで、SRC/Plugin/Field/FieldFormatterディレクトリに新しいファイルを作成します。ファイルには、含まれるクラスに従って命名する必要があります。このファイル内では、FormatterBaseクラスを拡張するカスタムフィールドフォーマッタクラスを定義します。フィールド値のレンダリング配列を生成する責任を負うViewElements()を含むいくつかの方法を実装する必要があります。
Drupal 8の@fieldformatterアノテーションは、フィールドフォーマッターを定義するために使用されます。 ID、ラベル、Field_Typesなどのプロパティが含まれます。 IDはフォーマッタの一意の識別子であり、ラベルは人間が読み取り可能な名前であり、Field_TypesはFormatterがサポートするフィールドタイプのマシン名の配列です。 DRUPAL 8のフィールド?
Drupal 8のカスタムフィールドフォーマッタの出力を制御するにはどうすればよいですか? FormatterクラスのViewElements()メソッドによって制御されます。この方法では、フィールド値のレンダリング配列を返す必要があります。 Drupalのテーマシステムを使用して出力をさらにカスタマイズできます。 drupal 8のフィールドタイプ。@fieldformatterクラスの@fieldformatterアノテーションでは、field_typesプロパティでフィールドタイプのマシン名の配列を指定できます。 DRUPAL 8?
カスタムフィールドフォーマッタを使用してDrupal 8に画像を表示するには、FormatterクラスはFormatterbaseの代わりにImageFormatterBaseクラスを拡張する必要があります。画像フィールド値のレンダリング配列を生成するには、ViewElements()メソッドを実装する必要があります。 、Drupal 8でカスタムフィールドタイプのカスタムフィールドフォーマッタを作成できます。Formationクラスの@FieldFormatterアノテーションでは、field_typesプロパティでカスタムフィールドタイプのマシン名を指定できます。カスタムフィールドフォーマッタを使用して、Drupal 8にリンクを表示できますか?
Drupal 8のマルチ値フィールドのカスタムフィールドフォーマッタを作成するには、Formatterクラスはフォーマッタベースを拡張する必要があります。 viewelements()メソッドをクラスして実装します。この方法では、フィールドに複数の値があることを考慮して、フィールド値のレンダリング配列を返す必要があります。
以上がDrupal 8でカスタムフィールドフォーマッタを作成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。