Score:2

แบบฟอร์มที่มีปุ่มส่งสองปุ่ม

ธง th

ฉันพยายามสร้างแบบฟอร์มที่มีปุ่มส่งสองปุ่ม และแต่ละปุ่มจะใช้ฟังก์ชันที่แตกต่างกัน: ค่าเริ่มต้น ส่งแบบฟอร์ม ฟังก์ชั่นและกำหนดเอง ส่งแบบฟอร์มสิ้นสุดเซสชัน การทำงาน. ดังนั้นฉันมีรหัสนี้:

คลาส EndSessionForm ขยาย FormBase {

  /**
   * @var \Drupal
   */
  $drupal ส่วนตัว;

  ฟังก์ชั่นสาธารณะ __construct () {
    $this->drupal = ใหม่ Drupal();
  }

  /**
   * {@inheritdoc}
   */
  ฟังก์ชั่นสาธารณะ getFormId (): สตริง {
    กลับ 'end_session_form';
  }

  ฟังก์ชันสาธารณะ buildForm (อาร์เรย์ $form, FormStateInterface $form_state): อาร์เรย์ {

    // ... บางสนาม

    $แบบฟอร์ม['ส่ง'] = [
      '#type' => 'ส่ง',
      '#value' => 'ปิดเซสชั่น',
      '#name' => 'btnEnd',
    ];

    $แบบฟอร์ม['หยุด'] = [
      '#type' => 'ส่ง',
      '#value' => 'หยุดเซสชัน',
      '#name' => 'btnStop',
    ];

    คืนฟอร์ม $;
  }

  ฟังก์ชันสาธารณะ submitForm (อาร์เรย์ &$form, FormStateInterface $form_state) {
    // ฟังก์ชันเรียกด้วยปุ่ม btnEnd
  }

  ฟังก์ชันสาธารณะ submitStopForm (อาร์เรย์ &$form, FormStateInterface $form_state) {
    // ฟังก์ชั่นการโทรด้วยปุ่ม btnStop
  }
}

ให้เป็นไปตาม เอกสาร ของ Drupal 9.2.x สิ่งเดียวที่ฉันต้องทำคือเพิ่มไฟล์ #ส่ง พารามิเตอร์ไปที่ $แบบฟอร์ม['หยุด'] องค์ประกอบเช่นนี้:

$แบบฟอร์ม['หยุด'] = [
  '#type' => 'ส่ง',
  '#value' => 'หยุดเซสชัน',
  '#name' => 'btnStop',
  '#submit' => [ $this, 'submitStopForm' ] // ลิงก์ไปยังฟังก์ชันส่งที่สอง
]

แต่มันไม่ทำงาน

หลังจากพยายามและค้นคว้าหลายครั้ง ฉันพบวิธีแก้ปัญหาบางส่วนโดยเพิ่มสิ่งนี้เข้าไป สร้างแบบฟอร์ม:

$form['#submit'][] = [$this, 'submitStopForm'];

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

ขอบคุณและมีวันที่ดี!

