Jak dodać niestandardową procedurę sprawdzania poprawności do istniejącego formularza (lub pola formularza) w Drupal 8?
Mam formularz, którego nie utworzyłem. Chcę dodać własne reguły sprawdzania poprawności w niektórych polach po przesłaniu formularza.
W przypadku Drupal 7 niestandardowe sprawdzenie poprawności formularza? wyjaśnia, jak zaimplementować, hook_form_alter()
a następnie dodać moduł obsługi sprawdzania poprawności] [1] do $form['#validate']
tablicy, ale w formularzach Drupal 8 są klasy. Sprawdzanie poprawności odbywa się za pomocą validateForm()
metody i nie wiem, jak podłączyć do tego mój kod.
Odpowiedzi:
#validate
Nieruchomość jest nadal używany w Drupal 8. (Z roztworu ADI można zastąpić istniejący walidator)Jeśli chcesz dodać niestandardowy walidator oprócz domyślnego, musisz dodać coś takiego w hook_form_FORM_ID_alter (lub podobnym):
źródło
#validate
(twój link), nie należy używać go$form_state
jako tablicy (sposób D7), ale jako obiekt implementującyFormStateInterface
(sposób D8). Innymi słowy, kod w niestandardowym walidatorze powinien być analogiczny do kodu, który można znaleźć w oryginalnejvalidateForm()
metodzie.Berdir podał poprawną odpowiedź, że ograniczenie jest właściwą drogą do dodania sprawdzania poprawności do pola w Drupal 8. Oto przykład.
W poniższym przykładzie będę pracował z węzłem typu
podcast
, który ma pole pojedynczej wartościfield_podcast_duration
. Wartość tego pola musi być sformatowana jako GG: MM: SS (godziny, minuty i sekundy).Aby utworzyć ograniczenie, należy dodać dwie klasy. Pierwszy to definicja ograniczenia, a drugi to walidator ograniczenia. Oba są wtyczkami w przestrzeni nazw
Drupal\[MODULENAME]\Plugin\Validation\Constraint
.Po pierwsze, definicja ograniczenia. Zauważ, że identyfikator wtyczki jest podany jako „PodcastDuration” w adnotacji (komentarzu) klasy. Zostanie to wykorzystane w dalszej części.
Następnie musimy podać moduł sprawdzania poprawności ograniczeń. Ta nazwa tej klasy będzie nazwą klasy z góry, z
Validator
dołączonym do niej:Wreszcie, musimy powiedzieć Drupal do korzystania z naszego ograniczenia w
field_podcast_duration
sprawiepodcast
rodzaju węzła. Robimy to whook_entity_bundle_field_info_alter()
:źródło
$item = $items->first();
zaznaczyłeś i zwróciłeś NULL, jeśli nic tam nie ma, inaczej wystąpi błąd krytyczny podczas edycji pola: TypeError: Argument 2 przekazany do Drupal \ Component \ Utility \ NestedArray :: getValue () musi być tablicy typów, podana null, wywołana w /data/app/core/lib/Drupal/Core/Field/WidgetBase.php w linii 407 w Drupal \ Component \ Utility \ NestedArray :: getValue () (linia 69 rdzenia / lib / Drupal / Component /Utility/NestedArray.php).Prawidłowym sposobem na to dla jednostki treści takiej jak węzeł jest zarejestrowanie jej jako ograniczenia.
Widzisz
forum_entity_bundle_field_info_alter()
i odpowiadające?ForumLeaf
ograniczenie sprawdzania poprawności (należy pamiętać, że potrzebne są dwie klasy).Na początku jest to nieco bardziej skomplikowane, ale zaletą jest to, że jest zintegrowane z interfejsem API do sprawdzania poprawności, dzięki czemu sprawdzanie poprawności nie ogranicza się do systemu formularzy, ale może na przykład także współpracować z węzłami przesłanymi za pośrednictwem interfejsu API REST.
źródło
hook_entity_bundle_field_info_alter()
(jak opisano tutaj ), ale nigdy nie działała ... Wygląda na to, że istnieje udokumentowany problem z tym hakiem: drupal.org/node/2346347 .Chcę dodać nieco więcej światła na ten temat. Dodanie sprawdzania poprawności jest dokładnie takie samo jak poprzednio: w hook_form_alter:
Użycie obiektu wartości wewnątrz $ form_state w funkcji sprawdzania poprawności jest nieco inne. na przykład:
Więc nie z bezpośrednim dostępem do obiektu zmiennych prywatnych, ale raczej z funkcją gettera.
Aby uzyskać więcej informacji, możesz zobaczyć pełny przykład w moim github: https://github.com/flesheater/drupal8_modules_experiments/blob/master/webham_formvalidation/webham_formvalidation.module
Twoje zdrowie!
źródło
Jest bardzo podobny do tego w D7. Kompletny przykład:
mymodule.module :
źródło
hook_form_FORM_ID_alter
identyfikator formularza. Możesz mieć niestandardową funkcję sprawdzania poprawności dowolną. Należy również postępować zgodnie z instrukcją API tutaj, aby uzyskać odpowiednie parametry.W uzupełnieniu tych dobrych odpowiedzi dodałbym:
To jak wywołać metodę klasy odległej w celu sprawdzenia poprawności formularza. Myślę, że lepiej jest wywołać powyższą funkcję w pliku modułu, tak jak w podanym przykładzie.
źródło
możesz użyć modułu weryfikacji klienta . Kilka dodatkowych szczegółów na ten temat (ze strony projektu):
źródło