Hook untuk Duplikasi Bidang

15

Saya memiliki modul khusus yang memformat tampilan bidang gambar, yang dapat menerima banyak nilai. Saya ingin tahu hook apa yang harus saya gunakan untuk menduplikasi nilai pertama dari bidang (misalnya "[image1]"), dan menambahkannya kembali ke awal array (dengan array_unshift()saya kira) sebelum sisa fungsi saya memformat tampilan / tema bidang.

Jadi apa itu

  • [image1]
  • [image2]
  • [image3]

menjadi

  • [image1]
  • [image1]
  • [image2]
  • [image3]

Saya kemudian akan tema mereka secara terpisah, tapi saya pikir saya sudah tahu bagian itu.

Saat ini saya menggunakan hook_field_formatter_view(), dan telah mencoba untuk menambahkannya ke awal $itemsarray di bagian atas fungsi, tetapi sepertinya tidak berhasil. Jika saya segera dprint_r()dengan $itemsarray yang setelah ini itu menunjukkan, tapi hanya 3 item mendapatkan output; Saya mengasumsikan bahwa jumlah bidang ditentukan di tempat lain.

Peluang G
sumber
1
Jika Anda hanya ingin menyalin gambar, mungkin Javascript adalah caranya?
Codium
Tidak, saya minta maaf. Saya menggunakan js pada hasil tetapi saya perlu melakukan hal-hal lain untuk data dengan hook_field_formatter_viewtetapi hanya berjalan sekali per gambar.
Peluang G
Saya melihatnya di debugger dan terkejut menemukan delta tambahan yang ditambahkan ke array yang diabaikan.
Adam S
+1 untuk pertanyaan Anda, ini topik yang menarik. Tetapi untuk membantu kami berpikir tentang solusi nyata, dapatkah Anda lebih spesifik apa tujuan utama Anda (jadi alasan mengapa Anda ingin gambar pertama digandakan)? Semakin banyak info yang kami tahu, semakin baik jawaban yang bisa Anda dapatkan. :)
Sk8erPeter
Saya akhirnya memecahkan masalah ini dengan javascript. Tetapi untuk menjawab pertanyaan Anda; Saya mencoba menerapkan hoverzoom, yang menggunakan satu gambar besar per set dan kemudian thumbnails semua gambar untuk memungkinkan pengguna untuk beralih gambar besar.
Peluang G

Jawaban:

1

Anda ingin hook_field_formatter_prepare_view () sebagai gantinya. Perhatikan kait ini beroperasi pada sekelompok entitas, bukan pada satu entitas.

Berikut cuplikan yang berfungsi. Diperlukan beberapa array-fu untuk tidak menulis loop jelek dari sepuluh baris, karena delta harus dilestarikan secara linier.

<?php

function MODULE_field_formatter_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items, $displays) {
  foreach ($entities as $id => $entity) {
    $array = array(0 => $items[$id][0], 1 => $items[$id][0]);
    if (count($items[$id]) > 1) {
      array_splice($array, 2, 0, array_slice($items[$id], 1));
    }
    $items[$id] = $array;
  }
}
jonhattan
sumber
0

hook_field_formatter_view()adalah tempat kode Anda membuat output yang ditampilkan kepada pengguna, dan ia menginginkan array yang dapat di render sebagai nilai balik. Jadi hanya proses gambar pertama dua kali dan berikan kelas css yang berbeda atau sesuatu.

Sesuatu seperti:

$output = array();
if (($field == 'myFieldType') && ($display == 'full')) {
  $output[] = renderFirstImage(reset($items));
  foreach ($items as $item) {
    $output[] = renderImage($item);
  }
}
return $output;

Karena hook_field_formatter_view()mengharapkan array yang dapat di-render, dan karena array yang dapat di render ditandai sebagai yang di-render ketika di-render, hanya dengan membuat dua referensi ke objek yang sama akan menyebabkan yang di-render, ditandai sebagai yang di-render, dan kemudian diabaikan di waktu berikutnya.

paul-m
sumber
Saya minta maaf Paul, tetapi apakah Anda membaca pertanyaan saya? Saya bisa menambahkannya ke awal array item. Masalahnya adalah itu masih belum menjadi output.
Peluang G
hook_field_formatter_view () mendapatkan bidang dan Anda harus mengubahnya menjadi array yang dapat di render. Jika Anda hanya membuat dua referensi ke array yang sama, item itu akan ditandai sebagai yang di-render, dan tidak di-render lagi. Jadi, Anda harus membuat array yang dapat di-render untuk setiap item yang Anda inginkan.
paul-m
Apakah ini jawabannya?
paul-m
Tidak. Saya dapat menambahkan item tambahan ke array. Ketika saya dpm array yang ditampilkan, itu tidak mencetak. Saya menerima semua jawaban yang benar.
Peluang G
Seperti yang saya sebutkan, sistem render menandai item yang sudah diberikan. Itu berarti bahwa jika Anda hanya melewatkan gambar kedua dengan referensi, itu akan ditandai sebagai yang diberikan pertama kali, dan kemudian TIDAK diberikan yang kedua kalinya, karena sudah ditandai.
paul-m