使用Symfony 2.1.3-dev和条令2.3
我正在尝试构建一个表单,为用户提供多个选项来筛选返回的数据集(
Entity\EngineCodes
)。表单由1个文本输入字段组成(
id
)和3个选择字段(
module
,
type
,
status
)。我正在尝试使用Symfony2
entity
form_type从
EngineCodes
实体
因为我想使用任意3个选择字段的组合来筛选表。基于2.1文档,我决定创建一个FormType(
EngineCodesFilterType
)并将其中三个表单字段设置为
实体
键入
query_builder
语句为每个字段返回一组唯一的值。
不幸的是,我收到了以下错误,我不确定为什么它返回的是数组而不是对象。
The form's view data is expected to be an instance of class
Vendor\IndexBundle\Entity\EngineCodes, but is a(n) array.
You can avoid this error by setting the "data_class" option
to null or by adding a view transformer that transforms a(n)
array to an instance of Vendor\IndexBundle\Entity\EngineCodes.
如果我设置
data_class
到
null
,我收到此错误:
A "__toString()" method was not found on the objects of type
"Vendor\IndexBundle\Entity\EngineCodes" passed to the choice
field. To read a custom getter instead, set the option
"property" to the desired property path.
由于我仍在学习Symfony2的这些功能,我的目标是尽可能在结构和格式方面与2.1文档相匹配。
以下是控制器中的功能:
public function displayAction() {
// ...
$entity = $this->getDoctrine()->getEntityManager()
->getRepository('VendorIndexBundle:EngineCodes')
->findAll();
// ...
$form = $this->createForm(new EngineCodesFilterType(), $entity);
// ...
return $this->render(
'VendorIndexBundle::layout.html.twig',
array(
'entity' => $entity,
'form' => $form->createView(),));
以下是表单类型:
class EngineCodesFilterType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(
'id',
'integer',
array(
'label' => 'Code ID',));
$builder->add(
'status',
'entity',
array(
'label' => 'Code Status',
'class' => 'VendorIndexBundle:EngineCodes',
'query_builder' => function(EntityRepository $er)
{
return $er->createQueryBuilder('u')
->select('u.status')
->add('groupBy', 'u.status');
},
'multiple' => true,));
$builder->add(
'type',
'entity',
array(
'label' => 'Code Type',
'class' => 'VendorIndexBundle:EngineCodes',
'query_builder' => function(EntityRepository $er)
{
return $er->createQueryBuilder('u')
->select('u.type')
->add('groupBy' ,'u.type');
},
'multiple' => true,));
$builder->add(
'module',
'entity',
array(
'label' => 'Code Module',
'class' => 'VendorIndexBundle:EngineCodes',
'query_builder' => function(EntityRepository $er)
{
return $er->createQueryBuilder('u')
->select('u.module')
->add('groupBy', 'u.module');
},
'multiple' => true,));
}
public function getName()
{
return 'EngineCodesFilter';
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(
array(
'data_class' => 'Vendor\IndexBundle\Entity\EngineCodes',
/*'data_class' => null,*/
'validation_groups' => 'filter',));
}
}
这是
Vendor\Entity\EngineCodes
类别:
/**
* Vendor\IndexBundle\Entity\EngineCodes
*
* @ORM\Table(name="engine_codes")
* @ORM\Entity(repositoryClass="Vendor\IndexBundle\Entity\EngineCodesRepository")
* @UniqueEntity(fields="id", message="ID already in use! Enter a unique ID for the code.")
*/
class EngineCodes
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer", nullable=false, unique=true)
* @ORM\Id
* @Assert\NotBlank(message="ID cannot be blank!")
* @Assert\Regex(pattern="/^\d+$/", match=true, message="ID must be an integer!")
* @Assert\MinLength(limit=8, message="ID must be 8 numbers in length!")
* @Assert\MaxLength(limit=8, message="ID must be 8 numbers in length!")
*/
private $id;
/**
* @var string $token
*
* @ORM\Column(name="token", type="string", length=255, nullable=false, unique=true)
*/
private $token;
/**
* @var boolean $status
*
* @ORM\Column(name="status", type="integer", nullable=false)
* @Assert\NotBlank(message="Status cannot be blank!")
*/
private $status;
/**
* @var string $module
*
* @ORM\Column(name="module", type="string", length=255, nullable=false)
* @Assert\NotBlank(message="Module cannot be blank!")
*/
private $module;
/**
* @var string $submodule
*
* @ORM\Column(name="submodule", type="string", length=255, nullable=false)
* @Assert\NotBlank(message="Submodule cannot be blank!")
*/
private $submodule;
/**
* @var string $type
*
* @ORM\Column(name="type", type="string", length=255, nullable=false)
* @Assert\NotBlank(message="Type cannot be blank!")
*/
private $type;
/**
* @var string $description
*
* @ORM\Column(name="description", type="text", nullable=false)
* @Assert\NotBlank(message="Description cannot be blank!")
*/
private $description;
/**
* @var string $title
*
* @ORM\Column(name="title", type="string", length=255, nullable=false)
* @Assert\NotBlank(message="Title cannot be blank!")
*/
private $title;
/**
* @var string $definition
*
* @ORM\Column(name="definition", type="text", nullable=true)
*/
private $definition;
/**
* @var string $color
*
* @ORM\Column(name="color", type="string", length=10, nullable=true)
*/
private $color;
/**
* @var \DateTime $createTimestamp
*
* @ORM\Column(name="create_timestamp", type="datetime", nullable=false)
*/
private $createTimestamp;
/**
* @var Accounts
*
* @ORM\ManyToOne(targetEntity="Accounts")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="create_account_fk", referencedColumnName="id")
* })
*/
private $createAccountFk;
// getters and setters ...
/**
* Set createAccountFk
*
* @param Vendor\IndexBundle\Entity\Accounts $createAccountFk
* @return EngineCodes
*/
public function setCreateAccountFk(\Vendor\IndexBundle\Entity\Accounts $createAccountFk = null)
{
$this->createAccountFk = $createAccountFk;
return $this;
}
/**
* @ORM\PrePersist
*/
public function setCreateTimestampValue()
{
$this->createTimestamp = new \DateTime();
}
}