支払い方法と配送先住所で住所書式を作成しようとしています。配送先住所のチェックボックスがオンになっている場合、その住所にあるフォームの検証がスキップされます。チェックボックスがチェックされている場合、フォームタイプの検証をオフにします。
以下のフォームタイプをトグルオプションで作成しました。このオプションは、チェックボックスを表示して処理しますが、チェックしてもフォームは引き続き有効です。
symfonyはdocumentation on how to implement such a formです。私はほぼ同じコードを持っていますが、チェックしても検証はオフになりません。検証グループを使用していないので、デフォルトグループを無効にしてエンティティの検証を無効にするだけです。 (NotBlank
とCallback
ような特定のフィールドに注釈制約を有する)Address
クラスのフォームを構築
AddressType
。私は今、数時間のために、この乗り越えてきたが、私は検証はオフ、およびIされていない理由を推測することはできませんよ
$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();
:私はこのようなタイプを使用
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"]);
}
}
この小さな詳細については、フォームを立ち上げても構いません。
AddressType
の検証がconfigureOptionsのクロージャによってオフにされないのはなぜですか?これがうまくいかない場合は、妥当な方法でバリデーションを部分的に無効にするより良い解決策はありますか?
EDIT:デフォルトでは、"validation_groups" => false
を設定しても、ビルダーで作成された子でも、フォームの使用でも、引き続き検証が行われます。それは閉鎖とは関係ありません。 symfonyの独自のリソースを含むすべてのオンラインリソースは、[...]それはしかし...
詳細な回答ありがとうございます。私は既にすべての制約にグループを追加しようとしましたが、デフォルトではvalidation_groupsクロージャからそれらのグループを戻していました。私にとって欠けていたのは、Valid制約でした。追加されたフィールドがAddressTypeの子になり、したがって制約が必要であるということは私には起こりませんでした。 – Villermen