Rumah >pembangunan bahagian belakang >tutorial php >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
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
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.
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>
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:
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
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>
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.
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
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.
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.
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 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.
Atas ialah kandungan terperinci Membuat formatter medan tersuai di Drupal 8. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!