我的提交表单有问题。 我有个人约束,取决于我的实体属性的值(属性不在我的形式)。 单击特定的提交按钮时,必须设置该值(我有多个提交按钮)。
我的问题是我的验证器没有应用。
示例:
实体:
/**
* @MyPersonnalConstraint()
*/
class Test
{
private $id;
private $text;
private $text2;
private $state;
}
FormType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('text', TextType::class)
->add('text2', TextType::class)
->add('Submit1', SubmitType::class)
->add('Submit2', SubmitType::class);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Test::class,
]);
}
MyPersonnalConstraintValidator
public function validate($value, Constraint $constraint)
{
if ($value->getState("X")) { //<-- "X" is set only if "Submit2" is clicked
if($value->getText2() === null || $value->getText2() === ""){
$this->context->buildViolation($constraint->message)
->atPath('text2')
->addViolation();
}
}
}
当我点击Submit2按钮时,我必须$test->setState("X")
。
我无法使用addEventListener(PRE_SUBMIT)
,因为我的表单未提交且布尔点击了#39;如果点击&#39; Submit2&#39;。
并且
在我的控制器中,在handleRequest($request)
方法后,我可以在我的按钮上抓取isClicked
但是对于提交(setState("X"))
和$form->isValid()
提交的修改表单数据来说太晚了总是如此。
控制器:
$form->handleRequest($request);
if ($form->get('Submit2')->isClicked()) {
$form->getData()->setState("X");
}
if ($form->isSubmitted() && $form->isValid()) {
//Already valid
}
感谢您的灯光!
答案 0 :(得分:0)
将模板逻辑(按钮点击)和应用程序逻辑分开是一种很好的做法。您应该在表单中添加state
隐藏字段,并听取javascript订阅者按下按钮的次数,以根据按下的按钮设置state
字段值。
答案 1 :(得分:0)
我以不同的方式解决了我的问题:
实体
/**
* @MyPersonnalConstraint(groups={'mygroup'}) <--- Add Validation group
*/
class Test
{
private $id;
private $text;
private $text2;
private $state;
}
FormType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('text', TextType::class)
->add('text2', TextType::class)
->add('Submit1', SubmitType::class, array(
'validation_groups' => array('mygroup', 'Default') //<- Add Validation Group
))
->add('Submit2', SubmitType::class);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Test::class,
]);
}
MyPersonnalConstraintValidator
public function validate($value, Constraint $constraint)
{
//Without test on getState
if($value->getText2() === null || $value->getText2() === ""){
$this->context->buildViolation($constraint->message)
->atPath('text2')
->addViolation();
}
}
控制器:
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($form->get('Submit2')->isClicked()) {
$test->setState("X");
}
}