Saat ini saya mencoba untuk mengimplementasikan bidang gambar yang direferensikan simpul pada situs Drupal 7 saya yang akan mengubah itu 'mode tampilan' tergantung pada logika pemrograman sebelum render. Bidang saat ini sedang diberikan pada sejumlah jenis konten melalui pengaturan mode tampilan mereka, yang masing-masing menggunakan formatter bidang 'Rendered node'.
percobaan pertama
Ide pertama saya adalah menerapkan yang berikut ini, mengingat hook adalah hook adalah hook:
function HOOK_field_formatter_view( $entity_type, $entity, $field ... ){
switch ($display['type']) {
case 'node_reference_node':
/* Programatical logic here to modfy field render settings */
break;
}
}
Jelas bertukar HOOK dengan nama modul saya.
Ini tidak benar-benar peduli jika di atas akan memecat sebelum atau setelah fungsi asli node_reference_field_formatter_view
di node_reference.module
karena saya baik akan menimpa keluaran itu seluruhnya atau, mudah-mudahan, memodifikasi nilai-nilai sebelum rendering. Satu-satunya masalah adalah, pengait di atas tampaknya berfungsi hanya pada basis per modul - yaitu tidak di seluruh situs, jadi pada dasarnya itu tidak menyala untuk modul saya.
Sekarang jelas saya bisa menulis formatter bidang saya sendiri untuk menampilkan node yang diberikan. Tapi sepertinya agak sia-sia mengingat sudah ada yang ada.
pendekatan lain
Pendekatan saya yang lain adalah dengan HOOK_preprocess_node
dan HOOK_preprocess_field
tetapi yang pertama tidak mengandung view_mode
informasi apa pun , dan yang terakhir mengandung setidaknya 5 struktur rumit yang berbeda yang semuanya memiliki referensi ke view_mode
properti di tingkat yang berbeda - dan rasanya agak tidak sopan harus memodifikasi masing-masing nilai-nilai. Bahkan ketika saya telah mengubah view_mode
properti tertentu , gambar yang dihasilkan tidak berubah.
pertanyaan
Adakah yang tahu cara bersih untuk masuk sebelum formatter bidang merender (modul kontrib) dan mengubah pengaturannya berdasarkan permintaan per halaman - yaitu dengan tidak harus mengubah pengaturan mode tampilan permanen jenis konten yang sebenarnya?
hook_field_formatter_view_alter()
atau serupa untuk mungkin lebih dari satu tahun sekarang, sayangnya tidak ada. FYIhook_preprocess_node()
pasti tidak memilikiview_mode
tersedia untuk itu, itu di$vars['view_mode']
, tidak$vars['node']->view_mode
mana Anda mungkin telah tergoda untuk mencoba.view_mode
padahook_preprocess_node
, saya bodoh! Saya ingin tahu apakah hal sepertihook_field_formatter_view_alter()
ini ada di D8 ...Jawaban:
Pertanyaan itu menyebutkan bahwa
hook_field_formatter_view()
hanya dipanggil pada modul asal, tetapi Anda dapat mengambil kepemilikan formatter bidang melaluihook_field_formatter_info_alter()
.Anda harus dapat mengatur
module
kunci formatter ke MYMODULE seperti:Kemudian Anda dapat menerapkan
MYMODULE_field_formatter_view()
, secara opsional memberi makan melalui modul yang ada yang menanganinya untuk mendapatkan elemen untuk diubah.sumber
field_formatter
fungsi yaitu node_referenceMYMODULE_field_formatter_settings_summary
dan danMYMODULE_field_formatter_settings_form
(bahkan jika mereka hanya fungsi proxy kembali ke modul asli) jika tidak kembali- end UI rusak pada panel mode tampilan, ketika mencoba menemukan metode ini dalam modul yang salah.Ok jadi saya menyadari mengapa perubahan saya
#view_mode
baikhook_preprocess_node
danhook_preprocess_fields
tidak berfungsi. (Terima kasih kepada Clive untuk menunjukkan bahwa aku benar-benar merindukan kehadiran#view_mode
dihook_preprocess_node
) .Masalah saya berasal dari fakta bahwa
#view_mode
sudah diproses dan dikonversi ke#image_style
properti yang benar - sesuatu yang saya lalai mencari.Meski begitu, mengubah nilai ini tampaknya terlalu tergantung pada pengait mana Anda memodifikasinya. Akhirnya saya dapat beberapa kode, yang sebenarnya mengubah gambar yang diberikan:
Hal di atas masih tidak terasa fasih, tetapi setidaknya itu berfungsi. Saya akan mengambil kata Clive pada kenyataan bahwa metode _alter seperti itu tidak ada untuk formatters lapangan - memalukan, formatters adalah fitur yang sangat kuat dari D7, alangkah baiknya memiliki kemampuan yang lebih besar.
Bagaimanapun, jika ada orang di masa depan yang memiliki ide yang lebih baik, jawablah :)
sumber
Pendekatan termudah adalah menggunakan Panelizer .
Jika tidak menggunakan Panelizer tetapi mode tampilan Drupal default atau Display Suite, coba hook_field_display_alter () atau hook_field_display_ENTITY_TYPE_alter () .
Anda memiliki entitas, konteks tampilan serta semua pengaturan formatter di sana. Dan Anda dapat dengan mudah mengubah pengaturan render bidang. Anda bahkan dapat mengubah formatter bidang ke yang berbeda.
Pendekatannya bekerja sempurna bagi saya. Satu-satunya kelemahan adalah bahwa Anda mungkin bingung dengan pengaturan yang berbeda di UI "Kelola tampilan".
sumber
https://www.drupal.org/node/2130757 Ini memberi contoh yang baik. hook_field_formatter_third_party_settings_form () berguna untuk mengubah bentuk formatter bidang yang ada.
Tetapi ini tidak bekerja dengan kelompok lapangan.
sumber