Question

I am searching for an easy way to add a bundle of fields to each form.

I have found a way to extend the AbstractType and use the buildForm method to add more fields.
When creating the form I give the name of my new type (How to Create a Custom Form Field Type).

In my opinion it is an easy way, but it is restricted to one type per form.

Is there a better way to achieve anything like that?
I have read the cookbook of symfony, but I have only found stuff how to extend an existing form not how to create an own form "template" with my fields.

Was it helpful?

Solution

Have you tried using inheritance?

This is really simple, first you have to define a form type:

# file: Your\Bundle\Form\BaseType.php
<?php

namespace Your\Bundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class BaseType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', 'text');

        $builder->add('add', 'submit');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Your\Bundle\Entity\YourEntity',
        ));
    }

    public function getName()
    {
        return 'base';
    }
}

Then you can extend this form type:

# file: Your\Bundle\Form\ExtendType.php
<?php

namespace Your\Bundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class ExtendType extends BaseType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        # you can also remove an element from the parent form type
        # $builder->remove('some_field');

        $builder->add('number', 'integer');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Your\Bundle\Entity\YourEntity',
        ));
    }

    public function getName()
    {
        return 'extend';
    }
}

The BaseType will display a name field and an add submit button. The ExtendType will display a name field, an add submit button and a number field.

OTHER TIPS

You can do this with the getParent() function.

<?php

namespace Your\Bundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;


class ChildType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // $builder->remove('field');
        // $builder->add('field);
    }

    public function getParent()
    {
        return ParentType::class;
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top