ฉันมีแบบฟอร์มที่มีปุ่ม "ส่ง" และปุ่ม "ยกเลิก" ในhook_submit()ฉันจะรู้ได้อย่างไรว่าคลิกปุ่มใด
ฉันมีแบบฟอร์มที่มีปุ่ม "ส่ง" และปุ่ม "ยกเลิก" ในhook_submit()ฉันจะรู้ได้อย่างไรว่าคลิกปุ่มใด
คำตอบ:
คุณต้องใช้จากtriggering_element$form_state['triggering_element']
วิธีที่ดีที่สุดคือการกำหนดแอตทริบิวต์ปุ่มของคุณเพื่อให้คุณสามารถมีค่านี้ใน#nametriggering_element
ตัวอย่างเช่น:
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
หากคุณไม่ได้กำหนดแอตทริบิวต์นี้triggering_elementจะถือปุ่ม#value(ข้อความที่ผู้ใช้สามารถอ่านได้) แต่สิ่งนี้จะหมดกำลังใจเนื่องจากโมดูลอื่นอาจเปลี่ยนค่านี้หรือเปลี่ยนแปลงโดยการโลคัลไลเซชัน)
คุณอาจจะใช้$form_state['clicked_button']เกินไป แต่นี้จะเลิกใช้
คุณสามารถอ่านข้อมูลเพิ่มเติมได้ที่หน้าเอกสารของฟังก์ชันdrupal_build_form
$form_state['clicked_button']['#value'] จะบอกให้คุณทราบว่าคลิกปุ่มใดบนแบบฟอร์ม
$form_state['clicked_button']['#value']:)
เปรียบเทียบค่าเหล่านี้ใน$form_stateฉันได้ทำใน Drupal 6 และจะเหมือนกันใน Drupal7
if($form_state['values']['ok'] == $form_state]['clicked_button']['#value']){
//Process if OK is pressed
}else if($form_state['values']['cancel'] == $form_state]['clicked_button']['#value']) {
//Process if Cancel is pressed
}
ตั้งชื่อปุ่มด้วย#nameคุณสมบัติเช่นนี้
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
แล้วใช้:
$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.
สำหรับผู้ที่ยังพยายามหาวิธีเข้าถึงเหตุการณ์ที่เกิดขึ้นที่นี่คือโซลูชัน Drupal 8
$form_state->getTriggeringElement()
สิ่งนี้จะส่งคืนอาร์เรย์ขององค์ประกอบส่งทริกเกอร์ หากคุณเพิ่มมาร์กอัปที่เรียกว่า#nameคุณจะสามารถเข้าถึงได้ด้วยวิธีต่อไปนี้
$button_clicked = $form_state->getTriggeringElement()['#name']
เหตุผลที่อยู่เบื้องหลังการเปลี่ยนแปลงนี้FormStateInterfaceคือตอนนี้เป็นreadOnlyไฟล์ที่มีเพียงคลาสที่ขยายเท่านั้นที่FormStateInterfaceสามารถเข้าถึงตัวแปรได้ ดังนั้นคุณต้องใช้วิธีgetTriggeringElement()การเข้าถึงเช่นเพื่อเข้าถึงตัวแปร
ใน Drupal 8.4.4 $form_state->getTriggeringElement()['#name'];ให้คุณค่าแก่opคุณ เมื่อคุณค้นหาคีย์นั้นในอาร์เรย์ค่าของแบบฟอร์มสถานะคุณจะได้รับ#valueคีย์ขององค์ประกอบแบบฟอร์มปุ่ม - กล่าวอีกนัยหนึ่งสตริงที่ผู้ใช้ปลายทางเห็นบนปุ่มบนหน้า
ฉันไม่รู้ว่า$form_state->getValues()['op']เป็นสากลสำหรับทุกรูปแบบหรือไม่ แต่ฉันเขียนโค้ดมันยากในรูปแบบของโมดูล
Drupal 8.6.7
สร้างปุ่มบางอย่างเช่นด้านล่าง
$form['my_button'] = [
'#type' => 'button',
'#value' => t('Custom Button'),
'#name' => t('customButton'),
'#weight' => 0,
'#attributes' => [
'class' => ['populate-bib-button', 'btn', 'btn-primary'],
],
];
ในฟังก์ชั่นส่งของคุณได้รับชื่อปุ่มเช่นรหัสด้านล่าง
$input = $form_state->getUserInput();
print $input['_triggering_element_name']; // customButton
การเปรียบเทียบสามารถทำได้เช่น
if ($input['_triggering_element_name'] == 'customButton') {
// Do something.
}
# Drupal8
hook_submit()หรือจัดการส่งแบบฟอร์ม?hook_submit()ตัวจัดการการส่งแบบฟอร์มไม่ได้ดำเนินการตาม