ฉันมีแบบฟอร์มที่มีปุ่ม "ส่ง" และปุ่ม "ยกเลิก" ในhook_submit()
ฉันจะรู้ได้อย่างไรว่าคลิกปุ่มใด
ฉันมีแบบฟอร์มที่มีปุ่ม "ส่ง" และปุ่ม "ยกเลิก" ในhook_submit()
ฉันจะรู้ได้อย่างไรว่าคลิกปุ่มใด
คำตอบ:
คุณต้องใช้จากtriggering_element
$form_state['triggering_element']
วิธีที่ดีที่สุดคือการกำหนดแอตทริบิวต์ปุ่มของคุณเพื่อให้คุณสามารถมีค่านี้ใน#name
triggering_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()
ตัวจัดการการส่งแบบฟอร์มไม่ได้ดำเนินการตาม