Rumah > pembangunan bahagian belakang > tutorial php > Membuat formatter medan tersuai di Drupal 8

Membuat formatter medan tersuai di Drupal 8

Jennifer Aniston
Lepaskan: 2025-02-18 08:42:11
asal
764 orang telah melayarinya

Membuat formatter medan tersuai di Drupal 8

Takeaways Key

    Mewujudkan formatter medan tersuai di Drupal 8 melibatkan menentukan kelas formatter baru dalam direktori Src/Plugin/Field/FieldFormatter dari modul tersuai, memanjangkan dari plugin ImageFormatter lalai.
  • Kelas Formatter baru harus mengatasi kaedah ViewElements () untuk mengembalikan pelbagai data medan, menggantikan tema image_formatter lalai dengan satu adat.
  • Tema baru, image_title_caption_formatter, dicipta dalam fail modul modul, dengan pembolehubah yang sama diluluskan seperti dalam tema image_formatter lalai.
  • Formatter medan tersuai boleh digunakan untuk medan di Drupal 8 melalui tab "Urus Paparan" jenis kandungan, memilih pemiutang tersuai dari dropdown "format".
Harap maklum bahawa disebabkan oleh proses pembangunan Drupal 8 telah menjalani masa penulisan, beberapa bahagian kod mungkin sudah lapuk. Lihatlah repositori ini di mana saya cuba mengemas kini kod contoh dan menjadikannya berfungsi dengan pelepasan Drupal 8 terkini. Dengan pengenalan plugin anotasi, banyak telah berubah di Drupal 8. Kami mempunyai pendekatan yang lebih efisien untuk menerangkan dan menemui kepingan fungsi yang memanjangkan teras. Bersama dengan banyak komponen lain, bekas API Field (sebahagian daripada API Entiti yang lebih besar dan disatukan) kini berdasarkan plugin.

Membuat formatter medan tersuai di Drupal 8 Dalam tutorial ini, kita akan melalui menentukan formatter medan tersuai untuk medan yang sedia ada (imej). Apa yang ingin kita capai adalah untuk memaparkan imej dengan kapsyen kecil di bawahnya. Keterangan ini akan menjadi nilai tajuk yang diberikan kepada imej jika ada.

Kod yang kita tulis di sini boleh didapati di repositori ini sebagai modul image_title_caption. Tetapi mari kita lihat bagaimana kita boleh mendapatkan hasil akhir itu.

Modul Drupal

mari kita mulakan dengan membuat modul tersuai baru (image_title_caption) dengan hanya satu fail:

image_title_caption.info.yml:

Tiada apa -apa dari biasa di sini. Kita juga boleh membolehkan modul sudah jika kita mahu.
name: Image title caption
type: module
description: Uses the image title field as a caption
core: 8.x
dependencies:
  - image
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Plugin

Dalam Drupal 8, format medan (seperti jenis medan dan widget sendiri) adalah plugin. Yang teras ditakrifkan sama ada oleh modul teras atau boleh didapati di dalam ruang nama DrupalcorfieldPluginfieldFfieldForter. Dan seperti yang kita lihat dalam artikel sebelumnya di mana kita melihat blok tersuai, plugin masuk ke dalam SRC/ plugin/ folder modul kami. Dalam kes formatter medan, ini akan menjadi direktori Src/Plugin/Field/FieldFormatter.

Di bawah anda dapat melihat kelas formatter kami sendiri:

name: Image title caption
type: module
description: Uses the image title field as a caption
core: 8.x
dependencies:
  - image
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ini adalah plugin kami. Tidak ada yang lain. Di atas perisytiharan kelas kita mempunyai anotasi @fieldFormatter di mana plugin dapat ditemui. Kami menentukan ID plugin (image_title_caption), label dan pelbagai jenis medan formatter ini boleh digunakan dengan. Dalam kes kami, yang terakhir hanya mengandungi jenis medan imej lalai tetapi kami dapat menyokong lebih banyak jika kami mahu, walaupun jenis medan tersuai. Nilai -nilai yang masuk dalam array itu adalah ID plugin jadi jika anda melihat plugin jenis medan imej, anda akan melihat bahawa IDnya adalah imej.

