Tambahkan penangan kiriman khusus ke formulir

19

Bagaimana saya bisa menambahkan penangan pengiriman formulir kustom?

Saya mencoba menambahkan $form['#submit'][] = 'mymodule_form_submit';atau $form['actions']['submit']['#submit'][] = 'mymodule_form_submit';ke 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?");
}

Sepertinya drupal_set_message()tidak disebut. Saya juga mencoba membangun kembali cache, tetapi fungsinya masih belum dipanggil.

Saya menggunakan Drupal 8.2.3.

Yusef
sumber
Anda harus menunjukkan implementasi penuh dari hook_form_alter(), atau agak sulit untuk memberi tahu Anda apa yang Anda lakukan salah. Anda juga harus mengatakan bentuk mana yang ingin Anda ubah.
kiamlaluno
@kiamlaluno saya menambahkan hook_form_alter saya.
Yusef
apa kode Anda masih $ form ['tindakan'] ['kirim'] ['# kirim']? Coba ganti ['kirim'] dengan [$ aksi].
MrD

Jawaban:

25

Jika Anda menggunakan hook_form_node_form_alter()mungkin menggunakan kode contoh :

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';
    }
  }
}

dan kirimkan fungsi

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?");

}
MrD
sumber
1
$form['actions'][$action]['#submit'][]dokumentasi mana yang Anda lihat? atau apakah Anda membuat kesalahan ketik? Dalam dokumen hook_form_alter ini dikatakan $form['actions']['submit']['#submit'][].
No Sssweat
1
Menarik, ya mungkin dia perlu mengulang tindakan. Meskipun, dalam T lain ini, bagaimana Anda menerapkan penangan kirim kustom di hook_form_alter ()? itu seharusnya bekerja seperti dia melakukannya.
No Sssweat
3
Setiap bentuk memiliki struktur yang berbeda. Jadi tidak ada jawaban spesifik.
MrD
5
Lihat drupal.org/node/1901216 dan drupal.org/node/2068063 untuk lebih banyak konteks tentang mengapa loop itu diperlukan
Berdir
18

Membuat plugin handform webform khusus untuk drupal 8.

Dokumen ini menganggap Anda sudah menginstal dan mengaktifkan webform dan webform-ui

1) Buat formulir web Anda. - Buka struktur -> formulir web dan tekan tombol "+ Tambahkan formulir web". - Anda dapat menggunakan ui atau menggunakan yaml, itu terserah Anda. contoh yaml untuk formulir satu bidang yang mengambil alamat email:

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

Lekukan itu penting untuk ubi jadi pastikan Anda melakukannya dengan benar. indentasi adalah spasi.

Sekarang simpan formulir Anda.

2) Membuat plugin handform webform

Selanjutnya kita dapat membuat plugin baru yang akan muncul di bagian "Email / Penangan" saat mengedit formulir web. Saya akan menyebutnya myhandler, Anda dapat menyebutnya apa yang Anda inginkan, asalkan Anda mengganti semua menyebutkan myhandler dengan nama yang Anda pilih.

a) Buat folder baru untuk plugin Anda, lakukan ini di root drupal Anda (disebut di sini sebagai / var / www / html /) di subfolder berikut: / var / www / html / modules / Custom / myhandler

b) Buat file baru di direktori di atas bernama myhandler.info.yml dalam file ini sebagai berikut:

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

3) Buat direktori src di direktori modul Anda, misalnya: / var / www / html / modules / Kustom / myhandler / src di src buat Plugin di Plugin buat WebformHandler

(ini dapat dicapai dalam sekali pakai

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

yang akan membuat seluruh struktur dalam sekali jalan menggunakan flag -p ke mkdir.)

4) Buat file baru /var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/MyFormHandler.php

dalam file itu ikuti kode php berikut, saya telah meninggalkan pengaturan form konfigurasi sehingga Anda dapat melihat cara mengkonfigurasi plugin Anda jika diperlukan.

<?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) Aktifkan modul MyHandler Anda (menggunakan menu drush atau extended) dan kemudian buat kembali cache drupal Anda ("drush cr" dari mana saja di bawah root drupal Anda (/ var / www / html di sini) akan melakukannya jika Anda menggunakan drush)

6) edit formulir web Anda, buka "Email / Penangan" dan klik tombol "+ Tambahkan Penangan" Anda akan melihat plugin Anda terdaftar, klik Tambah Handler, Anda sekarang akan melihat kotak meminta URL pengiriman. klik tombol Simpan. Jika sesuatu tidak beres, atau tidak berfungsi, periksa log kesalahan apache, Anda mungkin menemukan sesuatu yang bermanfaat di sana.

7) Tes formulir Anda - buat pengajuan ke formulir, dan kemudian periksa log pengawas (drush ws), Anda harus melihat nilai yang dikirim kepadanya. Mereka mungkin terpotong dalam output yang Anda lihat, jangan panik, semuanya ada di sana. Apa yang Anda lakukan dengan ini sekarang terserah Anda.

Semoga ini bisa membantu seseorang. Saya menggulungnya bersama-sama dari barang-barang yang saya temukan di sekitar tempat itu dan menulisnya menjadi satu dokumen. Terima kasih kepada yang lain yang membawaku ke sini.

CptnObvious
sumber
1
Jika saya melakukannya dengan benar, satu hal kecil yang hilang dalam kode di atas untuk handler berfungsi dengan benar adalah metode submitConfigurationForm (), yang terdiri dari parent::submitConfigurationForm($form, $form_state);dan parent::applyFormStateToConfiguration($form_state);.
Hendrik
1
@ Hendrik Tidak, kamu tidak membutuhkannya. Saya telah membuat penangan baru dengan hanya submitForm()fungsi dan itu berfungsi. Semua fungsi lainnya terletak di kelas dasar dan saya tidak perlu menimpanya. Ngomong-ngomong: solusi sederhana yang cukup bagus setelah Anda mengetahuinya ;-)
RWAM
5

jika menggunakan hook_form_BASE_FORM_ID_alter di Drupal 8 core 8.4.3, saya menemukan cara-cara menambahkan custom submit handler tidak berfungsi. Ini berfungsi untuk menambahkan nama fungsi kirim penangan:

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

Dalam situasi lain, menggunakan hook_form_FORM_ID_alter di Drupal 8.4.5, saya menemukan hal di atas tidak berfungsi untuk menambahkan custom handler handler. Sebaliknya, ini berhasil:

$form['actions']['submit']['#submit'][]  = 'mymodule_submit_handler';
Anthony Fournier
sumber
1

Jawaban yang diterima tidak berfungsi untuk saya menggunakan Drupal 8.7.7, mencoba menambahkan pengajuan kiriman ke formulir dari search_api modul.

Saya mendapat kesalahan ini:

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 ...

Untuk membuatnya berfungsi, saya mengubah tanda tangan fungsi saya menjadi namespace lengkap antarmuka:

function _my_module_search_api_form_submit(array $form, Drupal\Core\Form\FormStateInterface $form_state) { ...
pengguna1359
sumber