我正在使用Form Classes在我的项目中构建各种表单。
在实体类型文件中,对于buildForm函数,有一个辅助参数“array $ options”(这在Symfony 2官方文档中显示,但从未提及过!)
我已将数组输入到我的控制器中的createForm函数中,但现在我完全不知道如何检索存储的值?
$form = $this->createForm(new ProductType(array(), array('id' => '2')), $product);
我找到的关于获取选项的唯一方法是使用getOption()函数,但在Symfony 2中不存在(我发现的帖子是2010年)。
我尝试使用:
$id = $options['id'];
但是当我尝试在任何地方使用$ id时,我收到错误:
注意:未定义索引:id
是什么给出了?
如何从$ options数组中检索我的值?我甚至在第一时间正确设置它们吗?
编辑 - 更多代码:
表格类
<?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';
}
}
答案 0 :(得分:17)
我认为你首先没有正确设置它们。你应该把它们作为createForm()
编辑:以下是表单类的外观:
<?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';
}
}
答案 1 :(得分:8)
让我告诉你什么对我有用
在控制器中:
$form = $this->createForm(new UsersType(), $entity, array(
'attr' => array('locationId' => $currentLocationId)));
在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
},
));
答案 2 :(得分:7)
显然它不再是getDefaultOptions()
,而是setDefaultOptions()
。
否则就说
选项“my_custom_option”不存在。已知选项包括:“action”,“attr”,“auto_initialize”,...
所以,对我来说,我必须像这样更新setDefaultOptions:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array('my_custom_option' => false));
// Others if needed, like in the documentation for : 'data_class' => 'VENDOR\Bundle\Entity\MyEntity', 'csrf_protection' => true
}
然后您可以使用buildForm
方法
public function buildForm(FormBuilderInterface $builder, array $options)
{
$myCustomOption = $options['my_custom_option'];
}
答案 3 :(得分:5)
根据这个Google Groups
“greg0ire”是对的,事实上我已经尝试过并且完美无缺!!!你说“我真的不想去”黑客攻击“任何核心结构”但你最终没有使用最好的方法......事实上,从我的观点来看,你最终做的不是你没有想做。
所以最后你应该这样做:
在formType
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', $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
);
}
在控制器中
$form = $this->createForm(new ProductType(), $product, array('id' => $id ));
答案 4 :(得分:1)
通过表单类__construct
方法传递选项,如下所示:
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
class ProductType extends AbstractType
{
private $options = array();
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', $this->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'
);
}
public function getName()
{
return 'demo_demobundle_product_type';
}
public function __construct(array $options)
{
$this->options = $options;
}
}
然后你可以这样做:
new ProductType(array('id'=>1));
答案 5 :(得分:1)
嗯,事实证明,Gregoires的答案非常接近,但在尝试将变量放入createQueryBuilder函数时给了我和“Undefined variable”错误。
我花了一段时间试图找出原因并发现问题。您必须在“query_builder”选项中为函数添加一个额外的参数,如:
'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');
},
神奇的设置是“使用($ options)”。这允许您在查询生成器中成功使用$ options ['id']。