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?

+3


source to share


2 answers


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

+3


source


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');
        },
    ));
}

      

0


source







All Articles