验证器取决于提交按钮和属性值
Validator depends on Submit button and on attribute value
我的提交表单有问题。
我有个人约束,这取决于我实体的属性值(属性不在我的表单中)。
当我点击特定的提交按钮时必须设置该值(我有多个提交按钮)。
我的问题是我的验证器没有被应用。
示例:
实体:
/**
* @MyPersonnalConstraint()
*/
class Test
{
private $id;
private $text;
private $text2;
private $state;
}
表格类型
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)
,因为我的表单未提交,如果单击 'Submit2',布尔 'clicked' 值始终为 false。
和
在我的控制器中,在 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
}
谢谢你的灯!
最好将模板逻辑(按钮点击)和应用程序一分开。您应该将 state
隐藏字段添加到表单并监听 javascript 订阅者的按钮点击,以根据按下的按钮设置 state
字段值。
我通过不同的方式解决了我的问题:
实体
/**
* @MyPersonnalConstraint(groups={'mygroup'}) <--- Add Validation group
*/
class Test
{
private $id;
private $text;
private $text2;
private $state;
}
表格类型
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");
}
}
我的提交表单有问题。 我有个人约束,这取决于我实体的属性值(属性不在我的表单中)。 当我点击特定的提交按钮时必须设置该值(我有多个提交按钮)。
我的问题是我的验证器没有被应用。
示例:
实体:
/**
* @MyPersonnalConstraint()
*/
class Test
{
private $id;
private $text;
private $text2;
private $state;
}
表格类型
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)
,因为我的表单未提交,如果单击 'Submit2',布尔 'clicked' 值始终为 false。
和
在我的控制器中,在 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
}
谢谢你的灯!
最好将模板逻辑(按钮点击)和应用程序一分开。您应该将 state
隐藏字段添加到表单并监听 javascript 订阅者的按钮点击,以根据按下的按钮设置 state
字段值。
我通过不同的方式解决了我的问题:
实体
/**
* @MyPersonnalConstraint(groups={'mygroup'}) <--- Add Validation group
*/
class Test
{
private $id;
private $text;
private $text2;
private $state;
}
表格类型
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");
}
}