Kelas kelihatan mudah kerana kami memanjangkan dari plugin ImageFormatter lalai yang ditakrifkan oleh modul imej teras. Untuk tujuan kami, semua yang kami perlukan untuk mengatasi adalah kaedah ViewElements () yang bertanggungjawab untuk mengembalikan pelbagai data bidang kami. Yang terakhir ini boleh didapati di dalam senarai item $ dan boleh digunakan dan disediakan untuk rendering.

Perkara pertama yang kita lakukan dalam kaedah ini adalah pastikan kita memanggil kaedah kelas induk pada item dan menyimpannya dalam pembolehubah. Itu akan menyediakan imej yang akan diberikan seolah -olah ia biasanya.

Secara lalai, plugin ImageFormatter (ibu bapa) menggunakan tema Image_Formatter di dalam array render untuk mengeluarkan nilai medan imej. Apa yang kita lakukan di sini ialah untuk setiap item, kita menggantikan tema ini dengan kita sendiri: image_title_caption_formatter. Kemudian kita mengembalikan unsur -unsur (membuat array) sama seperti ibu bapa.

Anda akan melihat banyak perkara ini di Drupal 8: Kami mendapat petunjuk yang sangat baik mengenai apa yang perlu kita lakukan dari kelas induk yang kami luangkan. Dan jika anda bertanya kepada saya, itu jauh lebih baik daripada memikirkan apa yang dilakukan oleh beberapa cangkuk sihir atau fungsi.

Tema

Oleh kerana tema image_title_caption_formatter yang ditentukan di atas adalah khayalan, kita perlu menciptanya. Di dalam fail modul modul kami, kami perlu melaksanakan hook_theme:

image_title_caption.module:

<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>
Salin selepas log masuk
Salin selepas log masuk

Ini sepatutnya kelihatan biasa kerana ia sangat mirip dengan Drupal 7. Sila perhatikan pembolehubah yang kami lalui untuk tema ini. Kami berhasrat untuk mengatasi tema image_formatter lalai supaya kami harus mempunyai pembolehubah yang sama di sini juga. Di samping itu, kerana tema Image_Formatter diproses, kami perlu membuat preprocessor untuk tema kami juga:

<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>
Salin selepas log masuk

Dalam preprocessor ini kita melakukan dua tindakan:

  • Kami memastikan bahawa pembolehubah yang diluluskan ke fail template akan terlebih dahulu diproses oleh preprocessor tema image_formatter lalai. Ini adalah supaya semua pembolehubah adalah sama dan imej akan dipaparkan seperti biasa.
  • kami membuat pembolehubah baru yang dipanggil kapsyen yang akan mengandungi nilai sanitasi tajuk imej.

Untuk sanitisasi, kami menggunakan kelas String Helper secara statik. Kami masih berada di dalam fail .modul supaya kami tidak dapat menyuntiknya, tetapi kami perlu menggunakan di bahagian atas fail:

name: Image title caption
type: module
description: Uses the image title field as a caption
core: 8.x
dependencies:
  - image
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

template

Akhir sekali, kita perlu membuat fail templat untuk tema baru kami:

templat/gambar-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>
Salin selepas log masuk
Salin selepas log masuk

Sama seperti Drupal 7, nama fail ini penting kerana ia mencerminkan nama tema. Bagi kandungannya, mereka hampir sama dengan templat yang digunakan oleh tema Image_Formatter kecuali untuk kapsyen yang dicetak di bahagian bawah.

Adakah ia berfungsi?

Sekarang kita telah menulis kod, kita perlu mengaktifkan modul dan membersihkan semua cache jika kita telah membuat perubahan kod selepas membolehkan. Sudah tiba masanya untuk mengujinya.

Sebagai contoh, pergi ke tetapan paparan medan jenis kandungan artikel di admin/struktur/jenis/pengurusan/artikel/paparan. Untuk medan imej, di bawah tajuk format, anda sepatutnya dapat memilih imej dengan kapsyen dari format tajuk. Simpan borang dan pergi ke admin/struktur/jenis/menguruskan/artikel/medan/node.article.field_image dan pastikan tajuk medan imej diaktifkan.

Akhirnya, anda boleh mengedit artikel, memuat naik imej dan tentukan tajuk. Tajuk itu akan terus berkelakuan seperti itu, tetapi tambahan pula, ia akan dipaparkan di bawah imej sebagai kapsyen. Sudah tentu, anda masih boleh menggayakannya seperti yang anda mahukan dan lain -lain

