Php 带有Symfony的可空自定义表单实体
我的应用程序管理家庭。一个家庭由1名或N名成员组成 我希望能够添加一个或两个家长以及0个或N个孩子。孩子部分很好,但我很难与一两位家长打交道 这是我的家庭表单类型:Php 带有Symfony的可空自定义表单实体,php,forms,symfony,Php,Forms,Symfony,我的应用程序管理家庭。一个家庭由1名或N名成员组成 我希望能够添加一个或两个家长以及0个或N个孩子。孩子部分很好,但我很难与一两位家长打交道 这是我的家庭表单类型: $builder ... many attributes ->add('parent1', MemberType::class) ->add('parent2', MemberType::class) 家长和家长2是一对一协会(家庭对成员)。成员表单类型: $buil
$builder
... many attributes
->add('parent1', MemberType::class)
->add('parent2', MemberType::class)
家长和家长2是一对一协会(家庭对成员)。成员表单类型:
$builder
->add('firstName', TextType::class, [
'label' => 'Prénom',
'constraints' => array(
new NotBlank(),
new Length(array('max' => 150))
)
])
... many other attributes with choices or not
我想到了一个复选框,如果未选中,它会灰显父2的字段,但成员值都是必需的。因为SF2不能验证我的表单
如果我将required=>false设置为这些字段(在构建器中),那么用户将有可能在不填充所有内容的情况下进行验证(我不希望这样)
我想创建以下流程:
- 要么填写member2的所有字段以验证表单
- 或者我们选中一个复选框(单亲)并且不需要任何字段,我的最终成员2将为空(或者另一个解决方案)
删除=true
选项
/**
* @ORM\OneToOne(targetEntity="AppBundle\Entity\Member", orphanRemoval=true, cascade={"persist", "remove"})
* @ORM\JoinColumn(name="parent2_id", referencedColumnName="id",nullable=true)
*/
private $parent2;
第二步
在表单中添加一个新字段,即“未映射”复选框
$builder
->add('parent1', MemberType::class)
->add('withParent2', CheckboxType::class, [
'mapped' => false,
'required' => false,
'data' => true
])
->add('parent2', MemberType::class, [
'required' => false
])
如果未选中此复选框,我们将使用此复选框将parent2设置为null
在此旁边,添加事件侦听器:
//this event will set whether or not the checkbox should be checked
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$form = $event->getForm();
$family = $event->getData();
if ($family->getId()) {
$form->add('withParent2', CheckboxType::class, [
'mapped' => false,
'required' => false,
'data' => $family->getParent2() ? true : false
]);
}
});
//Event when the form is submitted, before database update
$builder->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event) {
//if the checkbox was not checked, it means that there was not a second parent
$withParent2 = $event->getForm()->get('withParent2')->getData();
if (!$withParent2) {
// we set this attribute to null, and disable the form validation
$event->getData()->setParent2(null);
$event->stopPropagation();
}
}, 900);
第三步
我们的表单以这种方式运行良好,剩下的唯一问题是javascript验证
只需执行一个jquery函数,从字段中删除所需的属性
function toggleParent2Requirement(checked){
if (!checked) {
$("[id^=family_parent2]").prop("required", false);
$("[id^=family_parent2]").attr('disabled', true);
}
else {
$("[id^=family_parent2]").prop("required", true);
$("[id^=family_parent2]").attr('disabled', false);
}
}
在这里,您可以选择一个oneToOne关系。我唯一不自豪的部分是stopPropagation
部分。这在文档中,我不知道我们是否只能以更干净的方式禁用此字段的验证