ขอการทำสำเนาสนาม


15

ฉันมีโมดูลที่กำหนดเองที่กำลังฟอร์แมตการแสดงผลของฟิลด์ภาพซึ่งสามารถยอมรับค่าได้หลายค่า ฉันต้องการรู้ว่าตะขออะไรที่ฉันควรใช้เพื่อทำซ้ำค่าแรกของฟิลด์ (เช่น "[image1]") และเพิ่มกลับไปที่จุดเริ่มต้นของอาร์เรย์ (โดยarray_unshift()ฉันเดา) ก่อนส่วนที่เหลือของรูปแบบฟังก์ชั่นของฉัน แสดง / ชุดรูปแบบของฟิลด์

แล้วอะไรล่ะ

  • [ภาพที่ 1]
  • [ภาพที่ 2]
  • [ภาพที่ 3]

กลายเป็น

  • [ภาพที่ 1]
  • [ภาพที่ 1]
  • [ภาพที่ 2]
  • [ภาพที่ 3]

จากนั้นฉันจะปรับธีมให้แยกจากกัน แต่ฉันคิดว่าฉันมีส่วนนั้นอยู่แล้ว

ฉันกำลังใช้hook_field_formatter_view()งานอยู่และพยายามเพิ่มเข้าไปที่จุดเริ่มต้นของ$itemsอาร์เรย์ที่ด้านบนสุดของฟังก์ชัน แต่ดูเหมือนจะไม่ทำงาน ถ้าฉันทันทีอาร์เรย์หลังจากนี้มันแสดงให้เห็น แต่เพียง 3 รายการที่ได้รับผล; ฉันสมมติว่าจำนวนของเขตข้อมูลได้รับการพิจารณาที่อื่นdprint_r()$items


1
หากคุณต้องการเพียงแค่คัดลอกภาพจาวาสคริปต์อาจจะเป็นเช่นนั้น?
Codium

ไม่ฉันขอโทษ. ฉันใช้ js กับผลลัพธ์ แต่ฉันต้องทำสิ่งอื่นกับข้อมูลด้วยhook_field_formatter_viewแต่จะทำงานเพียงครั้งเดียวต่อภาพ
โอกาส G

ฉันดูในตัวดีบักเกอร์และรู้สึกประหลาดใจที่พบว่ามีการเพิ่ม deltas เพิ่มเติมในอาร์เรย์ที่ถูกละเว้น
Adam S

+1 สำหรับคำถามของคุณมันเป็นหัวข้อที่น่าสนใจ แต่เพื่อช่วยให้เราคิดเกี่ยวกับการแก้ปัญหาที่แท้จริงคุณสามารถระบุได้อย่างชัดเจนว่าจุดประสงค์หลักของคุณคืออะไร (เหตุใดคุณจึงต้องการให้ภาพแรกซ้ำซ้อน) ยิ่งเรารู้ข้อมูลมากเท่าไหร่คำตอบที่ดีกว่าก็คือคุณจะได้รับ :)
Sk8erPeter

ฉันสิ้นสุดการแก้ปัญหาด้วย javascript แต่เพื่อตอบคำถามของคุณ ฉันพยายามใช้ hoverzoom ซึ่งใช้ภาพขนาดใหญ่หนึ่งภาพต่อชุดจากนั้นภาพขนาดย่อของภาพทั้งหมดเพื่อให้ผู้ใช้สลับภาพขนาดใหญ่
โอกาสเกิด G

คำตอบ:


1

คุณต้องการhook_field_formatter_prepare_view ()แทน หมายเหตุ hook นี้ทำงานกับกลุ่มของเอนทิตีไม่ใช่คนเดียว

นี่คือตัวอย่างข้อมูลที่ใช้งานได้ อาเรย์บางอย่างจำเป็นต้องมีเพื่อไม่ให้จบการเขียนลูปที่น่าเกลียดของสิบบรรทัดเนื่องจากเดลต้าจะต้องเก็บรักษาไว้เป็นแนวตรง

<?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;
  }
}

0

hook_field_formatter_view()เป็นที่ที่โค้ดของคุณสร้างเอาต์พุตที่แสดงต่อผู้ใช้ดังนั้นจึงต้องการอาร์เรย์ที่สามารถแสดงผลได้เป็นค่าส่งคืน ดังนั้นเพียงแค่ประมวลผลภาพแรกสองครั้งและให้คลาส css หรือสิ่งอื่น

สิ่งที่ต้องการ:

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

เนื่องจากhook_field_formatter_view()คาดว่าอาร์เรย์ที่สามารถเรนเดอร์ได้และเนื่องจากอาร์เรย์ที่สามารถเรนเดอร์ได้ถูกทำเครื่องหมายเป็นเรนเดอร์เมื่อทำการเรนเดอร์การอ้างอิงสองครั้งไปยังวัตถุเดียวกันจะทำให้เรนเดอร์หนึ่ง


ฉันขอโทษพอล แต่คุณอ่านคำถามของฉัน? ฉันสามารถเพิ่มไปยังจุดเริ่มต้นของอาร์เรย์รายการได้ ปัญหาคือว่ามันยังไม่ถูกส่งออก
โอกาส G

hook_field_formatter_view () รับเขตข้อมูลและคุณต้องเปลี่ยนเป็นอาร์เรย์ที่แสดงผลได้ หากคุณเพิ่งอ้างอิงสองครั้งไปยังอาร์เรย์เดียวกันรายการนั้นจะถูกทำเครื่องหมายว่าแสดงผลและจะไม่แสดงอีกครั้ง ดังนั้นคุณต้องสร้างอาร์เรย์ที่สามารถเรนเดอร์ใหม่สำหรับแต่ละรายการที่คุณต้องการ
paul-m

นี่คือคำตอบหรือไม่
paul-m

ไม่ฉันสามารถเพิ่มรายการพิเศษลงในอาร์เรย์ได้ เมื่อฉัน dpm อาเรย์นั้นแสดงขึ้นมันจะไม่พิมพ์ออกมา ฉันยอมรับคำตอบทั้งหมดที่ถูกต้อง
โอกาสเกิด G

ดังที่ฉันพูดถึงระบบการแสดงผลจะทำเครื่องหมายรายการว่าแสดงผลแล้ว ซึ่งหมายความว่าหากคุณส่งภาพที่สองโดยการอ้างอิงมันจะถูกทำเครื่องหมายเป็นเรนเดอร์ในครั้งแรกและจากนั้นจะไม่ทำการเรนเดอร์เป็นครั้งที่สองเนื่องจากมันถูกทำเครื่องหมายไว้แล้ว
paul-m
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.