Jak mogę dodać niestandardową procedurę obsługi przesyłania formularzy?
Próbowałem dodać $form['#submit'][] = 'mymodule_form_submit';
lub $form['actions']['submit']['#submit'][] = 'mymodule_form_submit';
do 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?");
}
Wydaje się, że drupal_set_message()
nie nazywa się. Próbowałem również odbudować pamięć podręczną, ale funkcja nadal nie jest wywoływana.
Używam Drupal 8.2.3.
hook_form_alter()
, lub nieco trudniej jest ci powiedzieć, co robisz źle. Powinieneś także powiedzieć, którą formę chcesz zmienić.Odpowiedzi:
Jeśli używasz,
hook_form_node_form_alter()
możesz użyć przykładowego kodu :i przesłać funkcję
źródło
$form['actions'][$action]['#submit'][]
jaką dokumentację przeglądasz? czy zrobiłeś literówkę? W tym dokumencie hook_form_alter jest napisane$form['actions']['submit']['#submit'][]
.Tworzenie niestandardowej wtyczki do obsługi formularzy internetowych dla drupal 8.
Ten dokument zakłada, że już zainstalowałeś i włączyłeś webform i webform-ui
1) Utwórz swój formularz internetowy. - Przejdź do struktury -> formularze internetowe i naciśnij przycisk „+ Dodaj formularz internetowy”. - Możesz użyć interfejsu użytkownika lub yaml, to zależy od ciebie. przykład yaml dla formularza z jednym polem, który przyjmuje adres e-mail:
Wcięcie jest ważne dla yaml, więc upewnij się, że dobrze to zrobisz. wcięcia są spacjami.
Teraz zapisz formularz.
2) Tworzenie wtyczki modułu obsługi formularzy internetowych
Następnie możemy utworzyć nową wtyczkę, która pojawi się w sekcji „Wiadomości e-mail / handlery” podczas edycji formularza internetowego. Nazywam to myhandler, możesz nazwać to jak chcesz, pod warunkiem, że zastąpisz wszystkie wzmianki o myhandler wybraną nazwą.
a) Utwórz nowy folder dla swojej wtyczki, zrób to w swoim katalogu głównym drupal (określanym tutaj jako / var / www / html /) w następującym podfolderze: / var / www / html / modules / Custom / myhandler
b) Utwórz nowy plik w powyższym katalogu o nazwie myhandler.info.yml w tym pliku jest następujący:
3) Utwórz katalog src w katalogu modułów, np .: / var / www / html / modules / Custom / myhandler / src in src create Plugin in Plugin create WebformHandler
(można to osiągnąć za jednym razem, używając
co sprawi, że cała struktura za jednym razem użyje flagi -p do mkdir.)
4) Utwórz nowy plik
/var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/MyFormHandler.php
w tym pliku znajduje się następujący kod php, opuściłem konfigurację formularza konfiguracji, abyś mógł zobaczyć, jak skonfigurować wtyczkę w razie potrzeby.
5) Włącz moduł MyHandler (używając menu drush lub rozszerz), a następnie odbuduj pamięć podręczną drupal („drush cr” z dowolnego miejsca pod twoim rootem drupal (/ var / www / html tutaj) by to zrobił, jeśli używasz drush)
6) edytuj swój formularz internetowy, przejdź do „E-mail / handlerów” i kliknij przycisk „+ Dodaj moduł obsługi” Powinieneś zobaczyć swoją wtyczkę na liście, kliknij przycisk Dodaj moduł obsługi, powinieneś teraz zobaczyć pole z prośbą o podanie adresu URL przesyłania. kliknij przycisk Zapisz. Jeśli coś nie wygląda dobrze lub nie działa, sprawdź dziennik błędów apache, może tam być coś pomocnego.
7) Przetestuj formularz - prześlij formularz, a następnie sprawdź dziennik nadzoru (drush ws), powinieneś zobaczyć wartości przesłane do niego. Mogą one zostać obcięte na wyjściu, które widzisz, nie panikuj, to wszystko tam jest. To, co teraz z tym zrobisz, zależy od ciebie.
Mam nadzieję, że to komuś pomoże. Zebrałem go z rzeczy znalezionych w tym miejscu i zapisałem w jednym dokumencie. Dzięki innym, którzy mnie tu dostali.
źródło
parent::submitConfigurationForm($form, $form_state);
iparent::applyFormStateToConfiguration($form_state);
.submitForm()
funkcją i działa. Wszystkie pozostałe funkcje znajdują się w klasie bazowej i nie muszę ich zastępować. Nawiasem mówiąc: całkiem fajne proste rozwiązanie, gdy sięjeśli korzystam z hook_form_BASE_FORM_ID_alter w Drupal 8 core 8.4.3, zauważyłem, że sposoby dodawania niestandardowego modułu obsługi przesyłania nie działały. Działa to w przypadku dodawania nazwy funkcji obsługi modułu wysyłania:
W innej sytuacji, używając hook_form_FORM_ID_alter w Drupal 8.4.5, stwierdziłem, że powyższe nie działało w przypadku dodawania niestandardowego modułu obsługi przesyłania. Zamiast tego zadziałało:
źródło
Przyjęta odpowiedź nie działała dla mnie przy użyciu Drupal 8.7.7, próbując dodać
search_api
moduł obsługi przesłania do formularza z modułu.Mam ten błąd:
Aby to działało, zmieniłem sygnaturę funkcji na pełną przestrzeń nazw interfejsu:
źródło