Kami baru saja memulai dengan Drupal 8 dan sangat cepat kami mengalami masalah pertama kami.
Bagaimana saya harus mengubah formulir yang ada di Drupal 8?
Kita perlu mengubah metode simpan untuk bentuk simpul untuk melakukan redirect ke halaman lain. Kami ingin mengubah bentuk simpul menjadi sesuatu seperti bentuk multistep. Setelah pengguna membuat konten baru, mereka akan dialihkan ke formulir baru (kami buat) untuk mendapatkan informasi lebih lanjut.
Kami memecahkan masalah penerapan kami hook_entity_type_alter()
.
function mymodule_entity_type_alter(&$entity_info) {
$handlers = $entity_info['node']->get('handlers');
$handlers['form']['default'] = 'Drupal\mymodule\Form\MyExtendedNodeForm';
$handlers['form']['edit'] = 'Drupal\mymodule\Form\MyExtendedNodeForm';
$entity_info['node']->set('handlers', $handlers);
}
Kami kemudian membuat kelas bentuk baru yang memperluas bentuk simpul dan mengubah metode simpan.
class MyExtendedNodeForm extends NodeForm {
public function save(array $form, FormStateInterface $form_state) {
parent::save($form, $form_state);
$node = $this->entity;
$form_state->setRedirect('entity.regions.add_form', ['nid' => $node->id()]);
}
}
Ini bekerja dengan sempurna, tetapi apakah itu baik? Jika modul lain melakukan hal yang sama, kode kami tidak dapat dieksekusi lagi.
hook_form_alter()
. Jika Anda hanya perlu mengarahkan ulang formulir, itu sudah cukup untuk menambahkan penangan pengiriman formulir yang melakukan redirect.save()
metode" sebenarnya. Apakah itu berarti mengubah cara data disimpan, atau hanya melakukan redirect? Dalam kasus pertama, jawabannya lebih kompleks.Jawaban:
Saya harus melakukan hal yang sama kemarin, dan saya masih mencari cara yang lebih Drupal 8 untuk melakukan ini, tetapi belum menemukannya. Saya akhirnya melakukannya dengan cara ini:
Saya masih sangat tertarik melakukannya dengan cara yang berbeda, modul saya terlihat sangat bersih tanpa file .module :).
sumber
Saya menggunakan Drupal 8.1.1 dan sedang mencoba mengarahkan ulang pengguna setelah mereka memodifikasi akun mereka, yaitu mengklik tombol Simpan pada halaman / user / edit. Saya awalnya mencoba ini:
Sementara itu berhasil
user_login_form
, itu tidak akan berhasiluser_form
. Karenauser_form
saya harus menggunakanSaya harap ini membantu orang lain yang menemukan masalah yang sama!
sumber
Yah saya ingin mengubah
site_information_settings
formulir untuk menambahkan beberapa bidang.Seperti Anda, saya punya pilihan di antara
hook_form_alter
(atauhook_form_FORM_ID_alter
)Ingin membuat beberapa OOP jadi saya mulai menulis layanan pelanggan rute mengubah atribut
system.site_information_settings
rute_form
.Kemudian di kelas baru saya memperpanjang
SiteInformationForm
, setelah bidang & validator mereka telah ditambahkan dan fungsi kirim diperpanjang Saya merasakan hal yang persis sama seperti Anda ... Sekarang bagaimana jika modul lain menulis ulang rute form juga untuk menggunakan kelasnya sendiri?Kembali ke awal, saya punya pilihan antara dua opsi ... sepertinya saya memilih yang salah.
hook_form_alter
Sayahook_form_FORM_ID_alter
tampaknya menjadi cara terbaik untuk mengubah bentuk yang ada.sumber
Sepertinya apa yang ingin Anda lakukan, itu tidak benar-benar mengubah metode penyimpanan, tetapi untuk mengubah arahan ketika sebuah node disimpan.
Dalam situasi ini, melakukan banyak hal seperti Drupal 7,
hook_form_alter
bersama dengan handler kustom menyerahkan (pada formulir atau tombol, tergantung pada bentuk dan persyaratan) akan menjadi solusi yang baik.Apa yang Anda jelaskan dalam pertanyaan juga berfungsi, tetapi saya akan menghindari menimpa kelas dasar, kecuali saya benar-benar ingin mengubah sesuatu di kelas.
Penggunaan metode save hanya digunakan sebagai pengirim handler, jadi tidak masuk akal untuk menimpa hanya untuk menambahkan arahan ulang.
sumber
Saya pikir metode yang lebih baik adalah masih menggunakan salah satu kait dari keluarga form_alter, melampirkan pengendali kirim, dan di dalam yang mengatur pengalihan Anda.
Kontribus memperluas kelas dasar untuk melakukan ini adalah berbulu menurut saya. Terutama karena tidak ada fungsi yang berubah, hanya mengarahkan ulang.
sumber
Anda dapat membuat EventSubscriber baru yang mendengarkan acara KernelEvents :: REQUEST, dan kemudian bereaksi ketika Anda mengirimkan formulir node, sesuatu seperti ini
Bagaimanapun cara hook_form_alter bekerja ok.
sumber
Apa yang saya temukan sejauh ini: Menerapkan kait pengubah formulir dan mencoba mengubah penangan yang valid / kirim di formulir pengait itu sendiri hanya berfungsi jika Anda mengubah penangan $ form ['# validate] / $ form [#submit']. (memanggil fungsi form_state untuk ini tidak akan berfungsi dalam bentuk mengubah kait itu sendiri)
Tetapi ketika Anda mencoba ini di dalam penangan validasi, itu cenderung berfungsi:
Ini karena bentuknya sekarang telah dibangun sepenuhnya, bukan case dalam bentuk alter hook itu sendiri.
Idenya adalah: Anda dapat menambahkan penangan validasi sebagai yang terakhir, mengevaluasi penangan lain yang ada untuk pengiriman, dan mengubahnya di sana.
Jika Anda juga ingin mengubah penangan validasi, pastikan penangan Anda berjalan sebelum yang lain dan ubah apa yang Anda inginkan dalam penangan yang valid.
Masih mencari cara yang lebih baik, saya selalu harus mengganti validasi / serah penangan untuk formulir pendaftaran pengguna. Tapi ada modul lain yang bisa merusak implementasi modul saya. Jadi modul saya harus dapat memeriksa ini, dan itu mungkin seperti ini. Saya bertanya-tanya apakah beberapa bentuk entitas setelah fungsi build ada untuk melakukan ini. (sesuatu yang berjalan ketika formulir telah selesai dan akan dikirim) (itu bukan cara yang rumit untuk kasus sederhana ini)
Memintas pengalihan metode save () tidak dimungkinkan, tetapi membatalkan pengaturan save () adalah dengan cara ini (+ terapkan sendiri). Benar, kelas lebih bagus dan menawarkan akses yang lebih mudah ke objek / etc, tetapi mengesampingkan kelas inti memang menyebabkan masalah ketika modul lain ingin menggunakannya. Itu tidak terjadi jika Anda menggunakan kode ini.
sumber
Setelah memeriksa masalah ini, inilah yang saya temukan yang sesuai dengan kasus Anda:
sumber