berliner avatar
bd flag
สวัสดีและยินดีต้อนรับสู่ Drupal Answers! ฉันมีความคิดเห็นที่ไม่เกี่ยวข้องโดยตรงกับคำถามของคุณ: ตัวสร้างของคุณดูแปลกมาก โดยปกติคุณไม่จำเป็นต้องมีตัวสร้างสำหรับคลาสแบบฟอร์มหากคุณไม่ต้องการแทรกบริการ และฉันไม่เคยเห็น `new Drupal()` ที่ไหนเลยในโค้ดที่กำหนดเอง ฉันขอถามได้ไหมว่าคุณได้รับสิ่งนั้นมาจากไหนและทำไมคุณถึงใช้สิ่งนั้น
Auraylien avatar
th flag
สวัสดี @berlinern รหัสนี้ไม่ใช่รหัสที่ถูกต้องของฉัน ดังนั้นฉันจึงไม่สามารถอธิบายคำสั่ง `$this->Drupal = new Drupal()` ได้ เมื่อเราได้โปรเจกต์นี้ โปรเจกต์นี้อยู่บน Drupal 8 และเราได้อัปเดต Drupal เวอร์ชันล่าสุดหลายครั้ง ดังนั้นอาจเป็นโค้ดที่เลิกใช้แล้ว ฉันลบมันออก (และตัวสร้างด้วย) และไม่มีอะไรเปลี่ยนแปลง
berliner avatar
bd flag
จริง ๆ แล้วไม่มีการเปลี่ยนแปลงใด ๆ ;) คุณลองใช้สัญกรณ์อื่นจากเอกสารที่คุณเชื่อมโยงหรือไม่ `'::methodName'` ในกรณี
Auraylien avatar
th flag
ใช่ ฉันลองแล้ว แต่มันก็ใช้ไม่ได้เช่นกัน :(
berliner avatar
bd flag
คุณสามารถโพสต์รหัสจริงทั้งหมดของคุณสำหรับเนื้อหาของฟังก์ชันการส่งของคุณ (หรือตัวอย่างขั้นต่ำที่จำลองปัญหาของคุณ) ได้หรือไม่ มีบางอย่างแปลก ๆ อยู่ที่นั่น ควรเรียกฟังก์ชันส่งทั้งหมดที่ตั้งค่าใน `$form['#submit']` ไม่ใช่เฉพาะฟังก์ชันแรกเท่านั้น
Auraylien avatar
th flag
นั่นเป็นความผิดพลาดจากฉัน: ฉันเขียน `die()` ลงในทั้งสองพร้อมกับความคิดเห็นเพื่อทดสอบว่าฉันสามารถเข้าถึงฟังก์ชันใดได้บ้าง ดังนั้นฉันจึงไปถึง 'submitStopForm' ก่อนจากนั้นจึง 'submitForm' แต่สิ่งที่ฉันต้องการคือการเข้าถึง `submitStopForm` หรือ `submitForm` โดยทันทีขึ้นอยู่กับปุ่มและการวาง `#submit => [$this, 'submitStopForm']` ใต้พารามิเตอร์ปุ่มไม่ทำงาน
berliner avatar
bd flag
โปรดอัปเดตคำถามของคุณตามนั้น นั่นจะเพิ่มโอกาสในการได้รับคำตอบ
Kevin avatar
in flag
ใช่ โปรดเพิ่มรหัส _actual_ ที่ใช้อยู่
Score:1
ธง cn

ฉันคิดว่าคุณต้องรวมการโทรกลับของ sumbit ในอาร์เรย์อื่น หากคุณใช้สัญกรณ์ที่เรียกได้นั้น ดังนั้น:

$แบบฟอร์ม['หยุด'] = [
  '#type' => 'ส่ง',
  '#value' => 'หยุดเซสชัน',
  '#name' => 'btnStop',
  '#submit' => [ [$this, 'submitStopForm'] ] // อาร์เรย์ของ callables (ซึ่งเป็นอาร์เรย์)
];

หรือนี่

$แบบฟอร์ม['หยุด'] = [
  '#type' => 'ส่ง',
  '#value' => 'หยุดเซสชัน',
  '#name' => 'btnStop',
  '#submit' => [ 'submitStopForm' ] // อาร์เรย์ของฟังก์ชันส่ง
]

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

ฟังก์ชันสาธารณะ submitForm (อาร์เรย์ &$form, FormStateInterface $form_state) { 
    $submitButton = $form_state->getTriggeringElement(); 
    การถ่ายโอนข้อมูล ($ sumbitButton); 
}

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Form%21FormState.php/function/FormState%3A%3AgetTriggeringElement/8.2.x

Auraylien avatar
th flag
ขอบคุณสำหรับการตอบสนองของคุณ `'#submit => [ [ $this, 'submitStop' ] ]` ใช้งานได้ แต่ถ้าฉันใส่พารามิเตอร์ `#submit` บนปุ่มแรกเท่านั้น เขียนบนปุ่มที่สองไม่มีผล และวางไว้บนปุ่มแรกเปลี่ยนตัวจัดการสำหรับทั้งสองปุ่ม และถ้าฉันใช้วิธีที่สองของคุณ ปุ่มทั้งสองมีองค์ประกอบทริกเกอร์เหมือนกัน ฉันไม่เข้าใจว่าทำไม

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา