เพิ่มตัวจัดการการส่งที่กำหนดเองไปยังแบบฟอร์ม


19

ฉันจะเพิ่มตัวจัดการการส่งแบบฟอร์มที่กำหนดเองได้อย่างไร

ฉันพยายามที่จะเพิ่ม$form['#submit'][] = 'mymodule_form_submit';หรือจะ$form['actions']['submit']['#submit'][] = 'mymodule_form_submit';hook_form_alter()

use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\HttpFoundation\Request;

function MYMODULE_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if ($form_id == 'node_trends_form' || $form_id == 'node_trends_edit_form') {
    foreach (array_keys($form['actions']) as $action) {
      if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
        $form['actions']['submit']['#submit'][] = 'mymodule_form_submit';
      }
    }
  }
}
function mymodule_form_submit(array $form, FormStateInterface $form_state){
    //die("why won't this execute? :(");
    drupal_set_message("Why won't this message show?");
}

ดูเหมือนว่าdrupal_set_message()จะไม่ถูกเรียก ฉันพยายามสร้างแคชใหม่ แต่ฟังก์ชันยังไม่ถูกเรียกใช้

ฉันกำลังใช้ Drupal 8.2.3


คุณควรแสดงให้เห็นถึงการนำไปปฏิบัติอย่างเต็มรูปแบบhook_form_alter()หรือยากกว่าที่จะบอกคุณว่าคุณทำอะไรผิด นอกจากนี้คุณควรบอกว่าคุณกำลังพยายามแก้ไขฟอร์มใด
kiamlaluno

@kiamlaluno ฉันเพิ่ม hook_form_alter ของฉัน
Yusef

รหัสของคุณคืออะไรในรูปแบบ $ ['actions'] ['ส่ง'] ['# ส่ง'] ลองแทนที่ ['ส่ง'] ด้วย [$ action]
MrD

คำตอบ:


25

หากคุณใช้hook_form_node_form_alter()อาจใช้รหัสตัวอย่าง :

function mymodule_form_node_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  foreach (array_keys($form['actions']) as $action) {
    if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
      $form['actions'][$action]['#submit'][] = 'mymodule_form_submit';
    }
  }
}

และส่งฟังก์ชั่น

function mymodule_form_submit(array $form, FormStateInterface $form_state){
    //die("I'm not getting run, why :(");
    drupal_set_message("Why won't this message show?");

}

1
$form['actions'][$action]['#submit'][]คุณกำลังดูเอกสารอะไร หรือคุณพิมพ์ผิด? ในการนี้hook_form_alter doc $form['actions']['submit']['#submit'][]ก็กล่าวว่า
ไม่มี Sssweat

1
ไม่มันคือhook_form_BASE_FORM_ID_alter ()
MrD

1
น่าสนใจใช่เขาอาจต้องวนผ่านการกระทำ แม้ว่าใน Q อื่น ๆ นี้คุณจะใช้ตัวจัดการการส่งแบบกำหนดเองใน hook_form_alter () ได้อย่างไร มันควรที่จะทำงานในแบบที่เขากำลังทำอยู่
ไม่มี Sssweat

3
แต่ละแบบฟอร์มมีโครงสร้างที่แตกต่างกัน ดังนั้นจึงไม่มีคำตอบเฉพาะ
MrD

5
ดูdrupal.org/node/1901216และdrupal.org/node/2068063สำหรับบริบทเพิ่มเติมเกี่ยวกับสาเหตุที่ลูปนั้นมีความจำเป็น
Berdir

18

การสร้างปลั๊กอินตัวจัดการเว็บฟอร์มที่กำหนดเองสำหรับ drupal 8

เอกสารนี้จะถือว่าคุณได้ติดตั้งและเปิดใช้งาน webform และ webform-ui แล้ว

1) สร้างเว็บฟอร์มของคุณ - ไปที่โครงสร้าง -> เว็บฟอร์มและกดปุ่ม "+ เพิ่มเว็บฟอร์ม" - คุณสามารถใช้ ui หรือใช้ yaml ได้ขึ้นอยู่กับคุณ ตัวอย่าง yaml สำหรับฟอร์มฟิลด์เดียวที่ใช้ที่อยู่อีเมล:

email:
  '#type': email
  '#title': email
  '#title_display': invisible
  '#placeholder': 'ENTER YOUR EMAIL'
  '#attributes':
    class:
      - my-ip

การเยื้องเป็นสิ่งสำคัญสำหรับ yaml ดังนั้นให้แน่ใจว่าคุณทำให้ถูกต้อง เยื้องเป็นช่องว่าง

ตอนนี้บันทึกฟอร์มของคุณ

2) การสร้างปลั๊กอินตัวจัดการเว็บฟอร์ม

ต่อไปเราสามารถสร้างปลั๊กอินใหม่ซึ่งจะแสดงในส่วน "อีเมล / ตัวจัดการ" เมื่อแก้ไขเว็บฟอร์ม ฉันจะเรียกมันว่า myhandler คุณสามารถเรียกมันว่าสิ่งที่คุณต้องการหากคุณแทนที่ myhandler ทั้งหมดด้วยชื่อที่คุณเลือก

a) สร้างโฟลเดอร์ใหม่สำหรับปลั๊กอินของคุณทำในรูท drupal ของคุณ (เรียกที่นี่ว่า / var / www / html /) ในโฟลเดอร์ย่อยต่อไปนี้: / var / www / html / modules / Custom / myhandler

b) สร้างไฟล์ใหม่ในไดเรกทอรีด้านบนชื่อ myhandler.info.yml ในไฟล์นี้ไปต่อไปนี้:

name: My Form Handler
description: handles form submits, does something with them. 
package: Custom
type: module
version: 1.0
core: 8.x

3) สร้างไดเรกทอรี src ในไดเรกทอรีโมดูลของคุณเช่น: / var / www / html / modules / กำหนดเอง / myhandler / src ใน src สร้างปลั๊กอินในปลั๊กอินสร้าง WebformHandler

(สามารถทำได้ในครั้งเดียวที่ใช้

mkdir -p /var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/ 

ซึ่งจะทำให้โครงสร้างทั้งหมดในครั้งเดียวโดยใช้แฟล็ก -p เพื่อ mkdir)

4) สร้างไฟล์ใหม่ /var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/MyFormHandler.php

ในไฟล์นั้นไปที่รหัส php ต่อไปนี้ฉันได้ออกจากการตั้งค่ารูปแบบเพื่อให้คุณสามารถดูวิธีการกำหนดค่าปลั๊กอินของคุณหากจำเป็น

<?php
namespace Drupal\myhandler\Plugin\WebformHandler;

use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Serialization\Yaml;
use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\Plugin\WebformHandlerBase;
use Drupal\webform\webformSubmissionInterface;


/**
 * Form submission handler.
 *
 * @WebformHandler(
 *   id = "myhandler_form_handler",
 *   label = @Translation("MyHandler form handler"),
 *   category = @Translation("Form Handler"),
 *   description = @Translation("Do something extra with form submissions"),
 *   cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_SINGLE,
 *   results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
 * )
 */
class MyFormHandler extends WebformHandlerBase {

     /**
       * {@inheritdoc}
       */

     public function defaultConfiguration() {
        return [
            'submission_url' => 'https://api.example.org/SOME/ENDPOINT',
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
        $form['submission_url'] = [
            '#type' => 'textfield',
            '#title' => $this->t('Submission URL to api.example.org'),
            '#description' => $this->t('The URL to post the submission data to.'),
            '#default_value' => $this->configuration['submission_url'],
            '#required' => TRUE,
        ];
        return $form;
    }



  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {
    // Your code here.
        // Get an array of the values from the submission.

        $values = $webform_submission->getData();

        // Get the URL to post the data to.
        $post_url = $this->configuration['submission_url'];

        $message = "MyHandler got form data:".print_r($values,1); 
        \Drupal::logger('myformhandler')->error($message);

        return true;
 }
}   
?>

5) เปิดใช้งานโมดูล MyHandler ของคุณ (โดยใช้ drush หรือเมนูขยาย) จากนั้นสร้างแคช drupal ใหม่ ("drush cr" จากที่ใดก็ได้ภายใต้รูท drupal ของคุณ (/ var / www / html ที่นี่) หากคุณใช้ drush)