Kesimpulan

Dalam artikel ini, kita telah melihat betapa mudahnya untuk membuat formatter medan dan memperluaskan tingkah laku lalai di Drupal 8. Kami hanya menyentuh untuk mengatasi penampilan () plugin ini tetapi kami dapat melakukan lebih banyak lagi untuk menyesuaikan lagi perkara. Anda juga tidak dikehendaki melanjutkan imageFormatter. Terdapat banyak plugin sedia ada yang boleh anda luangkan dari atau digunakan sebagai contoh.

Selain itu, anda juga boleh membuat jenis medan dan widget baru dengan mudah. Ini proses yang sama tetapi anda perlu mengambil beberapa maklumat skema, menggunakan kelas anotasi yang berbeza dan menulis lebih banyak kod. Tetapi maksudnya anda sangat fleksibel dalam melakukannya.

soalan yang sering ditanya mengenai membuat formatter medan tersuai di Drupal 8

Bagaimana saya membuat formatter medan tersuai di Drupal 8?

Mewujudkan formatter medan tersuai di Drupal 8 melibatkan beberapa langkah. Pertama, anda perlu membuat modul tersuai jika anda tidak mempunyai satu. Kemudian, dalam modul tersuai anda, buat fail baru dalam direktori Src/Plugin/Field/FieldFormatter. Fail itu hendaklah dinamakan mengikut kelas yang akan mengandungi. Di dalam fail ini, anda akan menentukan kelas formatter medan tersuai anda, yang harus memperluaskan kelas FormatterBase. Anda perlu melaksanakan beberapa kaedah, termasuk ViewElements () yang bertanggungjawab untuk menghasilkan array render untuk nilai medan.

Apakah tujuan anotasi @FieldFormatter dalam Drupal 8? Ia termasuk sifat seperti id, label, dan field_types. ID adalah pengecam unik untuk formatter, labelnya adalah nama yang boleh dibaca manusia, dan field_types adalah pelbagai nama mesin jenis medan yang menyokong formatter. medan di Drupal 8?

medan. Cari medan dalam senarai dan pilih formatter tersuai anda dari dropdown "format". Kemudian klik butang "Kemas Kini" dan simpan perubahan.

Bagaimana saya boleh mengawal output formatter medan tersuai saya di Drupal 8? dikawal oleh kaedah ViewElements () dalam kelas formatter anda. Kaedah ini harus mengembalikan array render untuk nilai medan. Anda boleh menggunakan sistem peringatan Drupal untuk menyesuaikan output lagi. jenis medan di drupal 8. Dalam anotasi @fieldformatter kelas formatter anda, anda boleh menentukan pelbagai nama mesin jenis medan dalam harta field_types. Drupal 8?

Untuk membuat borang tetapan untuk formatter medan tersuai anda di Drupal 8, anda perlu melaksanakan kaedah Tetapan () dan TetapanSummary () dalam kelas formatter anda. Kaedah Tetapan () harus mengembalikan array borang untuk tetapan, dan kaedah tetapanSummary () harus mengembalikan pelbagai garisan ringkasan untuk tetapan. 8? Anda perlu melaksanakan kaedah ViewElements () untuk menghasilkan array yang diberikan untuk nilai medan imej. , anda boleh membuat formatter medan tersuai untuk jenis medan tersuai di Drupal 8. Dalam anotasi @FieldFormatter kelas formatter anda, anda boleh menentukan nama mesin jenis medan tersuai anda di harta tanah field_types. Bolehkah saya menggunakan formatter medan tersuai untuk memaparkan pautan di Drupal 8?

Untuk menggunakan formatter medan tersuai untuk memaparkan pautan di Drupal 8, kelas pemenang anda harus memperluaskan kelas LinkFormatter dan bukannya formatterbase. Anda perlu melaksanakan kaedah ViewElements () untuk menghasilkan array render untuk nilai medan pautan.

bagaimana saya boleh membuat formatter medan tersuai untuk medan multi-nilai di Drupal 8? kelas dan melaksanakan kaedah ViewElements (). Kaedah ini harus mengembalikan array render untuk nilai medan, dengan mengambil kira bahawa medan mungkin mempunyai pelbagai nilai.

Atas ialah kandungan terperinci Membuat formatter medan tersuai di Drupal 8. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan