Hook_form_alter () içine özel bir gönderme işleyicisi nasıl uygulanır?


15

Drupal 7 modüllerimden birini 8'e güncelliyorum ve form değişikliğimle ilgili bir sorun yaşıyorum. Bir doğrulama işlevi ve bir gönderme işleyicisi ekliyorum. Doğrulama işlevi iyi olarak adlandırılıyor, ancak gönderme işlevi tetiklenmiyor. Bunun, mevcut formlara gönderme işleyicileri eklemek için alınması gereken Symfony tarzı bir yaklaşım olup olmadığını merak ediyorum. Çok fazla arama yaptım ve örnek bulamıyorum. Ayrıca bazı yapım aşamasında olan D8 modüllerine de baktım ama orada da hiçbir çalışma örneği bulamadım.

Bunu yapmak için doğru Drupal 8 yolunun ne olduğu hakkında bir fikri olan var mı?


2
Mevcut kodunuzu, insanların ona göz atabilmesi ve sorunları tespit edebilmesi / alternatif önerebilmesi için göndermelisiniz.
Yuriy Babenko

D8 beta9'dan itibaren gönderici işleyiciler için alıcılar ve ayarlayıcılar var, ancak onları çalıştıramadım ve aşağıdaki cevabı kullanamadım. Bir arayüze bir kanca kullanmaktan ziyade abone olmayı tercih ettiğim için, düğüm arayüzünün gelecekte gönderilecek bazı olayları almasını umuyorum.
Alex Finnarn

Yanıtlar:


13

Belgelerdeki örneğe göre, Drupal 7 ile aynı:

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

Benzer (çalışan) mantığı şurada bulabilirsiniz:

Ve birkaç kişi daha.


1
API dokümanlarıyla tartışamıyorum. Muhtemelen benim uygulamamda berbat bir şey, daha derine ineceğim.
Arbee

Yukarıdaki güncellememe bakın, $ form ['actions'] ['send'] dışında $ form ['actions'] ['yayınla'] ve ['yayınla'] bölümleri de eklenebilir.
Arbee

Gönderme işleyicim için $ form ['actions'] ['gönder'] ['# gönder'] [] yerine $ form ['actions'] ['yayınla]] [' # gönder '] [] kullanmak zorunda kaldım Düğüm yayınlandığında çalışmak. Ancak, düğüm ilk yayımlanmamış olarak kaydedildiğinde, geri çağrıyı çalıştıramıyorum.
Alex Finnarn

6

Aşağıdaki kodu kullanarak kaç gönderme işleyicisi istediğinizi ekleyebilirsiniz:

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

Varsayılan gönderme işleyicisinden sonra bir gönderme işleyicisi eklemek istiyorsanız (geri gönderme işleminden sonra çağrılacak bir gönderme işleyicisi), aşağıdakileri kullanabilirsiniz.

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

Gönderme işleyicisini kaldırmak için:

unset($form["actions"]['submit']);

3

Davranış ya değiştirilir ya da durumdan duruma değişir. Düğüm Birden Çok Silme onay formu ile

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

@ Clive'nin kodu Drupal'ın ana işleyiciyi yoksaymasına neden olur. Bu durumda, işleyiciyi $form['#submit']bölüme ekleyin :

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

1

Drupal 8'deki makale düğümü ekleme / düzenleme formuna nasıl özel bir gönderme işleyicisi ekleyeceğiniz aşağıda açıklanmıştır:

<?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...');
}

Başarıyla özel bir gönderme işleyicisi ekleyemedim $form['#submit']ve işlevinin düzgün şekilde çalışmasını sağlayamadım . Ben vardı açıkça takmak için Kaydet ve yayımlamak yeni bir yazı oluştururken düğmesini ve ekleyin Kaydet ve yayınlanan tutmak varolan makale düzenlerken düğmesini.

Ayrıca publish, mevcut diğer düğme eylemlerinden bazıları:

unpublish
preview
delete

Drupal 8.7.3'teyim ve my_module_node_article_form_submit($form, FormStateInterface $form_statebana verdim TypeError: Argument 2 passed to _ccad_content_log_webform_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given; değiştirmeyi _submit($form, $form_state)sabit hatalar.
user1359
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.