3
votes

This is my Setting entity 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 REST POST request. e.g. for default application setting,

{
    "setting" : 
    {
        "key": "setting1", 
        "values": ["setting1va1", "setting1va2"],
        "settingCategory": 1
    }
}

Now to overrides this setting for user to choose different value

{
    "setting" : 
    {
        "values": ["setting1va1"],
        "user":44319,
        "parent": 1
    }
}

so here as you can see in form, if parent is set, key and settingCategory is inherited from parent setting object.

I want 'key' and 'settingCategory' required (NotBlank) if parent is NULL but if parent is set, then 'key' and 'settingCategory' are not required fields.

How to do this in symfony ?

2

2 Answers

3
votes

I suggest you to use a callback validator

As Example, in your 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 build your own custom validator as described here.

Let me know you need more info.

Hope this help

0
votes

The docs provide everythig you need, including 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');
        },
    ));
}