6) แก้ไขเว็บฟอร์มของคุณไปที่ "อีเมล / ผู้จัดการ" และคลิกที่ปุ่ม "+ เพิ่มตัวจัดการ" คุณจะเห็นปลั๊กอินของคุณอยู่ในรายการคลิกเพิ่มตัวจัดการตอนนี้คุณควรจะเห็นกล่องขอ URL การส่ง คลิกปุ่มบันทึก หากสิ่งที่ไม่ถูกต้องหรือไม่ทำงานให้ตรวจสอบบันทึกข้อผิดพลาด apache คุณอาจพบสิ่งที่เป็นประโยชน์

7) ทดสอบแบบฟอร์มของคุณ - ส่งแบบฟอร์มจากนั้นตรวจสอบบันทึกการเฝ้าสังเกต (ดูรายละเอียด) คุณควรเห็นค่าที่ส่งไป พวกเขาอาจถูกตัดทอนในผลลัพธ์ที่คุณเห็นไม่ต้องตกใจมันมีทั้งหมด สิ่งที่คุณทำตอนนี้ขึ้นอยู่กับคุณ

หวังว่านี่จะช่วยใครซักคน ฉันปูด้วยกันจากสิ่งของที่ฉันพบรอบ ๆ สถานที่และเขียนลงในเอกสารชิ้นเดียว ขอบคุณคนอื่น ๆ ที่มาหาฉันที่นี่


1
ถ้าฉันได้รับมันขวาสิ่งหนึ่งที่เล็ก ๆ น้อย ๆ ที่ขาดหายไปในโค้ดข้างต้นสำหรับการจัดการในการทำงานได้อย่างถูกต้องเป็น submitConfigurationForm () วิธีการประกอบและparent::submitConfigurationForm($form, $form_state); parent::applyFormStateToConfiguration($form_state);
Hendrik

1
@Hendrik ไม่คุณไม่ต้องการมัน ฉันได้สร้างตัวจัดการใหม่ด้วยsubmitForm()ฟังก์ชั่นเท่านั้นและใช้งานได้ ฟังก์ชั่นอื่น ๆ ทั้งหมดตั้งอยู่ในคลาสฐานและฉันไม่จำเป็นต้องแทนที่พวกเขา โดยวิธีการ: ทางออกที่ดีค่อนข้างง่ายเมื่อคุณคิดออก ;-)
RWAM

5

หากใช้ hook_form_BASE_FORM_ID_alter ใน Drupal 8 core 8.4.3 ฉันพบวิธีการเพิ่มตัวจัดการการส่งที่กำหนดเองไม่ทำงาน สิ่งนี้ใช้สำหรับการเพิ่มชื่อฟังก์ชั่นส่งตัวจัดการ:

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

ในสถานการณ์อื่นการใช้ hook_form_FORM_ID_alter ใน Drupal 8.4.5 ฉันพบว่าข้างต้นใช้งานไม่ได้สำหรับการเพิ่มตัวจัดการการส่งที่กำหนดเอง สิ่งนี้ใช้ได้ผล:

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

1

คำตอบที่ยอมรับนั้นใช้ไม่ได้กับฉันโดยใช้ Drupal 8.7.7 พยายามเพิ่มตัวจัดการการส่งไปยังแบบฟอร์มจากsearch_apiโมดูล

ฉันได้รับข้อผิดพลาดนี้:

TypeError: Argument 2 passed to _my_module_search_api_form_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given in ...

เพื่อให้มันทำงานได้ฉันเปลี่ยนฟังก์ชันของฉันเป็นเนมสเปซเต็มรูปแบบของอินเทอร์เฟซ:

function _my_module_search_api_form_submit(array $form, Drupal\Core\Form\FormStateInterface $form_state) { ...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.