ฉันจะเปลี่ยนลักษณะการทำงานของเขตข้อมูลฟอร์มที่มีอยู่ในฟิลด์ย่อหน้าได้อย่างไร


18

ใช้โมดูลย่อหน้าใน Drupal 8 ฉันพยายามเปลี่ยนพฤติกรรมของเขตข้อมูลฟอร์มที่มีอยู่ในเขตวรรค นี่คือดังนั้นฉันสามารถเพิ่มพฤติกรรมเช่นโทรกลับ AJAX ซ่อนแสดงเขตข้อมูลอื่น ๆ โดยใช้รัฐ ฯลฯ

ฉันสามารถเข้าถึงฟิลด์พาเรนต์ย่อหน้าโดยใช้ฟังก์ชันนี้:

function hook_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) { 
}

แต่ฉันจะเข้าถึงฟิลด์ภายในย่อหน้าได้อย่างไร

ฉันได้ลองhook_field_widget_form_alterแล้วแต่ไม่มีประโยชน์

ฉันจะทำสิ่งนี้ได้อย่างไร

หมายเหตุ: ฉันยังค่อนข้างใหม่ต่อการพัฒนาของ Drupal


ลองใช้วิธีนี้ในการแก้ไขของคุณkint($form);และkint($form_id);และที่ควรให้ประชาชนได้สำหรับ ID เบ็ดแก้ไขแล้วก็ยังควรให้เส้นทางอาร์เรย์สิ่งที่คุณต้องการที่จะปรับเปลี่ยน
Danny Englander

คำตอบ:


14

ตั้งแต่ย่อหน้า ^ 1.3 คุณสามารถใช้hook_field_widget_WIDGET_TYPE_form_alter () (ฉันเชื่อมโยงเวอร์ชั่น 8.2 เนื่องจากมีความคิดเห็นที่ดีเกี่ยวกับการใช้เบ็ด)

คุณสามารถดูตัวอย่างต่อไปนี้ใน modules/contrib/paragraphs/tests/modules/paragraphs_test/paragraphs_test.module

/**  
 * Implements hook_field_widget_WIDGET_TYPE_form_alter().  
 */  
function paragraphs_test_field_widget_entity_reference_paragraphs_form_alter(&$element, &$form_state, $context) {
  if ($element['#paragraph_type'] == 'altered_paragraph') {
    $element['subform']['field_text']['widget'][0]['#title'] = 'Altered title';
  }
}

6
ทราบว่าหากคุณกำลังใช้งาน "ย่อหน้าทดลอง" เครื่องมือแทน "ย่อหน้าที่คลาสสิก" จากนั้นประเภทเครื่องมือเป็นเพียงแทนparagraphs entity_reference_paragraphs
Dalin

1
บางสิ่งที่มีประโยชน์ (เพราะเป็นไปไม่ได้ที่จะดีบั๊กตะขอเหล่านี้): /* @var $paragraph \Drupal\paragraphs\Entity\Paragraph */ $paragraph = $form_state->get('paragraph'); $delta = $context['delta'];
Dalin

1

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

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

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

อย่าลืมล้างแคชเพื่อให้ Drupal ค้นหาปลั๊กอินใหม่


-1

มีแพทช์สำหรับเรื่องนี้ในฉบับคิวย่อหน้า

มันเพิ่ม hooks ใหม่:

hook_form_paragraphs_subform_alter()
hook_form_paragraphs_subform_TYPE_alter()
hook_form_paragraphs_subform_WIDGET_alter()
hook_form_paragraphs_subform_WIDGET_TYPE_alter()

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