ฉันจะทราบได้อย่างไรว่ามีการคลิกปุ่มใด


12

ฉันมีแบบฟอร์มที่มีปุ่ม "ส่ง" และปุ่ม "ยกเลิก" ในhook_submit()ฉันจะรู้ได้อย่างไรว่าคลิกปุ่มใด


คุณกำลังพูดถึงhook_submit()หรือจัดการส่งแบบฟอร์ม? hook_submit()ตัวจัดการการส่งแบบฟอร์มไม่ได้ดำเนินการตาม
kiamlaluno

คำตอบ:


23

คุณต้องใช้จาก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


7

$form_state['clicked_button']['#value'] จะบอกให้คุณทราบว่าคลิกปุ่มใดบนแบบฟอร์ม


$form_state['clicked_button']['#value']:)
user1359

1
ฉันต้องการเพิ่มถ้าคุณต้องการฟิลด์ในแบบฟอร์มของคุณและพวกเขาไม่ได้กรอกข้อมูลดังนั้นคุณ Drupal จะโยนข้อผิดพลาดการตรวจสอบแบบฟอร์ม (form_submit ถูกเรียกหลังจาก form_validate) คุณต้องทำสิ่งนี้เช่นdevengineering.com/best-practices/drupal/ …
iStryker

นั่นเป็นจุดที่ดี!
user1359

5
ในขณะที่ "clicked_button" ยังคงใช้งานได้ถูกเลิกใช้ใน D7 และข้อเสนอแนะคือใช้ "triggering_element" แทน ฉันจำได้ว่ามีข้อผิดพลาด #ajax บางอย่าง (ฉันคิดว่า) มีเพียงรหัสที่ได้รับผลกระทบที่ใช้ "clicked_button" ดังนั้นนั่นเป็นอีกเหตุผลหนึ่งที่ใช้ "triggering_element" และหลังจากทั้งหมดมันเป็นเพียงคีย์ที่แตกต่างกันใน $ form_state
Bojan Zivanovic

1
ในขณะที่วิธีการนี้ใช้งานได้มันถูกคัดค้านและมีแนวโน้มที่จะเกิดปัญหา ดูคำตอบของ tunic สำหรับวิธีที่ถูกต้องของ Drupal 7
Alice Heaton

3

เปรียบเทียบค่าเหล่านี้ใน$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
}

ถ้าฉันจำถูกต้อง Drupal 6 $ form_state] ['X'] ตอนนี้เป็น $ form_state ['X'] ใน Drupal 7
iStryker

ทำไมคุณต้องเปรียบเทียบค่าทั้งสองนี้
iStryker

หากฟอร์มมีปุ่มส่งหลายปุ่ม การเปรียบเทียบนี้จะช่วยให้แตกต่างปุ่มที่ใช้ในการส่งแบบฟอร์มในการจัดการส่งเดียว $ form_state ['clicked_button'] ['# value'] = t ('ใช่') จะส่งผลให้ค่าที่แตกต่างกันในการตั้งค่าหลายภาษา
Shoaib Nawaz

การเปรียบเทียบเดี่ยวดีที่สุดเพื่อหลีกเลี่ยงการเปรียบเทียบภาษาทั้งหมดในการตั้งค่าหลายภาษา :)
Shoaib Nawaz

1
@iStryker ฉันไม่แน่ใจว่าคุณหมายถึงอะไรกับความคิดเห็นแรกของคุณ
kiamlaluno

3

ตั้งชื่อปุ่มด้วย#nameคุณสมบัติเช่นนี้

$form['delete'] = array(
    '#type' => 'submit',
    '#value' => t('Delete'),
    '#name' => 'delete',
);

แล้วใช้:

$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.

ดังนั้นสำหรับฟอร์มที่มีปุ่มส่งสองปุ่มเช่นนี้: $ form ['submit'] = array ('#type' => 'submit', '#name' => 'submit-1', '#value' => t ('ส่ง 1'),); $ form ['submit2'] = array ('#type' => 'submit', '#name' => 'submit-2', '#value' => t ('Submit2'),); เราแค่ต้องตรวจสอบ $ form_state-> getTriggeringElement () ['# name'] ในฟังก์ชั่น submitForm ()?
ออกุสตุส

3

อัพเดท 2016 Drupal 8

สำหรับผู้ที่ยังพยายามหาวิธีเข้าถึงเหตุการณ์ที่เกิดขึ้นที่นี่คือโซลูชัน Drupal 8

$form_state->getTriggeringElement()

สิ่งนี้จะส่งคืนอาร์เรย์ขององค์ประกอบส่งทริกเกอร์ หากคุณเพิ่มมาร์กอัปที่เรียกว่า#nameคุณจะสามารถเข้าถึงได้ด้วยวิธีต่อไปนี้

$button_clicked = $form_state->getTriggeringElement()['#name']

เหตุผลที่อยู่เบื้องหลังการเปลี่ยนแปลงนี้FormStateInterfaceคือตอนนี้เป็นreadOnlyไฟล์ที่มีเพียงคลาสที่ขยายเท่านั้นที่FormStateInterfaceสามารถเข้าถึงตัวแปรได้ ดังนั้นคุณต้องใช้วิธีgetTriggeringElement()การเข้าถึงเช่นเพื่อเข้าถึงตัวแปร


ฉันมีการอัปเดตสำหรับ Drupal 8.4.4 ในปี 2561: drupal.stackexchange.com/a/256112/1441
1359

0

ใน Drupal 8.4.4 $form_state->getTriggeringElement()['#name'];ให้คุณค่าแก่opคุณ เมื่อคุณค้นหาคีย์นั้นในอาร์เรย์ค่าของแบบฟอร์มสถานะคุณจะได้รับ#valueคีย์ขององค์ประกอบแบบฟอร์มปุ่ม - กล่าวอีกนัยหนึ่งสตริงที่ผู้ใช้ปลายทางเห็นบนปุ่มบนหน้า

ฉันไม่รู้ว่า$form_state->getValues()['op']เป็นสากลสำหรับทุกรูปแบบหรือไม่ แต่ฉันเขียนโค้ดมันยากในรูปแบบของโมดูล


0

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

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