Jak zaimplementować niestandardową procedurę obsługi przesyłania w hook_form_alter ()?

15

Zaktualizowałem jeden z moich modułów Drupal 7 do 8 i mam problem ze zmianą formularza. Dodaję funkcję sprawdzania poprawności i moduł obsługi przesyłania. Funkcja sprawdzania poprawności jest dobrze wywoływana, ale funkcja wysyłania się nie uruchamia. Zastanawiam się, czy to oznacza, że ​​istnieje podejście w stylu Symfony, które należy zastosować, aby dodać procedury obsługi przesyłania do istniejących formularzy. Przeprowadziłem wiele poszukiwań i nie mogę znaleźć żadnych przykładów. Przeglądałem również niektóre moduły D8 w toku, ale tak naprawdę nie znalazłem tam żadnych działających przykładów.

Czy ktoś ma pojęcie, jaki jest właściwy sposób Drupala 8?

Arbee
źródło
2
Powinieneś opublikować swój istniejący kod, aby ludzie mogli go obejrzeć i znaleźć wszelkie problemy / zasugerować alternatywy.
Jurij Babenko,
Od wersji D8 beta9 istnieją moduły pobierające i ustawiające moduły obsługujące przesyłanie, ale nie mogłem ich zmusić do działania i skorzystałem z poniższej odpowiedzi. Mam nadzieję, że interfejs węzła wywoła pewne zdarzenia w przyszłości, ponieważ wolę subskrybować zdarzenie niż użyć haka.
Alex Finnarn

Odpowiedzi:

13

Zgodnie z przykładem w dokumentacji jest taki sam, jak w przypadku Drupal 7:

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

Możesz znaleźć podobną (działającą) logikę

I jeszcze kilka innych.

Clive
źródło
1
Nie mogę się kłócić z dokumentami API. Prawdopodobnie coś nieprzyjemnego z moją realizacją, zagłębię się głębiej.
Arbee
Zobacz moją aktualizację powyżej, oprócz $ form [„akcje”] [„wyślij”] istnieją również sekcje $ form [„akcje”] [„opublikuj”] i [„cofnij publikację”], które mogą mieć dołączone procedury obsługi przesyłania.
Arbee,
Musiałem użyć $ form ['akcje'] ['opublikować'] ['# przesłać'] [] zamiast $ form ['akcje'] ['przesłać'] ['# przesłać'] [] dla mojego programu obsługi przesyłania do pracy, gdy węzeł został opublikowany. Nie mogę jednak sprawić, by wywołanie zwrotne zadziałało, gdy węzeł zostanie zapisany jako niepublikowany.
Alex Finnarn
6

Możesz dodać, ile chcesz przesłać obsługi, używając następującego kodu:

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

Jeśli chcesz dodać moduł obsługi przesyłania po domyślnym module obsługi przesyłania (program obsługi przesyłania, który zostanie wywołany po wywołaniu zwrotnym przesyłania), możesz użyć następujących opcji.

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

Aby usunąć moduł obsługi przesyłania:

unset($form["actions"]['submit']);
DEVARAJ JOHNSON
źródło
3

Zachowanie jest zmienione lub różni się w zależności od przypadku. Za pomocą formularza potwierdzenia wielokrotnego usunięcia węzła

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

@ Kod Clive'a powoduje, że Drupal ignoruje główny moduł obsługi. W takim przypadku dodaj moduł obsługi do $form['#submit']sekcji:

$form['#submit'][] = 'mymodule_upload_enabled_types_submit';
ratownik
źródło
1

Oto jak dołączyć niestandardową procedurę obsługi przesyłania do formularza dodawania / edycji węzła artykułu w 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...');
}

Nie byłem w stanie z powodzeniem dołączyć niestandardowej procedury obsługi przesyłania $form['#submit']i mieć poprawnie uruchomionej funkcji. I miał jawnie dołączyć go do zapisania i publikacji przycisku podczas tworzenia nowego artykułu, i dołączyć go do Zachowaj i zachować opublikowany przycisku podczas edycji istniejącego artykułu.

Poza tym publishoto niektóre z innych dostępnych akcji przycisków:

unpublish
preview
delete
tyler.frankenstein
źródło
Jestem w Drupal 8.7.3 i my_module_node_article_form_submit($form, FormStateInterface $form_statedałem mi TypeError: Argument 2 passed to _ccad_content_log_webform_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given; zmieniając go, aby _submit($form, $form_state)naprawić błędy.
użytkownik1359