คุณใช้ตัวจัดการการส่งแบบกำหนดเองใน hook_form_alter () ได้อย่างไร


16

ฉันได้อัปเดตหนึ่งในโมดูล Drupal 7 เป็น 8 และฉันมีปัญหากับการเปลี่ยนแปลงแบบฟอร์มของฉัน ฉันกำลังเพิ่มฟังก์ชั่นการตรวจสอบความถูกต้องและตัวจัดการการส่ง ฟังก์ชั่นการตรวจสอบความถูกเรียกว่าใช้ได้ แต่ฟังก์ชั่นส่งไม่เริ่มทำงาน ฉันสงสัยว่าสิ่งนี้หมายความว่ามีวิธี Symfony สไตล์ที่ต้องดำเนินการเพื่อเพิ่มตัวจัดการการส่งไปยังแบบฟอร์มที่มีอยู่ ฉันทำการค้นหาจำนวนมากและไม่พบตัวอย่างใด ๆ เลย ยังดูถึงโมดูล D8 ที่กำลังทำงานอยู่บางส่วน แต่ฉันไม่พบตัวอย่างการทำงานที่นั่นด้วยเช่นกัน

ไม่มีใครมีความคิดใด ๆ ว่าวิธีที่ถูกต้องของ Drupal 8 คืออะไร?


2
คุณควรโพสต์รหัสที่มีอยู่ของคุณเพื่อให้ผู้อื่นสามารถตรวจสอบและดูปัญหา / แนะนำทางเลือกอื่น ๆ
Yuriy Babenko

มีตั้งแต่ D8 beta9, getters และ setters สำหรับตัวจัดการการส่ง แต่ฉันไม่สามารถทำให้พวกมันทำงานได้และใช้คำตอบด้านล่าง ฉันหวังว่าโหนดอินเทอร์เฟซจะได้รับการจัดกิจกรรมบางอย่างในอนาคตเนื่องจากฉันต้องการสมัครรับกิจกรรมมากกว่าใช้เบ็ด
Alex Finnarn

คำตอบ:


13

ตามตัวอย่างในเอกสารมันเหมือนกับ Drupal 7:

$form['actions']['submit']['#submit'][] = 'mymodule_upload_enabled_types_submit';

คุณสามารถค้นหาตรรกะ (ทำงาน) ที่คล้ายกันได้

และอีกสองสามคนนอกจากนี้


1
ฉันไม่สามารถโต้เถียงกับเอกสาร API อาจมีบางอย่างที่สับสนกับการใช้งานของฉันฉันจะขุดลึกลงไป
Arbee

ดูการอัปเดตของฉันด้านบนนอกเหนือจาก $ form ['actions'] ['submit'] นอกจากนี้ยังมี $ form ['actions'] ['เผยแพร่'] และ ['unpublish'] ส่วนที่สามารถแนบตัวจัดการการส่งได้
Arbee

ฉันต้องใช้ $ form ['actions'] ['เผยแพร่'] ['# submit'] [] แทน $ form ['actions'] ['submit'] ['# submit'] [] สำหรับ handler submit เพื่อทำงานเมื่อโหนดถูกเผยแพร่ อย่างไรก็ตามฉันไม่สามารถเรียกกลับให้ทำงานได้เมื่อมีการบันทึกโหนดเป็นครั้งแรกโดยไม่ถูกเผยแพร่
Alex Finnarn

6

คุณสามารถเพิ่มจำนวนตัวจัดการการส่งที่คุณต้องการโดยใช้รหัสต่อไปนี้:

 $form['actions']['submit']['#submit'][] = 'mymodule_what_ever_function';

หากคุณต้องการเพิ่มตัวจัดการการส่งหลังจากตัวจัดการการส่งเริ่มต้น (ตัวจัดการการส่งที่จะถูกเรียกหลังจากการส่งการเรียกกลับ) คุณสามารถใช้สิ่งต่อไปนี้

$form['#submit'][1] = test_function;

หากต้องการลบตัวจัดการการส่ง:

unset($form["actions"]['submit']);

3

ลักษณะการทำงานอาจเปลี่ยนแปลงหรือแตกต่างจากกรณีเป็นกรณี ด้วยแบบฟอร์มยืนยันการลบโหนดหลายรายการ

$form['actions']['submit']['#submit'][] = 'mymodule_upload_enabled_types_submit';

รหัสของ @ Clive ทำให้ Drupal เพิกเฉยต่อตัวจัดการหลัก ในกรณีนี้เพิ่มตัวจัดการไปยัง$form['#submit']ส่วน:

$form['#submit'][] = 'mymodule_upload_enabled_types_submit';

1

ต่อไปนี้เป็นวิธีแนบตัวจัดการการส่งแบบกำหนดเองไปยังแบบฟอร์มการเพิ่ม / แก้ไขโหนดบทความใน Drupal 8:

<?php

use Drupal\Core\Form\FormStateInterface;

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  // Use this to reveal the form id.
  //drupal_set_message($form_id);

  // Use this with the devel module to inspect the button action(s).
  //kint($form['actions']);

  switch ($form_id) {

    case 'node_article_form':      // New article nodes.
    case 'node_article_edit_form': // Existing article nodes.

      // Attach our custom submit handler.
      $form['actions']['publish']['#submit'][] = 'my_module_node_article_form_submit';
      break;

  }

}

function my_module_node_article_form_submit($form, FormStateInterface $form_state) {
  drupal_set_message('Running custom submit handler...');
}

ฉันไม่สามารถผนวกตัวจัดการการส่งที่กำหนดเองได้สำเร็จ$form['#submit']และทำให้ฟังก์ชันใช้งานได้อย่างถูกต้อง ฉันต้องแนบมันอย่างชัดเจนกับปุ่มบันทึกและเผยแพร่เมื่อสร้างบทความใหม่และแนบไปที่ปุ่มบันทึกและเผยแพร่ต่อเมื่อทำการแก้ไขบทความที่มีอยู่

นอกจากนี้ยังpublishมีการกระทำของปุ่มอื่น ๆ ที่มี:

unpublish
preview
delete

ผมอยู่ใน Drupal 8.7.3 และmy_module_node_article_form_submit($form, FormStateInterface $form_stateให้ฉันTypeError: Argument 2 passed to _ccad_content_log_webform_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given; เปลี่ยนมันเพื่อ_submit($form, $form_state)แก้ไขข้อผิดพลาด
user1359
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.