เชื่อมต่อกับฟอร์แมตฟิลด์ของโมดูลอื่นหรือไม่


9

ฉันกำลังพยายามที่จะใช้ฟิลด์รูปภาพอ้างอิงโหนดบนเว็บไซต์ Drupal 7 ของฉันที่จะเปลี่ยนเป็น 'โหมดดู' ขึ้นอยู่กับตรรกะของโปรแกรมก่อนที่จะเรนเดอร์ ขณะนี้ฟิลด์กำลังแสดงผลในประเภทเนื้อหาจำนวนมากผ่านการตั้งค่าโหมดการแสดงผลซึ่งแต่ละประเภทกำลังใช้ฟอร์แมตฟิลด์ 'โหนดการแสดงผล'

ความพยายามครั้งแรก

ความคิดแรกของฉันคือการใช้สิ่งต่อไปนี้โดยพิจารณาจาก hook คือ hook คือ 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;
  }
}

เห็นได้ชัดว่าการแลกเปลี่ยน HOOK สำหรับชื่อโมดูลของฉัน

มันไม่ได้เรื่องจริงๆถ้าข้างต้นจะยิงก่อนหรือหลังฟังก์ชั่นเดิมnode_reference_field_formatter_viewในnode_reference.moduleเพราะผมอาจจะแทนที่ของการส่งออกทั้งหมดหรือหวังว่าปรับเปลี่ยนค่าก่อนการแสดงผล ปัญหาเพียงอย่างเดียวคือตะขอข้างต้นดูเหมือนว่าจะทำงานได้เฉพาะในโมดูลต่อ - คือมันไม่ได้ทั่วทั้งไซต์ดังนั้นโดยทั่วไปจะไม่ทำงานสำหรับโมดูลของฉัน

ตอนนี้เห็นได้ชัดว่าฉันสามารถเขียนตัวจัดรูปแบบฟิลด์ของฉันเองเพื่อแสดงผลโหนดที่แสดงผลได้ แต่ดูเหมือนขยะเมื่อพิจารณาว่ามีอยู่แล้ว

แนวทางอื่น ๆ

วิธีการอื่น ๆ ของฉันเคยเป็นHOOK_preprocess_nodeและHOOK_preprocess_fieldแต่ก่อนหน้านี้ไม่มีview_modeข้อมูลใด ๆและหลังมีโครงสร้างที่ซับซ้อนแตกต่างกันอย่างน้อย 5 อย่างที่ทุกคนมีการอ้างอิงถึงview_modeสถานที่ให้บริการในระดับที่แตกต่างกัน - และรู้สึกว่าค่อนข้างแฮ็ค ค่า แม้ว่าฉันจะเปลี่ยนview_modeคุณสมบัติบางอย่างรูปภาพก็ไม่เปลี่ยน

คำถาม

ไม่มีใครรู้วิธีที่สะอาดในการก้าวต่อหน้าฟอร์แมตเตอร์ฟิลด์ (ของโมดูล contrib) และเปลี่ยนการตั้งค่าตามการร้องขอต่อหน้า - นั่นคือโดยไม่ต้องเปลี่ยนการตั้งค่าโหมดมุมมองถาวรของประเภทเนื้อหาจริงหรือไม่?


2
ฉันได้รับการมองหาhook_field_formatter_view_alter()หรือคล้ายกันมานานกว่าหนึ่งปีในขณะนี้มันก็ไม่ได้อยู่อย่างน่าเสียดาย FYI hook_preprocess_node()แน่นอนไม่ได้view_modeใช้ได้กับมันใน$vars['view_mode']ไม่$vars['node']->view_modeที่คุณอาจได้รับการล่อลวงเพื่อพยายาม
ไคลฟ์

ขอบคุณ @Clive สำหรับข้อมูลโอ้และชี้ให้เห็นview_modeในhook_preprocess_nodeฉันโง่! ฉันสงสัยว่าอะไรเช่นhook_field_formatter_view_alter()นี้มีอยู่ใน D8 ...
Pebbl

ฉันยังไม่เห็นอะไรเลย ... แต่จากนั้นทุกอย่างจะถูกแปลงเป็นปลั๊กอินใน D8 (ฉันไม่แน่ใจเกี่ยวกับฟิลด์) ดังนั้นอาจเป็นไปได้ว่าคุณสามารถแทนที่คลาสที่มีอยู่เพื่อทำงานให้เสร็จ . นี่คือความหวัง!
ไคลฟ์

1
@Clive คุณได้พบการเปลี่ยนแปลงเวทย์มนตร์เบ็ดของคุณที่กล่าวถึงที่นี่เพื่อ D7?
tyler.frankenstein

คำตอบ:


11

คำถามที่กล่าวว่าhook_field_formatter_view()เป็นเพียงการเรียกโมดูลที่มา hook_field_formatter_info_alter()แต่คุณสามารถเป็นเจ้าของการจัดรูปแบบข้อมูลผ่านทาง

คุณควรจะสามารถตั้งค่าmoduleคีย์ของตัวจัดรูปแบบเป็น MYMODULE เช่น:

function MYMODULE_field_formatter_info_alter(&$info) {
  $info['some_field_formatter']['module'] = 'MYMODULE';
}

