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.
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.
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;
}
}
来源:https://stackoverflow.com/questions/22414166/inherit-form-or-add-type-to-each-form