Bagaimana cara 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?");
}
Tampaknya drupal_set_message()
tidak dipanggil. Saya juga mencoba membangun ulang cache, tetapi fungsi tersebut tetap tidak dipanggil.
Saya menggunakan Drupal 8.2.3.
Jika Anda menggunakan hook_form_node_form_alter()
dapat menggunakan contoh kode:
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?");
}
Membuat plugin handler webform kustom untuk drupal 8.
Dokumen ini mengasumsikan Anda telah menginstal dan mengaktifkan webform dan webform-ui
Buat webform Anda.
email: '#type': email '#title': email '#title_display': tidak terlihat '#placeholder': 'ENTER YOUR EMAIL' '#atribut': kelas:
Lekukan penting untuk yaml jadi pastikan Anda melakukannya dengan benar. indentasi adalah spasi.
Sekarang simpan formulir Anda.
Selanjutnya kita dapat membuat plugin baru yang akan muncul di bagian "Emails/Handlers" saat mengedit webform. Saya akan menyebutnya myhandler, Anda dapat menyebutnya apa yang Anda inginkan, asalkan Anda mengganti semua penyebutan 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 yang disebut myhandler.info.yml dalam file ini adalah sebagai berikut:
name: My Form Handler
description: handles form submits, does something with them.
package: Custom
type: module
version: 1.0
core: 8.x
(ini dapat dicapai dalam sekali jalan menggunakan
mkdir -p /var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/
yang akan membuat seluruh struktur dalam sekali jalan menggunakan flag -p untuk mkdir).
/var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/MyFormHandler.php
di file tersebut terdapat kode php berikut ini, saya telah meninggalkan pengaturan config form sehingga Anda dapat melihat bagaimana 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;
}
}
?>
Aktifkan modul MyHandler Anda (menggunakan drush atau menu extend) dan kemudian bangun 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)
edit webform Anda, pergi ke "Email / Handlers &" dan klik "+ Add Handler &" tombol Anda akan melihat plugin Anda terdaftar, klik Add Handler, Anda sekarang akan melihat kotak yang meminta url pengiriman. klik tombol Simpan. Jika ada sesuatu yang tidak terlihat benar, atau tidak berfungsi, periksa log kesalahan apache, Anda mungkin menemukan sesuatu yang bermanfaat di sana.
Uji formulir Anda - buat pengiriman ke formulir, lalu periksa log pengawas (drush ws), Anda akan melihat nilai yang dikirim ke sana. Nilai-nilai itu mungkin terpotong dalam output yang Anda lihat, jangan panik, semuanya ada di sana. Apa yang anda lakukan dengan ini sekarang terserah anda.
Semoga ini membantu seseorang. Saya mengumpulkannya dari hal-hal yang saya temukan di sekitar tempat ini dan menuliskannya ke dalam satu dokumen. Terima kasih kepada yang lain yang telah membawa saya ke sini.
jika menggunakan hook_form_BASE_FORM_ID_alter di Drupal 8 core 8.4.3, saya menemukan cara-cara menambahkan custom submit handler tidak berhasil. Ini berhasil untuk menambahkan nama fungsi submit handler:
$form['#submit'][] = 'mymodule_submit_handler';
Dalam situasi lain, menggunakan hook_form_FORM_ID_alter di Drupal 8.4.5, saya menemukan cara-cara di atas tidak berhasil untuk menambahkan custom submit handler. Sebaliknya, ini berhasil:
$form['actions']['submit']['#submit'][] = 'mymodule_submit_handler';