Bagaimana Anda menerapkan penangan kirim kustom di hook_form_alter ()?

16

Saya telah memperbarui salah satu modul Drupal 7 saya ke 8 dan saya mengalami masalah dengan perubahan bentuk saya. Saya menambahkan fungsi validasi dan penangan kirim. Fungsi validasi dipanggil dengan baik, tetapi fungsi kirim tidak dipecat. Saya bertanya-tanya apakah ini berarti ada pendekatan gaya-Symfony yang perlu diambil untuk menambahkan menyerahkan penangan ke formulir yang ada. Saya telah melakukan banyak pencarian dan saya tidak dapat menemukan contoh. Juga melihat melalui beberapa modul D8 yang sedang dikerjakan tetapi saya belum benar-benar menemukan contoh yang baik di sana.

Adakah yang tahu cara Drupal 8 yang benar untuk melakukan ini?

Arbee
sumber
2
Anda harus memposting kode yang ada sehingga orang dapat melihatnya dan menemukan masalah / saran alternatif.
Yuriy Babenko
Ada, pada D8 beta9, getter dan setter untuk menyerahkan handler, tapi saya sepertinya tidak bisa membuatnya bekerja dan menggunakan jawaban di bawah ini. Saya berharap antarmuka node mendapatkan beberapa acara yang dikirim di masa depan, karena saya lebih suka berlangganan acara daripada menggunakan kail.
Alex Finnarn

Jawaban:

13

Menurut contoh dalam dokumentasi itu sama dengan untuk Drupal 7:

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

Anda dapat menemukan logika yang serupa (berfungsi) di

Dan beberapa lainnya selain itu.

Clive
sumber
1
Saya tidak bisa berdebat dengan dokumen API. Mungkin sesuatu yang kacau dengan implementasi saya, saya akan menggali lebih dalam.
Arbee
Lihat pembaruan saya di atas, selain dari $ form ['tindakan'] ['kirim'] ada juga bagian $ form ['tindakan'] ['terbitkan'] dan ['batalkan publikasi'] yang dapat menyertakan lampiran handler.
Arbee
Saya harus menggunakan $ form ['tindakan'] ['terbitkan'] ['# kirim'] [] alih-alih $ formulir ['tindakan'] ['kirim'] ['# kirim'] [] untuk penangan saya kirim handler berfungsi ketika node diterbitkan. Namun, sepertinya saya tidak bisa mendapatkan panggilan balik untuk bekerja ketika node pertama kali disimpan sebagai tidak dipublikasikan.
Alex Finnarn
6

Anda dapat menambahkan berapa banyak pengirim yang Anda inginkan menggunakan kode berikut:

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

Jika Anda ingin menambahkan penangan kirim setelah penangan kirim default, (penangan kirim yang akan dipanggil setelah kirim balik), Anda dapat menggunakan yang berikut ini.

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

Untuk menghapus pengirim handler:

unset($form["actions"]['submit']);
DEVARAJ JOHNSON
sumber
3

Perilaku tersebut dapat diubah atau berbeda dari kasus ke kasus. Dengan formulir konfirmasi Node Delete Multiple

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

Kode @ Clive menyebabkan Drupal mengabaikan pengendali utama. Dalam hal ini tambahkan pawang ke $form['#submit']bagian:

$form['#submit'][] = 'mymodule_upload_enabled_types_submit';
lifecoder
sumber
1

Berikut ini cara melampirkan handler ajukan kustom ke simpul tambah / edit bentuk artikel di 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...');
}

Saya tidak dapat dengan sukses menambahkan handler ajukan kustom ke $form['#submit']dan memiliki fungsi api dengan benar. Saya harus melampirkannya secara eksplisit ke tombol Simpan dan terbitkan saat membuat artikel baru, dan lampirkan ke tombol Simpan dan tetap terbitkan saat mengedit artikel yang ada.

Selain itu publish, berikut adalah beberapa tindakan tombol lain yang tersedia:

unpublish
preview
delete
tyler.frankenstein
sumber
Saya di Drupal 8.7.3, dan my_module_node_article_form_submit($form, FormStateInterface $form_statememberi saya TypeError: Argument 2 passed to _ccad_content_log_webform_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given; mengubahnya untuk _submit($form, $form_state)memperbaiki kesalahan.
user1359