How do I validate a conditional form that is based on user data submitted in symfony2?
This is my Setting object form,
class SettingType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('key')
->add('values', 'collection', array(
'allow_add' => true,
'allow_delete' => true,
))
->add('parent')
->add('settingCategory')
->add('user')
->add('settingOption')
;
$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
$setting = $event->getData();
if ($parent = $setting->getParent()) {
$setting->setKey($parent->getKey());
$setting->setSettingCategory($parent->getSettingCategory());
$event->setData($setting);
}
});
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\SettingBundle\Entity\Setting',
'csrf_protection' => false
));
}
/**
* @return string
*/
public function getName()
{
return 'setting';
}
}
I am submitting form data using a REST POST request. for example to configure the default application,
{
"setting" :
{
"key": "setting1",
"values": ["setting1va1", "setting1va2"],
"settingCategory": 1
}
}
Now, to override this setting for the user, select a different value
{
"setting" :
{
"values": ["setting1va1"],
"user":44319,
"parent": 1
}
}
so here, as you can see in the form, if the parent is set, the key and settingCategory is inherited from the parent of the setting.
I want "key" and "settingCategory" to be required (NotBlank) if parent is NULL, but if parent is set then "key" and "setting category" are optional.
How do I do this in symfony?
source to share
I suggest you use a callback validator
As an example, in an entity class:
<?php
use Symfony\Component\Validator\Constraints as Assert;
/**
* @Assert\Callback(methods={"validateParent"})
*/
class Setting {
public function validateParent(ExecutionContextInterface $context)
{
if (
$this->getParent() // NOT NULL
&&
( // ONE OF THIS IS BLANK
($parent->getSettingCategory() && trim($parent->getSettingCategory()==''))
||
($parent->getKey() && trim($parent->getKey()==''))
)
)
{
$context->addViolation('mandatory params');
}
}
}
Otherwise, you can create your own validator as described here .
Let me know if you need more information.
Hope for this help
source to share
docs provide you with everything you need, including the code. In your type, you can do something like:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => function(FormInterface $form) {
$data = $form->getData();
if (Client::TYPE_PERSON == $data->getType()) {
return array('person');
}
return array('company');
},
));
}
source to share