Jak zmienić moduł obsługi przesyłania formularzy?

16

Z jakiegoś powodu muszę zastąpić niektóre znaki (jeśli istnieją) w każdym polu tekstowym w dowolnej formie tuż przed zapisaniem ich w bazie danych. Innymi słowy, potrzebuję haka, w którym mógłbym uzyskać wszystkie przesłane dane i zastąpić ich znaki.
Znalazłem to rozwiązanie:

function hook_form_alter($form, $form_state, $form_id) {
  $form['#submit'] = 'my_custom_submission_function';
}

Ale to nie jest dobry pomysł, ponieważ muszę też zadbać o resztę postępu przesyłania. Muszę tylko wymienić niektóre postacie. Czy jest na to jakiś haczyk? Jakie są rozwiązania?

Pedram Behroozi
źródło

Odpowiedzi:

22

$form['#submit']przechowuje tablicę modułów obsługi formularza. Podanym kodem zastępujesz go, dodając tylko swój własny. Aby uzyskać pożądany wynik, należy dodać procedurę obsługi przesyłania jako pierwszy element w tablicy w następujący sposób:

array_unshift($form['#submit'], 'mymodule_custom_submission');

Uzyskanie właściwych wartości we właściwych formach i zastąpienie niektórych znaków jest prawdopodobnie większym problemem samo w sobie. Możesz zawęzić zakres formularzy / pól, które musisz zmienić, aby upewnić się, że niczego nie zepsujesz.

Madis
źródło
2

Być może lepiej byłoby wykonać te modyfikacje podczas sprawdzania poprawności zamiast przesyłania, jak sugeruje Drupal (patrz funkcja form_set_value na https://api.drupal.org/api/drupal/includes!form.inc/function/form_set_value/7 ).

Więc w swoim hook_form_alter możesz nawet dodać go na końcu istniejących funkcji sprawdzania poprawności, jeśli chcesz:

$form['#validate'][] = 'mymodule_custom_validation';
Vishnar Tadeleratha
źródło