I am using Form Classes to build the various form in my project.
In the Entity Type file, for the buildForm function, there is a secondary parameter of "array $options" (this is shown in the official Symfony 2 Documentation, but never mentioned, ever!)
I have fed an array into the createForm function in my controller but now I am totally stumped on how to retrieve the stored values?
$form = $this->createForm(new ProductType(array(), array('id' => '2')), $product);
The only thing I have found about getting the options is using the getOption() function, but that doesn't exist in Symfony 2 (the post I found was from 2010).
I tried using:
$id = $options['id'];
But when I try to use $id anywhere, I get the error:
Notice: Undefined index: id
What gives?
How do I retrieve my values from the $options array? Am I even setting them correctly in the first place?
EDIT - More code:
Form Class
<?php
namespace DEMO\DemoBundle\Form\Product;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
class ProductType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('name')
->add('slug')
->add('reference')
->add('description')
->add('active_from')
->add('active_till')
->add('is_active')
->add('category', 'entity', array(
'class' => 'DEMO\DemoBundle\Entity\Product\ProductCategory',
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('u')
->where('u.section = :id')
->setParameter('id', ***ID VARIABLE NEEDS TO GO HERE***)
->orderBy('u.root', 'ASC')
->addOrderBy('u.lft', 'ASC');
},
'empty_value' => 'Choose an option',
'property' => 'indentedName',
));
}
public function getDefaultOptions()
{
return array(
'data_class' => 'DEMO\DemoBundle\Entity\Product\Product'
);
}
public function getName()
{
return 'demo_demobundle_product_type';
}
}
I think you're not setting them properly in the first place. You're supposed to give them as third argument to createForm()
EDIT: Here is how your form class could look:
<?php
namespace DEMO\DemoBundle\Form\Product;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
class ProductType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('name')
->add('slug')
->add('reference')
->add('description')
->add('active_from')
->add('active_till')
->add('is_active')
->add('category', 'entity', array(
'class' => 'DEMO\DemoBundle\Entity\Product\ProductCategory',
'query_builder' => function(EntityRepository $er) use($options) {
return $er->createQueryBuilder('u')
->where('u.section = :id')
->setParameter('id', $options['id'])
->orderBy('u.root', 'ASC')
->addOrderBy('u.lft', 'ASC');
},
'empty_value' => 'Choose an option',
'property' => 'indentedName',
));
}
public function getDefaultOptions()
{
return array(
'data_class' => 'DEMO\DemoBundle\Entity\Product\Product',
'id' => null
);
}
public function getName()
{
return 'demo_demobundle_product_type';
}
}
Let me show you what worked for me
In the Controller:
$form = $this->createForm(new UsersType(), $entity, array(
'attr' => array('locationId' => $currentLocationId)));
In the FormType:
->add('location', 'entity', array(
'class' => 'Ro\RoinventBundle\Entity\Locations',
'query_builder' => function (\Doctrine\ORM\EntityRepository $er) use ($options)
{
if (isset($options['attr']['locationId']) && ($options['attr']['locationId'] != NULL))
{
return $er->createQueryBuilder('Locations')
->where('Locations.id = :param')
->setParameter('param', $options['attr']['locationId']);
}
//else do what you want
},
));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With