cari
Rumahpembangunan bahagian belakangtutorial phpMembuat formatter medan tersuai di Drupal 8

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

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

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></span>

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>

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

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></span>

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
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
Bagaimanakah PHP mengenal pasti sesi pengguna?Bagaimanakah PHP mengenal pasti sesi pengguna?May 01, 2025 am 12:23 AM

Phpidentifierauser'sSessionusingSessionCookiesandSessionIds.1) whensession_start () ISCALLED, phpGeneratesAuniquesessionIdstoredinacookienamedPhpsessidontheUserer'sBrowser.2) ThisIdallowsPhptoretRievesSessionDataFromtheserver.

Apakah beberapa amalan terbaik untuk mendapatkan sesi PHP?Apakah beberapa amalan terbaik untuk mendapatkan sesi PHP?May 01, 2025 am 12:22 AM

Keselamatan sesi PHP boleh dicapai melalui langkah -langkah berikut: 1. Gunakan session_regenerate_id () untuk menjana semula ID sesi apabila pengguna log masuk atau merupakan operasi penting. 2. Sulitkan ID sesi penghantaran melalui protokol HTTPS. 3. Gunakan session_save_path () untuk menentukan direktori selamat untuk menyimpan data sesi dan menetapkan kebenaran dengan betul.

Di manakah fail sesi php disimpan secara lalai?Di manakah fail sesi php disimpan secara lalai?May 01, 2025 am 12:15 AM

PhpsessionFileSarestoredIntHedirectorySpecifiedBySession.save_path, biasanya/tmponunix-likesystemsorc: \ windows \ temponwindows.tocustomethis: 1) usession_save_path ()

Bagaimana anda mengambil data dari sesi PHP?Bagaimana anda mengambil data dari sesi PHP?May 01, 2025 am 12:11 AM

ToretrievedataFromaphpsession, startTheSessionWithSsion_start () andaccessVariablesInthe $ _SessionArray.Forexample: 1) startTheSession: session_start ()

Bagaimana anda boleh menggunakan sesi untuk melaksanakan keranjang belanja?Bagaimana anda boleh menggunakan sesi untuk melaksanakan keranjang belanja?May 01, 2025 am 12:10 AM

Langkah -langkah untuk membina sistem keranjang belanja yang cekap menggunakan sesi termasuk: 1) Memahami definisi dan fungsi sesi. Sesi ini adalah mekanisme penyimpanan sisi pelayan yang digunakan untuk mengekalkan status pengguna merentasi permintaan; 2) melaksanakan pengurusan sesi asas, seperti menambah produk ke keranjang belanja; 3) memperluas penggunaan lanjutan, menyokong pengurusan kuantiti produk dan penghapusan; 4) Mengoptimumkan prestasi dan keselamatan, dengan berterusan data sesi dan menggunakan pengecam sesi yang selamat.

Bagaimana anda membuat dan menggunakan antara muka dalam PHP?Bagaimana anda membuat dan menggunakan antara muka dalam PHP?Apr 30, 2025 pm 03:40 PM

Artikel ini menerangkan cara membuat, melaksanakan, dan menggunakan antara muka dalam PHP, memberi tumpuan kepada manfaat mereka untuk organisasi kod dan penyelenggaraan.

Apakah perbezaan antara crypt () dan password_hash ()?Apakah perbezaan antara crypt () dan password_hash ()?Apr 30, 2025 pm 03:39 PM

Artikel ini membincangkan perbezaan antara crypt () dan password_hash () dalam php untuk hashing kata laluan, memberi tumpuan kepada pelaksanaan, keselamatan, dan kesesuaian untuk aplikasi web moden.

Bagaimanakah anda dapat mencegah skrip lintas tapak (XSS) dalam PHP?Bagaimanakah anda dapat mencegah skrip lintas tapak (XSS) dalam PHP?Apr 30, 2025 pm 03:38 PM

Artikel membincangkan mencegah skrip lintas tapak (XSS) dalam PHP melalui pengesahan input, pengekodan output, dan menggunakan alat seperti OWASP ESAPI dan pembersih HTML.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

PhpStorm versi Mac

PhpStorm versi Mac

Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

MinGW - GNU Minimalis untuk Windows

MinGW - GNU Minimalis untuk Windows

Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.