Próbuję utworzyć formularz adresu z adresem płatności i wysyłki. Po zaznaczeniu pola wyboru na adres wysyłki chcę pominąć walidację formularza na tym adresie.Wyłącz sprawdzanie poprawności dla typu formularza, jeśli pole wyboru jest zaznaczone w Symfony
Utworzono poniższy typ formularza z opcją przełączania, która wyświetli pole wyboru i zajmie się nim, ale formularz jest nadal sprawdzany, nawet jeśli jest zaznaczony.
Symfony ma documentation on how to implement such a form, i mimo że prawie mam dokładnie ten sam kod, sprawdzanie poprawności nie jest wyłączane. Nie używam grup sprawdzania poprawności, więc po prostu wyłączam domyślną grupę, aby wyłączyć sprawdzanie poprawności w encji.
AddressType
buduje formę dla klasy Address
(która ma ograniczenia adnotacji w pewnych dziedzinach, takich jak NotBlank
i Callback
).
class AddressType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
if ($options["toggle"]) {
$builder->add("toggle", CheckboxType::class, [
"mapped" => false,
"required" => false,
"label" => $options["toggle"]
]);
}
$builder
->add("name", TextType::class, [
"required" => !$options["toggle"]
])
->add("address", TextType::class, [
"required" => !$options["toggle"]
])
->add("zipcode", TextType::class, [
"label" => "Postcode",
"required" => !$options["toggle"]
])
->add("city", TextType::class, [
"required" => !$options["toggle"]
])
->add("countryCode", ChoiceType::class, [
"choices" => Address::COUNTRY_CODES
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
"toggle" => false,
"data_class" => Address::class,
"validation_groups" => function(FormInterface $form) {
if ($form->has("toggle") && $form->get("toggle")->getData() === true) {
return [];
}
return ["Default"];
}
]);
$resolver->setAllowedTypes("toggle", ["bool", "string"]);
}
}
używam rodzaj takiego:
$addressForm = $this
->createFormBuilder([
"paymentAddress" => $paymentAddress,
"shippingAddress" => $shippingAddress
])
->add("paymentAddress", AddressType::class, [
"label" => false
])
->add("shippingAddress", AddressType::class, [
"label" => false,
"toggle" => "Use payment address"
])
->add("submit", SubmitType::class, [
])
->getForm();
Przyjeżdżam nad tym przez kilka godzin, ale teraz nie jestem w stanie wydedukować dlaczego walidacja nie jest wyłączony, a ja nie chcę zgniatać formy nad tym małym szczegółem.
Dlaczego sprawdzanie poprawności dla AddressType
nie jest wyłączone przez zamknięcie w configureOptions? Jeśli po prostu nie jest tak, jak to działa, jakie byłoby lepsze rozwiązanie w przypadku częściowego wyłączenia walidacji w uporządkowany sposób?
EDYCJA: Nawet jeśli ustawienie "validation_groups" => false
w ustawieniach domyślnych, dzieci utworzone w programie budującym lub w użyciu formularza, sprawdzanie poprawności będzie nadal. To nie ma nic wspólnego z zamknięciem. Każdy zasób online, w tym własny zasób Symfony, oświadcza, że powinien działać ...
Dziękujemy za szczegółową odpowiedź. Próbowałem już dodawać grupy do wszystkich ograniczeń i domyślnie zwracać te grupy z zamykania validation_groups. To, czego mi brakowało, było obowiązującym ograniczeniem. Nie przyszło mi do głowy, że dodane pola staną się dziećmi typu AddressType i dlatego będą wymagały ograniczenia. – Villermen