我正在尝试将一个额外的选项传递给Symfony 2.6.1中的表单类型,如下所示(FabricanteForm.php
):
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('nombre', 'text')
->add('direccion', 'textarea')
->add('telefono', 'text', array(
'required' => TRUE,
'trim' => TRUE,
))
->add('fax', 'text', array(
'required' => FALSE,
))
->add('correo', 'email', array(
'required' => FALSE,
));
if ($options['isFabricante'] !== null)
{
$builder->add('pais', 'text');
}
else
{
$builder->add('pais', 'entity', array(
'class' => 'AppBundle:Pais',
'property' => 'nombre',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('qb')
->where('qb.activo = :activoValue')
->setParameter('activoValue', true);
},
'mapped' => FALSE,
'expanded' => FALSE,
'multiple' => TRUE,
));
}
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setOptional(array(
'isFabricante',
));
$resolver->setDefaults(array(
'data_class' => 'Sencamer\AppBundle\Entity\FabricanteDistribuidor',
'intention' => 'fabricante',
'isFabricante' => null
));
}
然后我在控制器上创建表单如下:
$entityPais = new Entity\Pais();
$formPaisesDistribuidor = $this->createForm(new Form\PaisesForm(), $entityPais, array('isFabricante' => null));
$formPaisesFabricante = $this->createForm(new Form\PaisesForm(), $entityPais, array('isFabricante' => true));
但我收到了这个错误:
The option "isFabricante" does not exist. Known options are: "action", "allow_extra_fields", "attr", "auto_initialize", "block_name", "by_reference", "cascade_validation", "compound", "constraints", "csrf_field_name", "csrf_message", "csrf_protection", "csrf_provider", "csrf_token_id", "csrf_token_manager", "data", "data_class", "disabled", "empty_data", "error_bubbling", "error_mapping", "extra_fields_message", "inherit_data", "intention", "invalid_message", "invalid_message_parameters", "label", "label_attr", "label_format", "mapped", "max_length", "method", "pattern", "post_max_size_message", "property_path", "read_only", "required", "translation_domain", "trim", "validation_groups", "virtual".
这是在表单类型上设置额外参数的正确方法吗?这是重用表单的最佳方法吗? (您可能会注意到$formPaisesDistribuidor
和$formPaisesFabricante
之间的唯一区别是pais
字段类型,第一个是实体,第二个只是文本
有任何帮助吗?建议?
答案 0 :(得分:2)
引用Turdaliev的观点 $ options 没有用于他想要的东西 - 我不同意,你绝对可以使用它。 Symfony的文档显示了两种方式。
这是一个将实体管理器传递给options数组的Symfony示例:
http://symfony.com/doc/current/cookbook/form/data_transformers.html#using-the-transformer
这是另一个将选择传递给构造函数的Symfony示例:
查看Symfony Forms Best Practices,他们不会告诉您哪种方法更受欢迎,因此您可以自行决定。
我喜欢将$options
数组用于简单的布尔标志...因为它们是选项。另外,如果你有几个字段,其中一些是可选的,一些是必需的,你不必乱用构造函数参数排序。
至于你收到错误的原因,我并不完全确定。在Symfony 2.6中,setOptional()
现在是setDefined()
。您仍然可以使用旧函数,但它已弃用,将在3.0中删除。此外,如果您只传递一个选项,则不再需要传递数组。您也不必在setDefaultOptions()
试试这个:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefined('isFabricante');
$resolver->setDefaults(array(
'data_class' => 'Sencamer\AppBundle\Entity\FabricanteDistribuidor',
'intention' => 'fabricante',
));
}
答案 1 :(得分:1)
从异常中可以看出,$ options参数不用于您正在使用的内容。因此,您可以为FabricanteForm类创建自定义构造函数,而不是将自定义选项传递给Symfony的标准$ options参数。以下是如何完成所有这些事情的演示:
<强> PraisesType 强>
namespace School\CoreBundle\Form\Type;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class PraisesType extends AbstractType
{
private $options;
public function __construct($options)
{
$this->options = $options;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('nombre', 'text')
->add('direccion', 'textarea')
->add('telefono', 'text', array(
'required' => TRUE,
'trim' => TRUE,
))
->add('fax', 'text', array(
'required' => FALSE,
))
->add('correo', 'email', array(
'required' => FALSE,
));
if ($this->options['isFabricante'] !== null)
{
$builder->add('pais', 'text');
}
else
{
$builder->add('pais', 'entity', array(
'class' => 'AppBundle:Pais',
'property' => 'nombre',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('qb')
->where('qb.activo = :activoValue')
->setParameter('activoValue', true);
},
'mapped' => FALSE,
'expanded' => FALSE,
'multiple' => TRUE,
));
}
}
public function getName()
{
return 'praises';
}
}
<强>用法强>
$entityPais = new Entity\Pais();
$formPaisesDistribuidor = $this->createForm(new Form\PaisesType(array('isFabricante' => null)), $entityPais);
$formPaisesFabricante = $this->createForm(new Form\PaisesType(array('isFabricante' => true)), $entityPais);