我使用 Symfony 5.3。我有一個包含 3 個未映射到任何物體的欄位的表單:
- “原因” - 文本,
- “use_predefined” - 復選框
- “predefined_reason” - 下拉選單。
我構建了這樣的表單(一個片段):
...
public function build(FormBuilderInterface $builder)
{
$builder->add('reason', TextareaType::class, [
'label' => 'Reason',
'required' => true,
'mapped' => false,
]);
$builder->add('use_predefined',
CheckboxType::class, [
'label' => 'Use predefined reason',
'required' => false,
'mapped' => false,
]);
$builder->add(
'predefined_reason',
ChoiceType::class,
[
'choices' => [
'option 1' => 1,
'option 2' => 2,
'option 3' => 3,
'option 4' => 4,
],
'expanded' => false,
'mapped' => false,
'label' => 'some label',
'required' => false,
]
);
}
...
“原因”欄位應根據需要顯示在 UI 中,但其他兩個不應顯示。但是,在驗證程序中,如果復選框“predefined_reason”被選中,第一個欄位不應該是必需的,而“predefined_reason” - 應該是。
uj5u.com熱心網友回復:
您應該能夠使用Expression來斷言您的屬性是否有效。
/**
* @Assert\Expression(
* "(this.getUsePredefined() == true) or (this.getUsePredefined() == false and this.getReason() != null)",
* message="UsePredefined is not checked so reason is required"
* )
*/
protected $reason;
protected $use_predefined;
/**
* @Assert\Expression(
* "(this.getUsePredefined() == true and this.getPredefinedReason() != null) or (this.getUsePredefined() == false)",
* message="Error message"
* )
*/
protected $predefined_reason;
不要忘記編輯您的表單并在不必要時洗掉必填欄位,因為它們將在表單驗證中得到驗證。
如果你想要更動態的東西,你可能不得不使用 javascript。
您還可以創建自定義約束來執行類似的操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/385429.html