จากนั้นคุณสามารถนำไปใช้MYMODULE_field_formatter_view()หรือป้อนผ่านโมดูลที่มีอยู่ซึ่งจัดการมันเพื่อรับองค์ประกอบที่จะเปลี่ยนแปลง

function MYMODULE_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  // Your custom logic
  $element = OTHER_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display);
  // Any alterations
}

คุณอธิบายรายละเอียดเกี่ยวกับคำตอบของคุณได้ไหม? ระบุรหัสหรือไม่
สกอตต์ Joudry

วิธีแก้ปัญหาที่ดีฉันแทบจะไม่คิดว่าจะได้ครอบครองธุรกิจโมดูลอื่นทั้งหมด (และถ่ายทอดกลับหลังการเปลี่ยนแปลง) ... แค่ลองใช้มันและฉันก็จบลงด้วยรหัสที่ง่ายกว่ามาก ไชโย!
Pebbl

1
@ScottJoudry ~ อาจจะคุ้มค่าที่จะสังเกตว่าหากคุณเข้ามาในวิธีนี้คุณต้องแน่ใจว่าคุณมีวิธีการสำหรับการfield_formatterทำงานทั้งหมดของ node_reference เช่นMYMODULE_field_formatter_settings_summaryและMYMODULE_field_formatter_settings_form(แม้ว่าพวกเขาจะเป็นเพียงแค่ฟังก์ชั่นพร็อกซีกลับไปที่โมดูลดั้งเดิม) end UI หยุดพักบนพาเนลโหมดการแสดงผลเมื่อพยายามค้นหาวิธีการเหล่านี้ในโมดูลที่ไม่ถูกต้อง
Pebbl

วิธีการของ Graham C นั้นน่าสนใจ แต่ต้องใช้การแทนที่มากเกินไป
milkovsky

2

ตกลงดังนั้นฉันจึงรู้ว่าทำไมการเปลี่ยนแปลงของฉัน#view_modeทั้งในhook_preprocess_nodeและhook_preprocess_fieldsไม่ทำงาน (ขอขอบคุณสำหรับไคลฟ์ชี้ให้เห็นว่าฉันได้พลาดโดยสิ้นเชิงการปรากฏตัวของ#view_modeในhook_preprocess_node )

ปัญหาของฉันเกิดจากความจริงที่ว่า#view_modeได้รับการประมวลผลและแปลงเป็น#image_styleทรัพย์สินที่ถูกต้อง- สิ่งที่ฉันได้ละเลยที่จะค้นหา

ถึงกระนั้นการเปลี่ยนค่านี้ดูเหมือนว่าหนักเกินไปซึ่งขึ้นอยู่กับว่าคุณขอแก้ไขอะไรบ้างในที่สุดฉันก็ได้รหัสทำงานแม้ว่ามันจะเปลี่ยนภาพที่แสดงผลจริง:

function HOOK_preprocess_field( &$vars ){
  $element     = &$vars['element'];
  $entity_type = !empty($element['#entity_type']) ? $element['#entity_type'] : 'unknown';
  $bundle      = !empty($element['#bundle'])      ? $element['#bundle']      : 'unknown';
  $view_mode   = !empty($element['#view_mode'])   ? $element['#view_mode']   : 'unknown';
  $field_name  = !empty($element['#field_name'])  ? $element['#field_name']  : 'unknown';
  switch ( "$entity_type:$view_mode:$bundle/$field_name" ) {
    case 'node:full:mlandingpage/field_lead_image':
      if ( !empty($vars['items']) && 
           ($subelement = &$vars['items'][0]) ) {
        if ( !empty($subelement['field_image']) && 
             ($subfield = &$subelement['field_image'][0]) ) {
          /// this needs to be set to the image_style value, not the view_mode value.
          $subfield['#image_style'] = 'grid-normal-4-cols';
        }
      }
    break;
  }
}

ข้างต้นยังไม่รู้สึกมีคารมคมคายมาก แต่อย่างน้อยก็ใช้งานได้ ฉันจะใช้คำของไคลฟ์ในความจริงที่ว่าวิธี _alter นั้นไม่มีอยู่สำหรับตัวจัดรูปแบบฟิลด์ - มันเป็นเรื่องน่าละอายที่ตัวจัดรูปแบบเป็นคุณลักษณะที่ทรงพลังอย่างยิ่งของ D7 มันจะดีกว่าถ้ามีความสามารถเพิ่มมากขึ้น

อย่างไรก็ตามหากผู้คนในอนาคตมีความคิดที่ดีกว่านี้ให้ตอบกลับ :)


0

วิธีที่ง่ายที่สุดที่จะใช้Panelizer

ถ้าไม่ได้ใช้ Panelizer แต่เริ่มต้น Drupal โหมดมุมมองหรือแสดงสวีทลองhook_field_display_alter ()หรือhook_field_display_ENTITY_TYPE_alter ()

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

วิธีนี้ใช้ได้ผลดีสำหรับฉัน ข้อเสียเพียงอย่างเดียวคือคุณอาจสับสนกับการตั้งค่าที่แตกต่างกันใน UI "จัดการจอแสดงผล"


0

https://www.drupal.org/node/2130757 เป็นตัวอย่างที่ดี hook_field_formatter_third_party_settings_form () มีประโยชน์ในการเปลี่ยนรูปแบบของ formatter field ที่มีอยู่

แต่วิธีนี้ใช้ไม่ได้กับกลุ่มเขตข้อมูล

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